MicFFT v1.2
July 29, 1993

Written by Craig M. Walsh
CIS 70701,1614
Internet: Walsh@biovx1.dnet.nasa.gov
          Walsh@129.97.26.1


Introduction:

MicFFT is a program that samples data from a sound card or 
addressable analog-to-digital (ADC) port, and plots out the 
spectral features of the sampled waveform.  The program utilizes 
a Fast Fourier Transform (FFT) algorithm to transform the 
sampled data (in the time domain) to the frequency domain.  The 
program gets 256 Pulse Code Modulated (PCM-see below) samples 
from the ADC at a defined sampling rate, and then plots the 
transformed data.  MicFFT continuously loops between sampling 
and plotting.  Thus, the program acts somewhat like a realtime 
spectrum analyzer, and on fast machines with fast sound cards, 
is capable of impressive performance.  MicFFT can be likened to 
spectrum analyzers found on some audio equalizers, and can 
provide detailed information on the spectral components and 
relative intensities of continuous waveforms.

Improvements in version 1.2:

The main problem encountered by many of you with the Media 
Vision Pro Audio Spectrum 16 is that MicFFT v1.1 did not run 
properly under Sound Blaster compatability mode.  This version 
now explicitly supports the ProAudio Spectrum 16 (and most 
likely, the original ProAudio Spectrum), and will also work with 
this card under SB compatability mode without much trouble.  
Thus, if you have a PAS16, please use the -B2 option when 
running the program.  This version also has some improvements to 
the interface.  Now, phase and raw PCM data can optionally be 
plotted, along with the spectral data.  Also, frequencies can be 
adjusted during sampling, so that the optimal sampling frequency 
can be selected for a particular waveform.  These improvements 
are relatively minor, but as I'm writing this, MicFFT v2.0 is in 
the works, which will have much more impressive features (like a 
real user interface, DMA input, file I/O routines, etc.)  See 
the section, FUTURE DIRECTIONS below for more information.


Improvements in version 1.1:

Since many of you heeded my call for comments in the last 
version, I was able to gain insight into what improvements to 
include in this version of MicFFT.  The main problem I found was 
that the original version of MicFFT did not support Sound 
Blaster or Sound Blaster-compatible cards, even though I 
presumed it might.  After some investigation, I found that 
sampling on the SB card requires quite a bit of additional code 
that was not included in the original version of MicFFT.  Since 
I don't have an SB card (I have a Covox Sound Master II, and am 
quite happy with it so far!), I had to find someone out there 
with one to help out.  Fortunately, Chris Pye decided to join 
the MicFFT "development team", and has supplied the SB sampling 
routines (along with additional ideas, etc.) for this new 
version.  Now, MicFFT v1.2 has explicit support for SB 8-bit 
cards (16 bit sampling is, sadly, not included yet).  
Additionally, other cards that have Sound Blaster compatibility 
should also work with MicFFT (see Compatibility); I hope this 
time I don't eat my words!

MicFFT also has a new function that provides for freezing 
waveform sampling and allows detailed analysis of the frozen 
waveform.  This function has a positionable cursor-line, which 
can be used to determine the frequency and amplitude of a 
specific band on the plot.  The program also has a new plotting 
mode that allows plots to be generated in either bar graph 
style, as implemented in the original version, or line graph 
style, which produces output that may be more suitable to 
certain applications.  Output is also scaled in decibel (dB) 
steps.  Some new filtering options have been added to MicFFT 
v1.2; Squelch allows filtering of spurious noise below a set 
threshold; Cosine envelope is used to reduce transformation 
errors resulting from sampling discontinuities (see Cosine 
Envelope, below).  In addition, certain bugs that were not 
identified before the original release have been fixed (I hope).


Requirements:

MicFFT is a computing-intensive program and requires a fast 
computer for achieving rapid output.  It was developed on a 
33MHz 486-DX (with built-in floating-point coprocessor), a Super 
VGA system, and a Covox SoundMaster II sound card.  Graphics 
modes tested include both EGA and VGA, so both will work (see 
Options).  MicFFT will look for a coprocessor (and will run 
dramatically faster if one is found), but will emulate one if a 
coprocessor is not present.  Additionally, some 286-specific 
code is included for speed, and thus it will not work properly 
on machines with lesser processors.  Since the sampling routines 
are timed and independent of the transformation and plotting, 
the speed of a particular machine should not affect the accuracy 
of frequency output significantly, unless the sampling frequency 
is excessively high; only the rate at which data is plotted will 
be affected.  


Supported Sound Cards:

As stated above, this version of MicFFT explicitly supports the 
Covox SoundMaster II (default), the Sound Blaster cards for 8-
bit sampling, and the ProAudio Spectrum 16 cards.  The Sound 
Blaster mode, which includes additional code for sending 
commands to control the sampling specifics, is available using 
the -B1 flag (see Options).  The ProAudio Spectrum 16 (and 
perhaps the original ProAudio Spectrum) is supported, and the 
user must specify the -B2 option at the command line.  Other 
cards may work as well, particularly if some means for Sound 
Blaster compatibility is provided by the card.  The Pro Audio 
Spectrum 16 card will work under SoundBlaster mode as well, 
since it implements this compatability in the hardware of the 
card itself.  I have tested the program with the PAS16 card, and 
it does work.  Covox compatibility (default) is likely not 
explicitly provided by other sound card vendors.  However, it 
may be generally useful to those whose cards are capable of 
polling the ADC independently (without explicit commands for 
controlling sampling); MicFFT provides a means for changing the 
default ADC port address.  In the Covox mode, MicFFT simply 
looks for data at this port at a defined rate using timing 
routines in the program.  The default port address included in 
the program is 22F (hex).  This is actually a port address 
(0x220h) and ADC offset (0x00F) added together.  If you have a 
card where a port address is given in the documentation, and an 
ADC input offset is also given, just add the two together (using 
a hex calculator) and use the -P flag to let MicFFT know which 
address you need to use.  I realize that this discussion may be 
a bit technical, but I provide it so that users with cards other 
than the above mentioned can attempt to figure out which options 
to alter.  I know that incompatibility is frustrating, so if you 
have a card which is not explicitly supported (and there is 
really a growing list), I will include compatibility for such 
cards for those who can get me specific code for PCM sampling.  
I prefer to have short code segments (in C, or assembler if 
possible) to look at rather than libraries, since I need to be 
able to control some of the aspects of sampling, and I need you 
to volunteer for testing the modified code.  Contact me at the 
address provided (see Contacting the Author), and I will happily 
discuss your specific needs.  (It should be noted that I am 
currently porting the program to Windows.  This will be helpful, 
since compatibility would not be an issue here, so long as the 
hardware has the appropriate PCM driver setup in Windows.)


Lesson 1.  PCM sampling:

Sampling is a process whereby a continuous stream of data is 
broken up into chunks of data usable by the sampling system.  
PCM sampling is a process whereby this continuous data is polled 
ata defined rate.  Since we are interested in analog signals 
most of the time (the type that enter our sound cards via the 
ADC port), it is necessary to first transform the data from an 
analog representation to a digital one.  This is the job of the 
ADC.  This process is fairly complicated, but suffice it to say 
that an analog value (from - infinity to + infinity) is 
transformed to an explicit digital value.  Since the digital 
value can represent only a discrete value, there may be some 
loss of resolution in this transformation.  16 bit cards (which 
can represent 64K different input levels) are much more accurate 
for this purpose than 8 bit cards (which only can reproduce 256 
different levels).  Also, since PCM-sampling assumes that the 
analog waveform has components on either side of zero (i.e. 
negative and positive parts of a wave), one half of the digital 
range is negative, the other half positive.  This reduces the 
number of possible digital absolute value amplitudes by a factor 
of two, which affects the dynamic range (i.e. the lowest to 
highest amplitude) of a particular digital system.

Digital conversion produces a sample value, and this is done at 
a discrete sampling frequency so that points of a continuous 
analog waveform are approximated by a set of digital values.  
These digital values can be stored into the computer's memory 
and played back to reproduce an approximation of the original 
analog waveform.  The process of rebuilding an analog waveform 
from digital samples requires that the samples are "played back" 
at a rate similar to the rate at which the samples were 
originally obtained.  To do this, each sample is transformed 
from a digital value to an analog value (using a digital-to-
analog converter, or DAC) and this is done for all of the stored 
samples at the chosen sampling frequency.  Thus, an 
approximation of the original analog waveform can be reproduced.  

The accuracy of sampling thus depends on two major variables:  
the sampling rate and the number of possible sample values.  The 
sampling rate can affect accuracy since it defines the highest 
possible frequency from the original waveform that can be 
sampled.  The Nyquist sampling theorem dictates that the 
sampling rate must be at least twice the frequency of the 
highest frequency component to be sampled.  Thus, frequencies 
greater than one-half the sampling frequency (the Nyquist limit) 
will not be sampled accurately.  Attempting to surpass this 
limit will introduce errors into the sampled waveform.  To get 
around this limitation in practical sampling systems (e.g. 
digital Compact Disc recording and playback, etc.), engineers 
utilize low-pass filters which attenuate signals of frequencies 
higher than the Nyquist limit prior to digital sampling.  For 
CDs, which have a sampling rate of 44.1 kHz, these low-pass 
filters begin attenuating at about 21 kHz and have reduced the 
signal at the Nyquist limit of 22.05 kHz almost entirely.  Thus, 
a CD can have data sampled upto about 22 kHz, but no higher, and 
is thus "bandwidth-limited."  Sampling any higher frequencies 
would create undesirable noise in the output.  (Note that 44.1 
kHz is chosen because it is about the lowest value for 
accurately sampling the spectrum of frequencies important in 
musical signals; about 15 Hz to 20 kHz.  Any higher value would 
be unnecessary and would require an increase data storage, an 
obvious limitation for a system with two digital PCM channels 
and error-correction data included with the PCM data).   

The second limitation to accurate PCM sampling is related to the 
number of bits each sample contains.  CD sampled material is 16-
bit PCM.  This corresponds to a dynamic range of about 96 
decibels (dB).  Systems using smaller sized samples will 
obviously have a lower dynamic range.  Thus, they will have an 
inherently higher level of noise, and are inappropriate for 
high-fidelity reproduction of sound.  Of course, the tradeoff 
between sound quality and data storage is an important design 
consideration in any PCM system.


Lesson 2.  Superposition:

It is fairly easy to figure out what a sinewave looks like from 
an oscilloscope plot.  You've likely heard what a sinewave 
sounds like; pretty boring.  A simple sinewave can produce a 
tone.  However, most sound that we hear and find pleasing has 
much more content than a single sinewave.  Musical instruments 
produce waveforms with a fundamental (do not confuse with my 
terminology below; fundamental here refers to the primary 
frequency created by an instrument) frequency (sinewave) and a 
group of harmonic sinewaves at multiples of the fundamental.  
These "harmonics" give each instrument a recognizable sound, or 
timbre.  When we break up the waveform, it is possible to show 
that the original waveform is thus the addition of the 
fundamental sinewave and all of its harmonic sinewaves.  This 
addition is called superposition.  Of course, superposition can 
be both additive, or destructive.  Destructive superposition can 
actually cancel out the amplitudes of two waveforms (for 
example, if both are of the same frequency and amplitude, but 
are 180 degrees out of phase; i.e. the peak of the first wave 
corresponds to the trough of the second).  If you listen to two 
sinewaves being reproduced by the FM chip on your sound card (if 
you have one), you will be listening to superimposed sinewaves.  
However, since your ear is able to pull out the discrete 
frequencies in the signal, you hear two sinewaves (sort of like 
the FFT routine described below).  Pretty neat, huh?


Lesson 3.  Fourier Transforms:

Many of you may have seen programs that take PCM sampled sound 
and output the data on the screen in an oscilloscope-like 
display.  In this case, the plot is based on amplitude vs. time.  
It is possible to determine the relative frequency of a 
continuous waveform by varying the sweep-rate of such an 
oscilloscope, but there are better ways to gather frequency data 
from PCM samples.  One approach is to pass the data through an 
algorithm called a Fast Fourier Transform (FFT) and to plot the 
resulting data as a magnitude vs. frequency plot.  Essentially, 
the FFT loops thru a group of samples and pulls out all of the 
sinewaves contained in the sampling period (delta).  Since we 
know the sampling rate (and thus, the time between samples), it 
is possible to assign frequency values to the sinewaves 
determined by the FFT.  So, the Fourier Transform works like the 
superposition principle in reverse.  

The first sinewave is the lowest possible sinewave that can be 
sampled accurately by the FFT, and corresponds to the sampling 
frequency divided by the number of samples in delta.  I refer to 
this as the fundamental frequency of the plot, F-fund.  The 
frequency band plotted is twice F-fund, and the next is 3X, and 
so on.  Thus, the plotted bands continue up by multiples of F-
fund until we reach the Nyquist limiting frequency (F-Ny), which 
incidentally has a band number equal to 1/2 the number of 
samples in delta (band number is also called channel number; one 
band is plotted for each frequency displayed by MicFFT for a 
particular sampling frequency).  Generally, data is plotted with 
linear scaling along the frequency axis, which means that each 
band plotted represents one frequency.  However, it should be 
noted that frequencies located between two discrete bands will 
be represented as maximal deflections of the two bands on either 
side of this intervening frequency.  Additionally, an even-band 
centered frequency will produce deflections of those bands 
adjacent to it, tapering off as we move in either direction from 
the center band.  One should use care when ascribing a 
particular group of frequencies to a particular plot; as you 
work with MicFFT, you will get an idea of what to expect.


MicFFT Usage:

When you start MicFFT with the appropriate command line 
arguments (see Options), you will be able to begin sampling 
signals entering the ADC.  Whistle into a microphone connected 
to the sound card.  You should see a peak, corresponding to the 
frequency of the whistle.  Since the whistle is produced at the 
lips, there is little interaction with the resonant cavities of 
the body that normally introduce harmonics in speech and 
singing.  Thus, whistling approximates a sinewave and can be 
used to test MicFFT for simple waveforms.  Vary the pitch of 
your whistling.  By reducing the pitch, you should see this peak 
move to the left, thus indicating that the frequency is moving 
lower.  By raising the pitch, the peak should move to the right 
of the plot (note that the degree of peak movement will be 
affected by the chosen sampling frequency).  Note the ruler at 
the bottom of the plot screen.  This ruler corresponds to the 
multiples of the fundamental frequency.  Ones are in white, 
fives are in orange and tens are in red.  You can use the ruler 
to get an instant idea of the relative frequency during sampling 
(if you are quick at math).

It is now possible to freeze the plot by pressing the SPACE bar.  
Do this while continuing to whistle.  Once the sampling has 
stopped and you have a frozen waveform frequency spectrum on the 
screen, you can use the arrow keys to move a cursor line around 
the plot.  Move the cursor line to the peak.  Below, you will 
see the frequency for this peak, as well as the amplitude (in 
magnitude returned by the FFT routine, and based on a maximum of 
128; and in dB, relative to a dynamic range from 1 to 48 dB for 
the 8-bit samples).  Note that the power density is related to 
the area under the peak; the magnitudes shown are plotted only 
for the band under the cursor line.  


Keys for Freeze Window:

To move the cursor line around, use the LEFT or RIGHT keys for 
single band movements.  To speed up movement around the plot, 
use CTRL-LEFT or CTRL-RIGHT to move ten bands for each keypress.  
To move to the right end of the plot, press END or PGDN; to move 
all the way to the left side, use HOME or PGUP.  To return to 
the sampling mode, press the SPACE bar.  To exit the program at 
any time (during sampling or in the freeze window), press ESC.


Options:

MicFFT v1.3 has a number of options which are set by command 
line arguments using specified flags.  It is also possible to 
set some of these options while the program is running (see 
KEYBOARD OPTIONS DURING SAMPLING). Typing MicFFT at the DOS 
prompt without any flags will run the program with the built-in 
defaults.  You can override these defaults using the following 
flags:

-?:	Display command line options.  Also -h.

-f:	Change the sampling frequency.  -f25000 will change the 
sampling frequency to 25 kHz.  Valid range is from 1 Hz (which 
would take 256 seconds before the first plot; not 
recommended...) and the highest sampling rate of your sound 
card.  For the Covox card, this is 25000 (although I've been 
able to get upto 34090 Hz before getting sampling problems).  
For the Sound Blaster, this is 13 kHz.  For the ProAudio 
Spectrum 16, this is 88200 Hz (and I assume 44100 Hz for the 
original ProAudio Spectrum).  Play around with this option a 
lot.  Default is 10000.

-p:	Change the default ADC port address.  Default is 22F 
(hex), which corresponds to the default for the Covox card.  -
f24fh will change to port address/offset 24F.  If you use the 
Sound Blaster mode (see -b flag), the default will be 220.  Note 
that if you supply a hexidecimal address, use an "h" following 
the address to signify that you are using a hex address.  
Decimal addresses are assumed and require no h at the end.  
MicFFT will report the address chosen, so you can verify that 
the correct address has been selected.

-b:	Change the sound card mode.  The default is the Covox mode 
(see Sound Cards, above), which is -b0.  For Sound Blaster (or 
compatible) mode, use -b1.  The ProAudio Spectrum is set with -
b2.  

-m:	Scaling mode.  Set to -m1 for maximum amplitude mode.  In 
this mode, all amplitude data is scaled on the plot so that all 
amplitudes are scaled to the amplitude of the highest peak in 
the plot.  Set to -m0 for log amplitude scaling; log amplitude 
scaling is in dB, so this may be more suitable for some signals.  
-m0 is the default.

-l:	Line mode.  Set to -l1 for line plot mode.  In this mode, 
lines are drawn between points corresponding to amplitudes of 
successive bands.  Set to -l0 for bar graph mode.  In this mode, 
each frequency band is plotted distinctly, from the bottom of 
the plot to each amplitude point.  -l0 is the default.

-c:	Cosine envelope.  Type -c to turn on the cosine envelope 
function.  This adds a filter that prescales the data to remove 
discontinuities at either end of the waveform before entering 
the FFT routine.  This may produce a more stable display for 
waveforms that are not rapidly changing, and will reduce the 
magnitudes of data around improperly centered frequencies.  On 
some computers (particularly those without math coprocessors), 
this will increase the computation time somewhat.

-s:	Squelch mode.  To remove low-level noise from the input, 
to clean up the plot, use -s.  This removes any samples above 
and below the zero level.  For example, -s10 will remove all PCM 
samples between -10 and +10.  Use this option carefully, since 
it can create square-waves, which have a variety of frequency 
components that will pollute the spectrum.  I do not recommend 
values of greater than, say 10 for 8 bit sampling.

-d:	DC Offset.  Generally, 8 bit cards represent zero level 
signals as 128.  To produce an AC wave centered around zero, 
MicFFT subtracts the DC offset (128) from the input values.  It 
is possible that the DC offset is not perfectly centered at 128.  
For example, it is my experience that the PAS16 I've tested 
under SB compatability mode is actually centered about 108.  
Thus, by typing -d108 on the command line, the zero level is 
correctly centered.  This is particularly important for the 
cosine envelope function, since a large DC offset will produce a 
corresponding deflection of the first band on the plot (i.e. the 
fundamental frequency band).  If you encounter problems of this 
sort, it is recommended that you experiment with this value.  
Unfortunately, this version does not perform this automatically.

-e and -v:  Force EGA or VGA mode, respectively.  The default is 
to use the maximum resolution of the monitor, based on the mode 
the monitor is set to when MicFFT is started.  -e has lower 
resolution, but may be faster on some VGA monitors.  It also 
produces a somewhat larger plot.  -v was added for consistency.	


Note that all options can be entered using either the - or / 
switch.  Case is not important, but you must not include white 
spaces for any particular flag, since MicFFT will ignore any 
options that do not conform to this syntax.  Order is also not 
important, since the options are collected and verified before 
any setup occurs.  I recommend that you create a batch file that 
has your required configuration (for example, port and plotting 
mode specs) along with a couple of %n's to allow additional 
parameters to be entered.  For example:

@echo off
REM RUNMF.BAT  --  Batch for running MicFFT with set config.
MicFFT -p24Fh -m1 -l1 %1 %2 %3 %4



Keyboard Options During Sampling:

MicFFT v1.2 now has a few options that can be set during the 
sampling period, rather than requiring command line flags for 
all options.  The following summarizes key usage during 
sampling.  For information regarding key usage in the Freeze 
Window, see above.

c		Toggle cosine envelope.

l		Toggle line/bar plot modes.

m		Toggle amplitude scaling (linear vs. logarithmic).

a		Toggle wait for data available during sampling (SB 
		mode only).

x		Toggle display of phase data.

s		Toggle display of raw PCM data.

[]		Decrease or increase (respectively) sampling 	
		frequency by 10 Hz.

{}		Decrease or increase (respectively) sampling 	
		frequency by 100 Hz.

./		Decrease or increase (respectively) sampling 	
		frequency by 1000 Hz.

<SPACE> 	Freeze sampling and display Freeze Window.

<ESC>		Exit program.



Performance and Hardware-Specific Notes:

As stated above, MicFFT frequency accuracy should not be 
affected by different machine speeds, since the sampling is done 
in a loop separate from the other routines, and uses the PC's 
internal 8253 timer chip for accuracy in the fractional 
microsecond range.  However, the Sound Blaster mode may not be 
as accurate, because a number of additional steps are required 
for sampling that will certainly increase the processing time.  
Since I don't have a Sound Blaster card, it is not possible for 
me to test this out.  Chris Pye, who wrote the Sound Blaster 
routines, has observed frequency problems, but only when the 
sampling rate exceeded 13 kHz.  Try this out for yourself.  If 
you use a tuning fork (or some other stable frequency 
generator), you should get approximately similar frequency peaks 
at different sampling frequencies.  Keep in mind that any error 
introduced by this extra processing will affect high sampling 
rates.  Thus, compare low rates with very high rates.  If the 
frequency display is stable, everything should be pretty 
accurate. 

In SB-mode, MicFFT polls the ADC port (default address at 220 
hex) after testing the data available port.  The data available 
port is set high when the ADC has sampled and confirmed the next 
input sample.  However, you can turn off this checking using the 
"a" key (as described above).  This will enable the program to 
oversample the ADC by not testing for the next sample value.  It 
is possible to observe stair-stepping in the raw PCM samples 
using this approach, but it should be noted that the accuracy of 
the plot will also be affected.  For example, this will produce 
sqare waves, which will have a variety of high-frequency 
components.  It may be possible to sample at a slightly higher 
frequency, since this extra looping is removed from the 
processing.  However, once the maximum sampling rate is reached, 
it is not possible to get any additional information.  I left 
this in the program just as a "gee-whiz" sort of feature.  If 
you want to do serious spectral analysis, I'd suggest not using 
this feature.  However, you can see just how fast the program 
can calculate the FFTs by turning off checking and speeding up 
the sample rate.  Just be cognisant of the limitations 
mentioned.

I have noticed that it is not possible to sample at a rate 
higher than 34090 Hz (not even 34091!) on the Covox card.  When 
I try, I get no output (or output only in the first channel).  I 
don't know why this occurs, but it is probably related to the 
way in which this specific card samples data, as well as my 
machine's clock rate (33 MHz).  I assumed that I would see a 
smearing of frequency at these higher rates (i.e. shifting to 
reflect a lower actual rate than set by the program), but rather 
this is a brick wall beyond which sampling doesn't work.  In a 
way, I much prefer this, since it helps to know that the program 
is accurate upto this maximum rate.  Again, it is important to 
test this out on each system, if you are really interested in 
accurate, high-frequency sampling.  In this respect, I may move 
to DMA-controlled PCM sampling support for the Covox, Sound 
Blaster Pro and Pro Audio Spectrum cards in future releases.  
This would allow the card itself to do the work of ensuring 
accurate sampling.

Of all the cards tested, the ProAudio Spectrum 16 is the most 
stable and is capable of impressive performance.  The card is 
capable of sampling at 88200 Hz, which means that the entire 
spectrum encountered in perceptible audio signals is represented 
in plots produced by the program (20-20,000 Hz).  This card also 
has a preset hardware anti-aliasing filter (in the form of a 
programmable capacitor network at both the input and output of 
the analog stages).  When MicFFT is initiated, the defined 
sampling rate preselects the appropriate best-match filter for 
the chosen sampling rate.  If you start the program with the -
f88200 flag, all frequencies below at least 20kHz should be 
represented properly.  Thus, I recommend adding this flag when 
starting the program using the ProAudio Spectrum card, unless 
you wish to use a lower frequency filter setting to keep 
aliasing out of the picture.  Also, it is important that the 
"Digital Audio" setting (set using the command PAS * at the DOS 
prompt) be set, since the program does not currently adjust 
mixer settings.  If you do not set this to zero, you will get a 
great deal of bothersome feedback.  However, if you set this to 
a value of about 50% or so, it is possible to hear the different 
anti-aliasing filters kicking in upon initiation of sampling, if 
you have a signal impinging on the ADC at this point (for 
example, CD audio). 

The refresh rate (i.e. the amount of time between sampling 
periods) will vary, depending on the machine used.  MicFFT is 
set up to sample 256 data points, transform and plot out the 
data, then repeat this.  On slow machines, the refresh rate will 
be low; on fast machines, particularly those equipped with 
floating-point coprocessors, it will be impressively fast.  
Nevertheless, it is important to stress that the time spent 
processing the data is time spent not sampling.  Thus, events 
occuring between sampling periods will be ignored.  This may be 
problematic with time-varying signals, particularly those with 
substantial transient components.  For this reason, it is 
necessary to carefully analyze the plot for such data.  
Sometimes, the plot will miss these transients.  If this is a 
concern, I suggest slowing the sampling rate to the lowest 
allowable frequency (based on the bandwidth of the signal), as 
this will increase the chance of capturing this varying signal 
in the plot.  You can freeze a waveform, but this is difficult 
with rapidly varying signals.  A more suitable approach would be 
to sample the waveform and select the parts of a time-domain 
plot to display.  Future versions of MicFFT will include this 
feature.  Also note that the cosine envelope will reduce the 
refresh rate, because it adds a lot of floating-point 
calculations.  The show PCM mode (turned on by pressing the "s" 
key) will also slow down the refresh rate.  This is due to the 
extra graphics processing occuring.  It is possible to cycle 
between off, line-draw and pixel plot for this option.  I 
suggest pixel plot for the quickest display of the PCM data, 
since large-amplitude waveforms will not affect the graphing 
speed.  The line-draw is somewhat slower for large-amplitude 
waveforms since the program must calculate and graph not only 
the endpoints, but all of the points on the line as well.  Of 
course, the line-draw mode looks nicer.  Finally, the show-phase 
option (toggled by the "x" key) can also slow down the refresh 
rate.  All of the graphics options should be tested for a 
particular system to determine the optimal trade-off between 
performance and the desired information.  

I have gotten some flak from a variety of people about the 
sluggishness of the program.  I was a bit suprised, because I 
was observing pretty suitable performance from the program on my 
486DX.  However, after disabling coprocessor support for the 
program, I was amazed at how slow the program can be.  As a 
test, you can set an environmental variable to ignore the 
coprocessor if your computer is equipped with one.  To do this, 
just type "SET NO87=Boy is this program slow!" at the DOS 
prompt, then run the program.  This is one of those tests where 
you will feel pretty lucky to have a coprocessor, if you ever 
wondered what it was good for.  I believe the speed difference 
is probably on the order of about 10 to 50 fold.  If your 
computer doesn't have a coprocessor, you may wish to purchase 
one, particularly if you do a lot of number crunching.  As far 
as MicFFT goes, there is pretty much no way around it.  There 
are a LOT of calculations going on, and anytime the processor 
can offload some for a little cheap "parallel" processing the 
better.  I guess I might be able to enhance performance somewhat 
by coding the routines entirely in assembly, but I have other 
things to do with my time.

It is important to be cognisant of the Nyquist limit for any 
particular waveform, as signals with components exceding the 
limit will be "aliased" and not represented properly by the 
spectral plot.  As I described above, frequencies above the 
Nyquist limit will produce errors (aliasing) unless these are 
removed from the signal before they are sampled.  This is 
interesting in one respect: set the sampling frequency to about 
4000 Hz and start a low whistle.  As you increase the frequency, 
you will notice that the peak wraps around as it moves to the 
right side of the plot.  If it goes far enough, it will also 
wrap around the left side of the plot as well.  This a very 
graphic demonstration of aliasing.  Beyond the academics, 
aliasing can be a serious problem to accurate spectral analysis.  
MicFFT does not yet have any low-pass filtering built in 
(although future versions may include this), so you will have to 
consider aliasing when chosing a particular signal and sampling 
frequency.  If you are capable, it is possible to add a low-pass 
filter to the input line of your signal generator (or mic) to 
eliminate these higher frequencies.  Your sound card may even 
provide for this type of bandwidth limiting (incidentally, the 
PAS16 does, and is set to the best match when the program 
starts, based on the initial frequency value).

MicFFT is not designed to compete with hardware spectrum 
analyzers (not yet, at least).  But, since these hardware 
analyzers are many thousands of dollars, the cost of this 
approach is more suitable for many applications, particularly 
experimentation into sound, etc.  Although you may come up with 
interesting ideas, I don't yet recommend its use in building the 
next-generation Hubble Telescope, etc.  However, it might work 
really well in analysis of Cold Fusion experiments.  If you have 
any results in this arena, please inform me so I can buy the 
stock (SEC, just kidding already!).


Acknowledgements:

I'd like to take this opportunity to thank many of you who 
downloaded MicFFT v1.0 and v1.1 and sent comments to me about 
the program.  Since I've not asked for a fee for the program, at 
least it gives me a little ego boost, and makes the programming 
a bit more fun.  Your comments and criticisms have certainly 
made development a more enlightened process.

Andy Charmatz, here at UCLA, has been a fantastic help in 
getting the SB routines to work with the PAS16, as well as the 
implementation of the PAS16-specific coding.  He lent me his 
PAS16 so that I could test out the SB routines and find out 
where the real problems were occuring.  As it turns out, MicFFT 
didn't really crash the computer when it was having problems 
with the PAS compatability, it was just not getting info from 
the data available port.  So it goes for SB compatability!  
Incidentally, if you have a card which does not work with this 
program, I'd be happy to make arrangements to work some routines 
into the program to make it run properly. 

Chris Pye has been instrumental in making MicFFT compatible with 
Sound Blaster cards.  He also provided code for the freeze-
window routine and the cosine-envelope function.  He knows a lot 
more about Fourier transforms than I (I'm a molecular biology 
grad student, and just a engineering/physics hacker), and I'll 
be working with him a lot in the future for developing better 
versions of the program.  Additionally, the FFT routines used in 
this program are based on those implemented in an archive called 
FFT.ARC found on Compuserve by the author Steve Sampson, as well 
as those found in a book called Numerical Recipes in C.  The 
8253 timer routines (which have extraordinary accuracy) are 
based on a Compuserve archive called TIMERH.ARC, uploaded by the 
author Micahel Walraven.  I am indebted to the work of these 
authors.


Conditions of Use:

MicFFT v1.2 is freeware, which means that I continue to hold the 
rights to the program (i.e. it is not released into the public 
domain).  You are entitled to copy the program, and are 
encouraged to post the program on BBSs, distribute it to 
friends, etc.  However, if you use the program, I ask that you 
contact me (see Contacting The Author) to let me know what you 
are using it for, its fitness, and other comments, problems, 
etc.  When and if I decide to charge for my work, I won't 
require this.  When I download programs I find interesting, I 
often notify the author out of courtesy.  Usually, I get lots of 
ideas as well.  You may find that such discourse can be fun and 
interesting.  On the other hand, you may find that I don't know 
anything about this stuff.  You'll just have to try me.  The 
code for MicFFT is not available, unless you make specific 
arrangements with me first.  The main reason for this is that I 
want to maintain control of the development of the program.  If 
you have good ideas, and are proficient in coding, I'll make 
exceptions.  


Future Directions:

I've initiated work on the next version, which should be 
available much sooner than this version has taken (I've been 
pretty busy with other things).  The next version will 
definitely include DMA-based input, and perhaps if some of you 
contact me soon, support for other cards (like the SB Pro 16 
ASP, etc).  Also, I will include support for 16 bit sampling for 
cards where this is permissible.  I may also include stereo 
sampling, although I've not quite determined the usefulness of 
it in this context (ideas? ideas?).  Additionally, a few other 
windowing functions will be included ( Hamming-Hanning, Parzen, 
etc), as well as digital lowpass filtering.  I am also playing 
around with the FM chip (Adlib compatibles) so that it will be 
possible to use the FM chip to produce test signals that can be 
analyzed (particularly useful for us speaker builders!).  I have 
been writing some very fast graphics routines, so I hope to 
increase the speed of the program output by implementing them.  
Additionally, I will definitely provide a REAL user interface in 
the next version, with all the buttons, etc.  I recently 
purchased MS Visual C++, and will eventually produce a program 
for Windows-based sound analysis.


Contacting The Author:

You can contact me at the following E-mail addresses:

Compuserve 70701,1614
Internet: walsh@biovx1.dnet.nasa.gov

(Incidentally, I don't work for NASA, but our mail-server here 
at UCLA is named this way for some strange reason).  

I can also be contacted by phone at my Los Angeles residence at 

(310) 390-0598

Please note that I'd prefer to get mail via Internet, since my 
Compuserve bills have been skyrocketing (and I'm just a poor, 
lowly grad student).  You can do this on Compuserve by sending 
the mail to an Internet address (see the help screen for the 
specifics here.  I don't recall offhand how to do this).  I 
check my mail on the Internet on a daily basis; I check 
Compuserve much less frequently.  For a super low-tech approach, 
you can send a post via hardcopy to:

Craig Walsh
12420 Woodgreen Ave #203
Los Angeles, CA 90066


Have fun, and good luck with MicFFT v1.2.  Let me know what you 
think.
