Greetings from Dr. Nemeth to members of the NFB R&d Committee and
friends:
This is a report of the calculator project to date. I have
tried to classify my thoughts into identifiable calculator
issues. Some ideas will be old, othees will be new. At least,
all the ideas will be collected together in one place.
Do not expect a complete calculator or even a complete
calculator plan at this time. Each item that I address will
reflect my current thinking. As each issue ripens to the point
of actual implementation, it will be updated as it develops.
Furthermore, new issues will develop that are not dealt with
here. Please comment on this calculator design. I particularly
would like to ask John Miller to look closely at the section on
graphing and share his thinking with me.
KEYBOARD LAYOUT
There has been some discussion concerning the keyboard
assignments I have made for various calculator functions. In
particular, a preference has been expressed in favor of the
numeric keypad rather than the number row for entering numbers.
As far as possible, I will try to give the user both options.
However: the following observations should be considered:
a. The numeric keypad is used for screen access functions in
most screen-access programs. It functions as a numeric keypad
only when NUMLOCK is on. Using the numeric keypad both for data
entry and for screen access requires toggling NUMLOCK on and off.
b. A four-function calculator is used for data-intensive
applications. In such situations, the operator almost never has
to leave the numeric keypad since all the digits, the decimal
point, the four arithmetic operators, and even the <cr> are all
right there. A scientific calculator is used mostly for
evaluating formulas. While these formulas include some numbers as
components, the operator will have to stray from the numeric
keypad much more often to enter the other calculator functions
that the formula requires. This makes the numeric keypad much
less useful than it is in a four-function calculator. Of course,
the scientific calculator can be used like a four-function
calculator, in which case the numeric keypad will regain its
usefulness.
c. The keyboard layout on a stand-alone scientific
calculator is customized by the manufacturer to implement his
design in the most efficient manner. The layout almost never
resembles a standard 101-key keyboard used in conjunction with a
computer. For me, the keyboard layout is a given; I cannot
change it to accommodate my design.
d. In spite of the rigidity of the keyboard layout with
which I must work, I have tried to make assignjs that are as
mnemonic as possible. Sometimes arbitrary assignments have to be
made, because there is a conflict between two functions both
clamoring for the same assignment.
THE DISPLAY
I plan to display onscreen the interactive dialogue between
the user and the calculator. When the screen fills, each new
line will cause the screen to scroll. Thchs, the user will be
able to view only the last 25 lines of the session. Usually,
this is more than adequate for the user's purpose. In any case,
the user will have the option of logging his entire session with
the calculator or any parts thereof that he chooses. Later, he
can display the log onscreen or send it to a printer, an
embosser, or a refreshable braille device. In addition, the user
will be able to control the display in each of the following
ways:
a. Precision: By entering Ctrl-p <n> <cr>, the user can
control the precision with which calculator results are
displayed. Precision refers to the number of digits displayed to
the right of the decimal point. The user must replace <n> in the
above command by the actual number of digits to be displayed to
the right of the decimal point. The range of n is 0 through 15.
The default value is 15, that is, full precision. All
calculations are performed internally with full precision, but
results are rounded to the number of digits specified by the user
before being displayed. Once the user sets the desired
precision, it remains effective until he resets it or until the
end of the session with the calculator. Upon invoking the
calculator the next time, the default precision is in effect.
b. Fixed-Point Notation: By entering Ctrl-f <cr>, the user
requests the calculator to display its results in fixed-point
notation. In fixed-point notation, the decimal point separates
the integral from the fractional part of the number's actual
value. An integer is an instance of a fixed-point number since
the decimal point, although not explicitly present, is assumed to
occupy the position to the right of the last digit in the
integer. Fixed-point numbers are the kind with which we deal in
our everyday transactions. It is for this reason that
fixed-point notation is the default display mode. The other
display modes are scientific notation and engineering notation
discussed below. If necessary, trailing zeros are appended or
significant digits are discarded to force the number into
compliance with the precision setting. When significant digits
are discarded, the displayed number is rounded, not truncated, to
the required number of digits.
It is possible that the result of a calculation will
overflow the fixed-point upper limit of the calculator without
overflowing the magnitude range of the calculator. For example,
on the old calculator the upper fixed-point limit was the integer
formed from 15 9's. Thus, 17 factorial was within this
fixed-point range and was displayed as a fixed-point number, but
18 fatorial was out of fixed-point range. However, 18 factorial
was well within the magnitude range of the calculator and so its
value was displayed in scienticic notation. In the new
calculator, the same principle will be implemented. If a result
cannot be displayed as a fixed-point number when fixed-point mode
is in effect, it will be displayed in scientific notation. As
soon as the calculator generates a result that can again be
displayed as a fixed-point number, the calculator will revert to
the requested mode of display.
c. Scientific Notation: By entering Ctrl-s <cr>, the user
is requesting the calculator to display its results in scienticic
notation. In scientific notation, a number is expressed as the
product of a precision part and a scale factor. In the
literature on this subject, you will find that many people refer
to the precision part of a scientific number as the mantissa, and
to the scale factor as the exponent. This terminology is
borrowed from the language associated with logarithms, and, in my
view, is an abuse of those terms when applied to a scientific
number in which logarithms play no role.
In a scientific number, the decimal point is always preceded
by exactly one significant (non-zero) digit. If this is
initially not the case, the decimal point is shifted to the
required position and the scale factor is adjusted accordingly.
In the old calculator, the scale factor could range from -306 to
+306. Programming became difficult as numbers approached those
lofty limits because the C language itself balked at handling
such numbers. In the new calculator, I have reduced this range
to -305 to +305 which is still a tremendous magnitude range. It
gives me "head room" within which to work with numbers that are
more stable. I used to enjoy boggling the minds of Dr. Jernigan
and Mr. Maurer (not an easy feat) by telling them that the ratio
of the largest to the smallest number of which this calculator is
capable exceeds by far the ratio of the mass of the entire known
universe to the mass of a single electron. As with fixed-point
numbers, the precision part of a scientific number is displayed
to comply with the precision requirement currently in effect.
d. Engineering Notation: By entering Ctrl-e <cr>, the user
is requesting the calculator to display its results in
engineering notation. Engineering notation is just like
scientific notation, except that the scale factor is required to
be a multiple of 3. This is because the measurements most
commonly used in science and engineering are powers of 1000, or
10 to the third power. Thus, we commonly speak of kilobytes,
megabytes, gigabytes, milliseconds, microseconds, nanoseconds,
etc., and rarely use other prefixes. Thus, kilo translates into
10^3, mega into 10^6, giga into 10^9, milli into 10^-3, micro
into 10^-6, nano into 10^-9, etc.
In engineering notation, more than one significant digit may
be required before the decimal point in order for the scale
factor to be a multiple of 3. As with fixed-point and scientific
numbers, the precision part of an engineering number is displayed
to comply with the precision requirement in effect.
DATA ENTRY
I plan to take advantage of the computer's ability to erase
single characters which were entered in error and replace them
with the characters intended. The backspace, as usual, will
delete the last character entered. Most stand-alone calculators
do not have this ability. I raised this question in a previous
communication, and the consensus seemed to be to take advantage
of the computer's power. I will abide by the consensus unless
Tim tells me to do otherwise.
GRAPHING
In the graphing module, I plan to give the user the option
of whether or not there should be an underlying grid. Such a
grid is useful if the user wishes to estimate the coordinates of
any point on the graph. For the same reason, I plan to give the
user the option of whether or not to include a set of coodinate
axes, so that coordinates will be relative to an origin. Below
is a very rough overview of my approach to the graphing problem:
a. Collect a Set of Data Points: One way of collecting
such a set is for the user to provide it. It must be understood
that each data point is a pair of numbers. The first component
of each pair is the x-value (the abscissa), and the second
component of each pair is the y-value (the ordinate). Sometimes
it is preferable to replace x by t, especially when the data are
time-dependent. The user may enter such a set of data points for
the purpose of producing a scatter diagram (statisticians will
know what I am talking about.) This is useful in getting a rough
visual (in our case tactile) idea of how the data are distributed
in preparation for computing a coefficient of correlation. A set
of data points is also useful in preparing for the calculation of
a line of regression using the method of least squares.
(Statisticians again.) I will not discuss the treatment of data
entered in this way any further in this communication.
Another way to acquire a set of data points is for the
calculator to generate it. This method is most appropriate when
drawing the graph of an equation.
b. Basic Considerations: I will restrict my observations
in this communication to the Braille Blazer. Extending these
observations to a wide-page embosser (capacity 40 cells) is
straightforward. The Braille Blazer handles pages that are 8.5
inches wide and 11 inches long. I will assume that the left,
right, top, and bottom margins are each one-quarter of an inch.
This leaves a braille field 8 inches wide and 10.5 inches long.
The standard dot pitch in the United States is 0.09 inches
between dots in the same cell, whether horizontally or
vertically. Foreign manufacturers of embossing equipment use a
slightly larger pitch, but I will not deal with this variation
here. If we divide the width of the braille field (8 inches) by
the dot pitch (.09 inches per dot), we find that 8/.09 =
88.888.... This gives us approximately 89 dots across the width
of the page. If we also include the dot that occupies the left
edge of the braille field, we have 90 dots across the braille
field. The Braille Blazer indeed has 90 dots across the
graphical portion of its platten (I actually counted them.) I
will now assign numbers to the dot positions, which I will call
columns, across the page. These numbers will range from 0 (at
the left edge of the braille field) to 89 (at the right edge of
the braille field). This accounts for 90 dots. The left edge
corresponds to 0 rather than to 1 for the same reason that the
left end of a ruler is at the 0-inch mark rather than at the
1-inch mark.
Using similar logic, we divide 10.5 (the vertical length of
the braille field) by 0.09 to obtain 116.666.... Thus, there are
about 117 dot positions from the top to the bottom of the braille
field. I will also assign numbers to these dot positions, called
rows, from 0 at the top of the braille field to 116 at the bottom
of the braille field. Because braille cells are 2 dots wide and
3 dots tall, the number of dots across the width of the braille
field must be even (divisible by 2), and the number of dots down
the length of the braille field must be divisible by 3. Since we
have 90 dots across the width of the braille field and 117 dots
down the length of the braille field, these conditions are
satisfied. This numbering scheme is used because of the way in
which embossing proceeds -- row by row from the top to the bottom
of the braille field and, within each row, from the left to the
right of the braille field. Notice that this numbering scheme
differs from the standard mathematical method of assigning
coordinates, in which numbers increase as one proceeds upward.
Furthermore, the coordinates of a dot position will be given by
specifying the row first and the column second. This is the
reverse of the standard mathematical method in which the x
coordinate (column) is given first and the y coordinate (row) is
given second. Thus, (0, 0) are the coordinates of the upper left
corner of the braille field, and (116, 89) are the coordinates of
the lower right corner of the braille field.
c. An Example: With this orientation as background, I will
demonstrate my strategy for producing a graph by means of an
example. Our task is to draw a circle with a radius of 3 inches
which is to be centered on the page both in the left-right and in
the top-bottom dimension. To add a little interest to the
example, I will also include a set of coordinate axes whose
origin will be at the center of the circle. The coordinate axes
will extend the entire distance from the top to the bottom of the
braille field and from the left to the right of the braille
field. Thus, there will be portions of the coordinate axes which
lie outside the circle. Any high school algebra student knows
(or should know) that the mathematical equation of such a circle
is:
x^2+y^2 = 9
where ^ (up arrow) is the exponentiation operator as in BASIC.
Let us first find the coordinates of the center of the
circle. The center of the circle coincides with the center of
the page. Since rows range from 0 at the top to 116 at the
bottom, the row coordinate of the center of the page is the
average of these two numbers, namely, 58. With similar logic,
since columns range from 0 at the left to 89 at the right, the
center should be the average of these numbers, namely, 44.5.
Since a fractional dot position makes no sense, we must choose
the closest integer -- either 44 or 45. I will choose 45 for no
particular reason other than that this is the usual way of
rounding 44.5 to an integer.
Our next task is to determine the braille field within which
the circle will lie. The circle can be imagined as being boxed
within a rectangle whose edges lie 3 inches to the left, to the
right, above, and below the center of the circle. We will not,
of course, draw such a box. But we will calculate where those
edges would be if we did draw such a box. If we divide 3
inches by 0.09 dots per inch, we find that there are 33.333...
dots in 3 inches. To make sure that no part of our circle is
excluded, we will use a more generous number of 34 dots. Thus,
the upper edge of our imaginary box would lie on row 58-34 = 24,
the bottom edge would lie on row 58+34 = 92, the left edge would
lie on column 45-34 = 11, and the right edge would lie on column
45+34 = 79. To verify that our circle will be centered, we
observe that rows 0 through 23, or 24 rows lie above the circle,
and that rows 93 through 116, or 24 rows again, lie below the
circle. Similarly, columns 0 through 10, or 11 columns, lie to
the left of the circle, and columns 80 through 89, or 10 columns,
lie to the right of the circle. (The disparity of one column in
the horizontal direction is a result of decentering the circle
from the impossible dot position of 44.5 to the achievable dot
position of 45.)
d. The Strategy: We will proceed row by row from the top
to the bottom of the page. Within each row we will determine the
column or columns in which dots should be placed. The column
numbers will be listed in increasing order (from left to right).
This phase of the strategy will require the construction of a
table. The first column of this table will be headed "row." In
this column, the entries will simply be row numbers from 0
through 116.
The second column will be headed "y." For row numbers 0
through 23 and 93 through 116 which lie outside the circle, this
column will contain no entries. However, for rows 24 through 92
which lie inside the circle, we will have to determine the value
of y that corresponds to the row number listed in column 1. I
will presently display the equation by which, from a known value
of the row number, you can compute the corresponding value of y.
The third column of the table is labeled "x." As was the
case for the y column, the only entries in the x column will be
for rows that line inside the circle, namely, rows 24 through 92.
For each entry in the y column, there will be two x entries
corresponding to that y. Since we are dealing with a circle that
is symmetric with respect to the vertical axis (where x is 0),
the two x values will have the same absolute value but one value
will be positive and the other negative. The x values are
computed according to the equation:
x = _+sqrt(9-y^2)
The notation that precedes the sqrt function is intended to be
read as "plus or minus." In print mathematical notation, this
symbol is formed by underlining the plus sign. In this document,
you will see the underline as occupying one position to the left
of the plus sign.
The fourth and last column of the table is labeled "col."
For all rows, both outside and inside the circle, there will be
an entry of 45 in this column since this is the coordinate of
every dot on the vertical axis. For rows that are inside the
circle, we will have to compute the column coordinate for each of
the two x values in column 3. I will presently show how to make
this calculation. In addition, for row 58, the entry in the
"col" column will be "all," to indicate that for row 58 every dot
position from column 0 through column 89 must be occupied by a
dot to form the horizontal coordinate axis.
Having formed this table, we can now process three rows at a
time from the top to the bottom of the page to form the dot
patterns that must occupy the braille cells. I will also
presently demonstrate how to perform this operation. Once these
dot patterns have been formed, the computer itself knows how to
convert these dot patterns into ASCII characters and, upon a
command to print, send them to the embosser to produce the
desired graph.
e. The Promised Relationships: The first relationship that
we need and that I promised to present is the one for converting
a row number to a y value. Since the circle has a radius of 3
inches, the values of y range from 3 at the top of the circle to
-3 at the bottom of the circle. Meanwhile, the row numbers range
from 24 at the top of the circle to 92 at the bottom. Thus:
when y = 3, row = 24 and when y = -3, row = 92.
Using any method you like to form the equation of a straight
line, we find that:
y = (87/17)-(3/34)row
You can check the correctness of this equation by chooing values
of row for which the corresponding values of y are known. Thus,
by choosing values of 24, 58, and 92 for row, we find that the
respective values of y are, respectively, 3, 0, and -3, as
expected. Converting the fractions in this equation (using a
calculator, of course) to decimal form, the equation becomes:
y = 5.117647-0.0882353*row
where * (asterisk or star) is the multiplication operator as in
most programming languages.
Since I have already given the equation by which two x
values on the circle can be determined from any y value, it
remains only to present the equation by which the column position
of any dot can be determined from any x value on the circle.
Thus, when:
x = -3, col = 11 and when x = 3, col = 79
The equation verifies these statements. In decimal form, the
above equation becomes:
col = 45+3.333333*x.
To summarize, given any row in the range 24 through 92, our three
equations are:
y = 5.117647-0.0882353*row
x = _+sqrt(9-y^2)
col = 45+3.333333*x
f. The Table: Using the equations at the end of the last
section, it is now possible to construct the table that I
described earlier. I will omit that part of the table for which
row numbers lie outside the circle. These rows are 0 through 23
and 93 through 116. For these rows there are no y and no x
entries. The entries in the "col" column are uniformly 45 so as
to form the y-axis. The table that I present here extends from
row 24 to row 92 inclusive, and thus occupies 69 braille lines
and will fit on three braille pages. Thinking that some of us
would like to see a hard-copy table, I have formatted it so that
it can be printed out across a Braille Blazer page. The four
columns will fit across a field of 31 cells. To do this, I used
the _+ sign before the x entries rather than record two separate
values for x. I rounded the values of y to six places and the
values of x from three to five places. The entries in the "col"
column consist of six digits. The first two digits correspond to
the column number for the negative x value. The middle two
digits are uniformly 45 to continue the formation of the y-axis.
The last two digits specify the column corresponding to the
positive value of x. It is easy to automate the production of
this table. This is accomplished in a C language FOR loop whose
control statement is:
for (row = 24; row <= 92; row++)
and then simply translate the three formulas for computing y, x,
and col in succession. I did the rounding manually. Without
further ado, here is the table:
row y x col
___ _________ __________ ______
24 3.000000 _+0.000000 45
25 2.911765 _+0.72224 374553
26 2.823529 _+1.01375 344556
27 2.735294 _+1.23214 314559
28 2.647059 _+1.41177 294561
29 2.558823 _+1.566 274563
30 2.470566 _+1.70182 264564
31 2.382353 _+1.82329 244566
32 2.294117 _+1.93314 234567
33 2.205882 _+2.03324 224568
34 2.117647 _+2.12499 214569
35 2.029412 _+2.20941 204570
36 1.941176 _+2.28732 194561
37 1.852941 _+2.35937 184572
38 1.764796 _+2.426 184572
39 1.676470 _+2.48786 174573
40 1.588235 _+2.5451 164574
41 1.500000 _+2.598 164574
42 1.411764 _+2.647 154575
43 1.323529 _+2.69226 144576
44 1.235294 _+2.73387 144576
45 1.147059 _+2.772 144576
46 1.058823 _+2.80694 134577
47 0.970588 _+2.83865 134577
48 0.882353 _+2.86731 134577
49 0.794117 _+2.89299 124578
50 0.705882 _+2.91577 124578
51 0.617647 _+2.93573 124578
52 0.529411 _+2.95292 124578
53 0.441176 _+2.96738 114579
54 0.352941 _+2.97917 114579
55 0.264706 _+2.9883 114579
56 0.176470 _+2.99481 114579
57 0.088235 _+2.9987 114579
58 0.000000 _+3.00000 all
59 -0.085236 _+2.9987 114579
60 -0.176471 _+2.99481 114579
61 -0.264706 _+2.9886 114579
62 -0.352942 _+2.97917 114579
63 -0.441177 _+2.96738 114579
64 -0.529412 _+2.95292 124578
65 -0.617648 _+2.93573 124578
66 -0.705883 _+2.91577 124578
67 -0.794118 _+2.89299 124578
68 -0.882353 _+2.86731 134577
69 -0.970589 _+2.83865 134577
70 -1.058824 _+2.80694 134577
71 -1.147059 _+2.772 144576
72 -1.235295 _+2.73387 144576
73 -1.323530 _+2.69226 144576
74 -1.411765 _+2.647 154575
75 -1.500001 _+2.598 164574
76 -1.588236 _+2.545 164574
77 -1.676471 _+2.48786 174573
78 -1.764706 _+2.426 184572
79 -1.852942 _+2.35937 184572
80 -1.941177 _+2.28732 194571
81 -2.029412 _+2.20941 204570
82 -2.117648 _+2.12499 214569
83 -2.205883 _+2.03324 224578
84 -2.294118 _+1.93314 234567
85 -2.382354 _+1.82329 244566
86 -2.470589 _+1.70182 264564
87 -2.558824 _+1.566 274563
88 -2.647053 _+1.41176 294561
89 -2.735295 _+1.23214 314559
90 -2.823530 _+1.01374 344556
91 -2.911765 _+0.72223 374553
92 -3.000000 _+0.00000 45
If you want to add a grid in addition to the coordinate
axes, the method is straightforward, and I will not consider it
further here.
g. Preparing for Output: We are now ready to use the table
that was just generated to prepare for outputting the graph. We
begin by creating a two-dimensional array called graph whose
dimensions are 117 rows by 90 columns. It is understood that the
row numbers range from 0 through 116, and that the column numbers
range from 0 through 89. This matrix is initialized by putting a
0 into each position. This matrix can be thought of as a
digitized version of the graph. Initializing all its positions
to 0 is the equivalent of creating a blank graph.
Wherever a dot is required, we replace the 0 by a 1 on the
digitized graph. Our table tells us what those positions are.
For example, for rows 0 through 23 and rows 93 through 116 a dot
is required in column 45. Therefore, we change the 0 to a 1 in
column 45 of all those rows. Our table shows us that in row 66,
dots are required in columns 12, 45, and 78. Therefore, on our
digitized graph, we replace the 0 by a 1 in row 66 in columns 12,
45, and 78. After having made all these replacements, we have a
digitized image of the desired graph.
We now put on another "pair of glasses" with which to view
this digitized graph that we have just created. With these new
"glasses" we see the digitized image as partitioned into brl
lines with braille cells across each line. It takes three rows
on the digitized graph to constitute one braille line, and it
takes two columns of those combined three rows to constitute one
braille cell. From this point of view, there are 117/3 = 39
braille lines, and on each line there are 90/2 = 45 braille
cells. Each cell can be thought of as a minimatrix with three
rows and two columns. In each cell, the pattern of 1s tells us
which dots are present in that cell. Our aim is to convert the
dot patterns into ASCII characters and to store these characters
in another array called page in preparation for printing them
out. The dimensions for page are 39 lines by 45 cells. The line
numbers are in the range 1 through 39, and the cell numbers are
in the range 1 through 45. To make this conversion, we assign a
weight to each dot position in the cell as follows:
dot weight
__ ___:
1 1
2 2
3 4
4 8
5 16
6 32
To find the weight of a cell, we simply add the weights of the
dot positions in which there is a 1. Thus, if there is a 1 in
dot positions 1, 3, and 5, the weights of these positions are,
according to the above table, 1, 4, and 16, respecarively, and
the sum of these weights is 21. If there are no 1s in a cell,
then there are no weights to add and the weight of the cell is 0.
Every braille character has a unique cell weight according to
this scheme, and these weights range from 0 to 63. We will have
created in advance a conversion table which converts cell weights
into ASCII characters according to the Computer Braille Code. In
the left column of this two-column table are listed all the cell
weights from 0 through 63. In the right column of this
conversion table we list the ASCII characters which correspond to
these cell weights in accordance with the Computer Braille Code.
As an example, a cell weight of 5 can only be obtained from
adding 1 and 4. These weights corresfond to dots 1 and 3, so
that the ASCII character that corresponds to a cell weight of 5
is the ASCII character k. Similarly, a cell weight of 50 is
formed by adding 2, 16, and 32. These correspond to dots 2, 5,
and 6. Thus a cell weight of 50 corresponds to the digis 4 (a
dropped digit in the Comfuter Braille Code.)
Each group of three rows and two columns in the image array
corresponds to a line and a cell position in the page array.
Therefore, we scan the image array three rows and two columns at
a time, assign a cell weight to the result, find the ASCII
character that corresponds to this cell weight from the prestored
conversion table, and place this ASCII character in the
corresponding line and cell pzsition of the page array. To
emboss the desired graph, we print out the page array line by
line, appending a <cr> at the end of each line. Of course, the
embostser must have a graphing mode in which the dot spacing is
uniform not only within cells but between cells, and this uniform
spacing must also be present between the bottom of one braille
line and the top of the next one.
I have not yet done the programming required to implement
this strategy except to produce the table that I supplied
earlier. Any volunteers? I have already presented the graphing
strategy in sufficient detail and enough clarity (I hope) to make
such programming possible.
CONCLUSION (AT LAST)
When I began this communication, I had a fat pile of notes
in front of me with calculator features I wanted to address. I
addressed only a few, but included the important graphing
feature. Now, 25k later, I still have a fat pile of notes in
front of me with many more features needing to be addressed. But
this much is enough for this session. I know that I have gone
into excruciating detail in an attempt to describe what I am
doing. I don't know of any other way to communicate my thinking
in an intelligible manner. If this much detail is too much for
this committee, let me know and I will desist; I will work by
myself and submit general reports from time to time. Otherwise,
you may be getting more reports like this one.
Abraham Nemeth, Ph.D.
anemeth@ece.eng.wayne.edu
This archive was generated by hypermail 2b29 : Sun Dec 02 2012 - 01:30:03 PST