home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 720.MICFFT12.TXT < prev    next >
Text File  |  1993-07-29  |  40KB  |  772 lines

  1. MicFFT v1.2
  2. July 29, 1993
  3.  
  4. Written by Craig M. Walsh
  5. CIS 70701,1614
  6. Internet: Walsh@biovx1.dnet.nasa.gov
  7.           Walsh@129.97.26.1
  8.  
  9.  
  10. Introduction:
  11.  
  12. MicFFT is a program that samples data from a sound card or 
  13. addressable analog-to-digital (ADC) port, and plots out the 
  14. spectral features of the sampled waveform.  The program utilizes 
  15. a Fast Fourier Transform (FFT) algorithm to transform the 
  16. sampled data (in the time domain) to the frequency domain.  The 
  17. program gets 256 Pulse Code Modulated (PCM-see below) samples 
  18. from the ADC at a defined sampling rate, and then plots the 
  19. transformed data.  MicFFT continuously loops between sampling 
  20. and plotting.  Thus, the program acts somewhat like a realtime 
  21. spectrum analyzer, and on fast machines with fast sound cards, 
  22. is capable of impressive performance.  MicFFT can be likened to 
  23. spectrum analyzers found on some audio equalizers, and can 
  24. provide detailed information on the spectral components and 
  25. relative intensities of continuous waveforms.
  26.  
  27. Improvements in version 1.2:
  28.  
  29. The main problem encountered by many of you with the Media 
  30. Vision Pro Audio Spectrum 16 is that MicFFT v1.1 did not run 
  31. properly under Sound Blaster compatability mode.  This version 
  32. now explicitly supports the ProAudio Spectrum 16 (and most 
  33. likely, the original ProAudio Spectrum), and will also work with 
  34. this card under SB compatability mode without much trouble.  
  35. Thus, if you have a PAS16, please use the -B2 option when 
  36. running the program.  This version also has some improvements to 
  37. the interface.  Now, phase and raw PCM data can optionally be 
  38. plotted, along with the spectral data.  Also, frequencies can be 
  39. adjusted during sampling, so that the optimal sampling frequency 
  40. can be selected for a particular waveform.  These improvements 
  41. are relatively minor, but as I'm writing this, MicFFT v2.0 is in 
  42. the works, which will have much more impressive features (like a 
  43. real user interface, DMA input, file I/O routines, etc.)  See 
  44. the section, FUTURE DIRECTIONS below for more information.
  45.  
  46.  
  47. Improvements in version 1.1:
  48.  
  49. Since many of you heeded my call for comments in the last 
  50. version, I was able to gain insight into what improvements to 
  51. include in this version of MicFFT.  The main problem I found was 
  52. that the original version of MicFFT did not support Sound 
  53. Blaster or Sound Blaster-compatible cards, even though I 
  54. presumed it might.  After some investigation, I found that 
  55. sampling on the SB card requires quite a bit of additional code 
  56. that was not included in the original version of MicFFT.  Since 
  57. I don't have an SB card (I have a Covox Sound Master II, and am 
  58. quite happy with it so far!), I had to find someone out there 
  59. with one to help out.  Fortunately, Chris Pye decided to join 
  60. the MicFFT "development team", and has supplied the SB sampling 
  61. routines (along with additional ideas, etc.) for this new 
  62. version.  Now, MicFFT v1.2 has explicit support for SB 8-bit 
  63. cards (16 bit sampling is, sadly, not included yet).  
  64. Additionally, other cards that have Sound Blaster compatibility 
  65. should also work with MicFFT (see Compatibility); I hope this 
  66. time I don't eat my words!
  67.  
  68. MicFFT also has a new function that provides for freezing 
  69. waveform sampling and allows detailed analysis of the frozen 
  70. waveform.  This function has a positionable cursor-line, which 
  71. can be used to determine the frequency and amplitude of a 
  72. specific band on the plot.  The program also has a new plotting 
  73. mode that allows plots to be generated in either bar graph 
  74. style, as implemented in the original version, or line graph 
  75. style, which produces output that may be more suitable to 
  76. certain applications.  Output is also scaled in decibel (dB) 
  77. steps.  Some new filtering options have been added to MicFFT 
  78. v1.2; Squelch allows filtering of spurious noise below a set 
  79. threshold; Cosine envelope is used to reduce transformation 
  80. errors resulting from sampling discontinuities (see Cosine 
  81. Envelope, below).  In addition, certain bugs that were not 
  82. identified before the original release have been fixed (I hope).
  83.  
  84.  
  85. Requirements:
  86.  
  87. MicFFT is a computing-intensive program and requires a fast 
  88. computer for achieving rapid output.  It was developed on a 
  89. 33MHz 486-DX (with built-in floating-point coprocessor), a Super 
  90. VGA system, and a Covox SoundMaster II sound card.  Graphics 
  91. modes tested include both EGA and VGA, so both will work (see 
  92. Options).  MicFFT will look for a coprocessor (and will run 
  93. dramatically faster if one is found), but will emulate one if a 
  94. coprocessor is not present.  Additionally, some 286-specific 
  95. code is included for speed, and thus it will not work properly 
  96. on machines with lesser processors.  Since the sampling routines 
  97. are timed and independent of the transformation and plotting, 
  98. the speed of a particular machine should not affect the accuracy 
  99. of frequency output significantly, unless the sampling frequency 
  100. is excessively high; only the rate at which data is plotted will 
  101. be affected.  
  102.  
  103.  
  104. Supported Sound Cards:
  105.  
  106. As stated above, this version of MicFFT explicitly supports the 
  107. Covox SoundMaster II (default), the Sound Blaster cards for 8-
  108. bit sampling, and the ProAudio Spectrum 16 cards.  The Sound 
  109. Blaster mode, which includes additional code for sending 
  110. commands to control the sampling specifics, is available using 
  111. the -B1 flag (see Options).  The ProAudio Spectrum 16 (and 
  112. perhaps the original ProAudio Spectrum) is supported, and the 
  113. user must specify the -B2 option at the command line.  Other 
  114. cards may work as well, particularly if some means for Sound 
  115. Blaster compatibility is provided by the card.  The Pro Audio 
  116. Spectrum 16 card will work under SoundBlaster mode as well, 
  117. since it implements this compatability in the hardware of the 
  118. card itself.  I have tested the program with the PAS16 card, and 
  119. it does work.  Covox compatibility (default) is likely not 
  120. explicitly provided by other sound card vendors.  However, it 
  121. may be generally useful to those whose cards are capable of 
  122. polling the ADC independently (without explicit commands for 
  123. controlling sampling); MicFFT provides a means for changing the 
  124. default ADC port address.  In the Covox mode, MicFFT simply 
  125. looks for data at this port at a defined rate using timing 
  126. routines in the program.  The default port address included in 
  127. the program is 22F (hex).  This is actually a port address 
  128. (0x220h) and ADC offset (0x00F) added together.  If you have a 
  129. card where a port address is given in the documentation, and an 
  130. ADC input offset is also given, just add the two together (using 
  131. a hex calculator) and use the -P flag to let MicFFT know which 
  132. address you need to use.  I realize that this discussion may be 
  133. a bit technical, but I provide it so that users with cards other 
  134. than the above mentioned can attempt to figure out which options 
  135. to alter.  I know that incompatibility is frustrating, so if you 
  136. have a card which is not explicitly supported (and there is 
  137. really a growing list), I will include compatibility for such 
  138. cards for those who can get me specific code for PCM sampling.  
  139. I prefer to have short code segments (in C, or assembler if 
  140. possible) to look at rather than libraries, since I need to be 
  141. able to control some of the aspects of sampling, and I need you 
  142. to volunteer for testing the modified code.  Contact me at the 
  143. address provided (see Contacting the Author), and I will happily 
  144. discuss your specific needs.  (It should be noted that I am 
  145. currently porting the program to Windows.  This will be helpful, 
  146. since compatibility would not be an issue here, so long as the 
  147. hardware has the appropriate PCM driver setup in Windows.)
  148.  
  149.  
  150. Lesson 1.  PCM sampling:
  151.  
  152. Sampling is a process whereby a continuous stream of data is 
  153. broken up into chunks of data usable by the sampling system.  
  154. PCM sampling is a process whereby this continuous data is polled 
  155. ata defined rate.  Since we are interested in analog signals 
  156. most of the time (the type that enter our sound cards via the 
  157. ADC port), it is necessary to first transform the data from an 
  158. analog representation to a digital one.  This is the job of the 
  159. ADC.  This process is fairly complicated, but suffice it to say 
  160. that an analog value (from - infinity to + infinity) is 
  161. transformed to an explicit digital value.  Since the digital 
  162. value can represent only a discrete value, there may be some 
  163. loss of resolution in this transformation.  16 bit cards (which 
  164. can represent 64K different input levels) are much more accurate 
  165. for this purpose than 8 bit cards (which only can reproduce 256 
  166. different levels).  Also, since PCM-sampling assumes that the 
  167. analog waveform has components on either side of zero (i.e. 
  168. negative and positive parts of a wave), one half of the digital 
  169. range is negative, the other half positive.  This reduces the 
  170. number of possible digital absolute value amplitudes by a factor 
  171. of two, which affects the dynamic range (i.e. the lowest to 
  172. highest amplitude) of a particular digital system.
  173.  
  174. Digital conversion produces a sample value, and this is done at 
  175. a discrete sampling frequency so that points of a continuous 
  176. analog waveform are approximated by a set of digital values.  
  177. These digital values can be stored into the computer's memory 
  178. and played back to reproduce an approximation of the original 
  179. analog waveform.  The process of rebuilding an analog waveform 
  180. from digital samples requires that the samples are "played back" 
  181. at a rate similar to the rate at which the samples were 
  182. originally obtained.  To do this, each sample is transformed 
  183. from a digital value to an analog value (using a digital-to-
  184. analog converter, or DAC) and this is done for all of the stored 
  185. samples at the chosen sampling frequency.  Thus, an 
  186. approximation of the original analog waveform can be reproduced.  
  187.  
  188. The accuracy of sampling thus depends on two major variables:  
  189. the sampling rate and the number of possible sample values.  The 
  190. sampling rate can affect accuracy since it defines the highest 
  191. possible frequency from the original waveform that can be 
  192. sampled.  The Nyquist sampling theorem dictates that the 
  193. sampling rate must be at least twice the frequency of the 
  194. highest frequency component to be sampled.  Thus, frequencies 
  195. greater than one-half the sampling frequency (the Nyquist limit) 
  196. will not be sampled accurately.  Attempting to surpass this 
  197. limit will introduce errors into the sampled waveform.  To get 
  198. around this limitation in practical sampling systems (e.g. 
  199. digital Compact Disc recording and playback, etc.), engineers 
  200. utilize low-pass filters which attenuate signals of frequencies 
  201. higher than the Nyquist limit prior to digital sampling.  For 
  202. CDs, which have a sampling rate of 44.1 kHz, these low-pass 
  203. filters begin attenuating at about 21 kHz and have reduced the 
  204. signal at the Nyquist limit of 22.05 kHz almost entirely.  Thus, 
  205. a CD can have data sampled upto about 22 kHz, but no higher, and 
  206. is thus "bandwidth-limited."  Sampling any higher frequencies 
  207. would create undesirable noise in the output.  (Note that 44.1 
  208. kHz is chosen because it is about the lowest value for 
  209. accurately sampling the spectrum of frequencies important in 
  210. musical signals; about 15 Hz to 20 kHz.  Any higher value would 
  211. be unnecessary and would require an increase data storage, an 
  212. obvious limitation for a system with two digital PCM channels 
  213. and error-correction data included with the PCM data).   
  214.  
  215. The second limitation to accurate PCM sampling is related to the 
  216. number of bits each sample contains.  CD sampled material is 16-
  217. bit PCM.  This corresponds to a dynamic range of about 96 
  218. decibels (dB).  Systems using smaller sized samples will 
  219. obviously have a lower dynamic range.  Thus, they will have an 
  220. inherently higher level of noise, and are inappropriate for 
  221. high-fidelity reproduction of sound.  Of course, the tradeoff 
  222. between sound quality and data storage is an important design 
  223. consideration in any PCM system.
  224.  
  225.  
  226. Lesson 2.  Superposition:
  227.  
  228. It is fairly easy to figure out what a sinewave looks like from 
  229. an oscilloscope plot.  You've likely heard what a sinewave 
  230. sounds like; pretty boring.  A simple sinewave can produce a 
  231. tone.  However, most sound that we hear and find pleasing has 
  232. much more content than a single sinewave.  Musical instruments 
  233. produce waveforms with a fundamental (do not confuse with my 
  234. terminology below; fundamental here refers to the primary 
  235. frequency created by an instrument) frequency (sinewave) and a 
  236. group of harmonic sinewaves at multiples of the fundamental.  
  237. These "harmonics" give each instrument a recognizable sound, or 
  238. timbre.  When we break up the waveform, it is possible to show 
  239. that the original waveform is thus the addition of the 
  240. fundamental sinewave and all of its harmonic sinewaves.  This 
  241. addition is called superposition.  Of course, superposition can 
  242. be both additive, or destructive.  Destructive superposition can 
  243. actually cancel out the amplitudes of two waveforms (for 
  244. example, if both are of the same frequency and amplitude, but 
  245. are 180 degrees out of phase; i.e. the peak of the first wave 
  246. corresponds to the trough of the second).  If you listen to two 
  247. sinewaves being reproduced by the FM chip on your sound card (if 
  248. you have one), you will be listening to superimposed sinewaves.  
  249. However, since your ear is able to pull out the discrete 
  250. frequencies in the signal, you hear two sinewaves (sort of like 
  251. the FFT routine described below).  Pretty neat, huh?
  252.  
  253.  
  254. Lesson 3.  Fourier Transforms:
  255.  
  256. Many of you may have seen programs that take PCM sampled sound 
  257. and output the data on the screen in an oscilloscope-like 
  258. display.  In this case, the plot is based on amplitude vs. time.  
  259. It is possible to determine the relative frequency of a 
  260. continuous waveform by varying the sweep-rate of such an 
  261. oscilloscope, but there are better ways to gather frequency data 
  262. from PCM samples.  One approach is to pass the data through an 
  263. algorithm called a Fast Fourier Transform (FFT) and to plot the 
  264. resulting data as a magnitude vs. frequency plot.  Essentially, 
  265. the FFT loops thru a group of samples and pulls out all of the 
  266. sinewaves contained in the sampling period (delta).  Since we 
  267. know the sampling rate (and thus, the time between samples), it 
  268. is possible to assign frequency values to the sinewaves 
  269. determined by the FFT.  So, the Fourier Transform works like the 
  270. superposition principle in reverse.  
  271.  
  272. The first sinewave is the lowest possible sinewave that can be 
  273. sampled accurately by the FFT, and corresponds to the sampling 
  274. frequency divided by the number of samples in delta.  I refer to 
  275. this as the fundamental frequency of the plot, F-fund.  The 
  276. frequency band plotted is twice F-fund, and the next is 3X, and 
  277. so on.  Thus, the plotted bands continue up by multiples of F-
  278. fund until we reach the Nyquist limiting frequency (F-Ny), which 
  279. incidentally has a band number equal to 1/2 the number of 
  280. samples in delta (band number is also called channel number; one 
  281. band is plotted for each frequency displayed by MicFFT for a 
  282. particular sampling frequency).  Generally, data is plotted with 
  283. linear scaling along the frequency axis, which means that each 
  284. band plotted represents one frequency.  However, it should be 
  285. noted that frequencies located between two discrete bands will 
  286. be represented as maximal deflections of the two bands on either 
  287. side of this intervening frequency.  Additionally, an even-band 
  288. centered frequency will produce deflections of those bands 
  289. adjacent to it, tapering off as we move in either direction from 
  290. the center band.  One should use care when ascribing a 
  291. particular group of frequencies to a particular plot; as you 
  292. work with MicFFT, you will get an idea of what to expect.
  293.  
  294.  
  295. MicFFT Usage:
  296.  
  297. When you start MicFFT with the appropriate command line 
  298. arguments (see Options), you will be able to begin sampling 
  299. signals entering the ADC.  Whistle into a microphone connected 
  300. to the sound card.  You should see a peak, corresponding to the 
  301. frequency of the whistle.  Since the whistle is produced at the 
  302. lips, there is little interaction with the resonant cavities of 
  303. the body that normally introduce harmonics in speech and 
  304. singing.  Thus, whistling approximates a sinewave and can be 
  305. used to test MicFFT for simple waveforms.  Vary the pitch of 
  306. your whistling.  By reducing the pitch, you should see this peak 
  307. move to the left, thus indicating that the frequency is moving 
  308. lower.  By raising the pitch, the peak should move to the right 
  309. of the plot (note that the degree of peak movement will be 
  310. affected by the chosen sampling frequency).  Note the ruler at 
  311. the bottom of the plot screen.  This ruler corresponds to the 
  312. multiples of the fundamental frequency.  Ones are in white, 
  313. fives are in orange and tens are in red.  You can use the ruler 
  314. to get an instant idea of the relative frequency during sampling 
  315. (if you are quick at math).
  316.  
  317. It is now possible to freeze the plot by pressing the SPACE bar.  
  318. Do this while continuing to whistle.  Once the sampling has 
  319. stopped and you have a frozen waveform frequency spectrum on the 
  320. screen, you can use the arrow keys to move a cursor line around 
  321. the plot.  Move the cursor line to the peak.  Below, you will 
  322. see the frequency for this peak, as well as the amplitude (in 
  323. magnitude returned by the FFT routine, and based on a maximum of 
  324. 128; and in dB, relative to a dynamic range from 1 to 48 dB for 
  325. the 8-bit samples).  Note that the power density is related to 
  326. the area under the peak; the magnitudes shown are plotted only 
  327. for the band under the cursor line.  
  328.  
  329.  
  330. Keys for Freeze Window:
  331.  
  332. To move the cursor line around, use the LEFT or RIGHT keys for 
  333. single band movements.  To speed up movement around the plot, 
  334. use CTRL-LEFT or CTRL-RIGHT to move ten bands for each keypress.  
  335. To move to the right end of the plot, press END or PGDN; to move 
  336. all the way to the left side, use HOME or PGUP.  To return to 
  337. the sampling mode, press the SPACE bar.  To exit the program at 
  338. any time (during sampling or in the freeze window), press ESC.
  339.  
  340.  
  341. Options:
  342.  
  343. MicFFT v1.3 has a number of options which are set by command 
  344. line arguments using specified flags.  It is also possible to 
  345. set some of these options while the program is running (see 
  346. KEYBOARD OPTIONS DURING SAMPLING). Typing MicFFT at the DOS 
  347. prompt without any flags will run the program with the built-in 
  348. defaults.  You can override these defaults using the following 
  349. flags:
  350.  
  351. -?:    Display command line options.  Also -h.
  352.  
  353. -f:    Change the sampling frequency.  -f25000 will change the 
  354. sampling frequency to 25 kHz.  Valid range is from 1 Hz (which 
  355. would take 256 seconds before the first plot; not 
  356. recommended...) and the highest sampling rate of your sound 
  357. card.  For the Covox card, this is 25000 (although I've been 
  358. able to get upto 34090 Hz before getting sampling problems).  
  359. For the Sound Blaster, this is 13 kHz.  For the ProAudio 
  360. Spectrum 16, this is 88200 Hz (and I assume 44100 Hz for the 
  361. original ProAudio Spectrum).  Play around with this option a 
  362. lot.  Default is 10000.
  363.  
  364. -p:    Change the default ADC port address.  Default is 22F 
  365. (hex), which corresponds to the default for the Covox card.  -
  366. f24fh will change to port address/offset 24F.  If you use the 
  367. Sound Blaster mode (see -b flag), the default will be 220.  Note 
  368. that if you supply a hexidecimal address, use an "h" following 
  369. the address to signify that you are using a hex address.  
  370. Decimal addresses are assumed and require no h at the end.  
  371. MicFFT will report the address chosen, so you can verify that 
  372. the correct address has been selected.
  373.  
  374. -b:    Change the sound card mode.  The default is the Covox mode 
  375. (see Sound Cards, above), which is -b0.  For Sound Blaster (or 
  376. compatible) mode, use -b1.  The ProAudio Spectrum is set with -
  377. b2.  
  378.  
  379. -m:    Scaling mode.  Set to -m1 for maximum amplitude mode.  In 
  380. this mode, all amplitude data is scaled on the plot so that all 
  381. amplitudes are scaled to the amplitude of the highest peak in 
  382. the plot.  Set to -m0 for log amplitude scaling; log amplitude 
  383. scaling is in dB, so this may be more suitable for some signals.  
  384. -m0 is the default.
  385.  
  386. -l:    Line mode.  Set to -l1 for line plot mode.  In this mode, 
  387. lines are drawn between points corresponding to amplitudes of 
  388. successive bands.  Set to -l0 for bar graph mode.  In this mode, 
  389. each frequency band is plotted distinctly, from the bottom of 
  390. the plot to each amplitude point.  -l0 is the default.
  391.  
  392. -c:    Cosine envelope.  Type -c to turn on the cosine envelope 
  393. function.  This adds a filter that prescales the data to remove 
  394. discontinuities at either end of the waveform before entering 
  395. the FFT routine.  This may produce a more stable display for 
  396. waveforms that are not rapidly changing, and will reduce the 
  397. magnitudes of data around improperly centered frequencies.  On 
  398. some computers (particularly those without math coprocessors), 
  399. this will increase the computation time somewhat.
  400.  
  401. -s:    Squelch mode.  To remove low-level noise from the input, 
  402. to clean up the plot, use -s.  This removes any samples above 
  403. and below the zero level.  For example, -s10 will remove all PCM 
  404. samples between -10 and +10.  Use this option carefully, since 
  405. it can create square-waves, which have a variety of frequency 
  406. components that will pollute the spectrum.  I do not recommend 
  407. values of greater than, say 10 for 8 bit sampling.
  408.  
  409. -d:    DC Offset.  Generally, 8 bit cards represent zero level 
  410. signals as 128.  To produce an AC wave centered around zero, 
  411. MicFFT subtracts the DC offset (128) from the input values.  It 
  412. is possible that the DC offset is not perfectly centered at 128.  
  413. For example, it is my experience that the PAS16 I've tested 
  414. under SB compatability mode is actually centered about 108.  
  415. Thus, by typing -d108 on the command line, the zero level is 
  416. correctly centered.  This is particularly important for the 
  417. cosine envelope function, since a large DC offset will produce a 
  418. corresponding deflection of the first band on the plot (i.e. the 
  419. fundamental frequency band).  If you encounter problems of this 
  420. sort, it is recommended that you experiment with this value.  
  421. Unfortunately, this version does not perform this automatically.
  422.  
  423. -e and -v:  Force EGA or VGA mode, respectively.  The default is 
  424. to use the maximum resolution of the monitor, based on the mode 
  425. the monitor is set to when MicFFT is started.  -e has lower 
  426. resolution, but may be faster on some VGA monitors.  It also 
  427. produces a somewhat larger plot.  -v was added for consistency.    
  428.  
  429.  
  430. Note that all options can be entered using either the - or / 
  431. switch.  Case is not important, but you must not include white 
  432. spaces for any particular flag, since MicFFT will ignore any 
  433. options that do not conform to this syntax.  Order is also not 
  434. important, since the options are collected and verified before 
  435. any setup occurs.  I recommend that you create a batch file that 
  436. has your required configuration (for example, port and plotting 
  437. mode specs) along with a couple of %n's to allow additional 
  438. parameters to be entered.  For example:
  439.  
  440. @echo off
  441. REM RUNMF.BAT  --  Batch for running MicFFT with set config.
  442. MicFFT -p24Fh -m1 -l1 %1 %2 %3 %4
  443.  
  444.  
  445.  
  446. Keyboard Options During Sampling:
  447.  
  448. MicFFT v1.2 now has a few options that can be set during the 
  449. sampling period, rather than requiring command line flags for 
  450. all options.  The following summarizes key usage during 
  451. sampling.  For information regarding key usage in the Freeze 
  452. Window, see above.
  453.  
  454. c        Toggle cosine envelope.
  455.  
  456. l        Toggle line/bar plot modes.
  457.  
  458. m        Toggle amplitude scaling (linear vs. logarithmic).
  459.  
  460. a        Toggle wait for data available during sampling (SB 
  461.         mode only).
  462.  
  463. x        Toggle display of phase data.
  464.  
  465. s        Toggle display of raw PCM data.
  466.  
  467. []        Decrease or increase (respectively) sampling     
  468.         frequency by 10 Hz.
  469.  
  470. {}        Decrease or increase (respectively) sampling     
  471.         frequency by 100 Hz.
  472.  
  473. ./        Decrease or increase (respectively) sampling     
  474.         frequency by 1000 Hz.
  475.  
  476. <SPACE>     Freeze sampling and display Freeze Window.
  477.  
  478. <ESC>        Exit program.
  479.  
  480.  
  481.  
  482. Performance and Hardware-Specific Notes:
  483.  
  484. As stated above, MicFFT frequency accuracy should not be 
  485. affected by different machine speeds, since the sampling is done 
  486. in a loop separate from the other routines, and uses the PC's 
  487. internal 8253 timer chip for accuracy in the fractional 
  488. microsecond range.  However, the Sound Blaster mode may not be 
  489. as accurate, because a number of additional steps are required 
  490. for sampling that will certainly increase the processing time.  
  491. Since I don't have a Sound Blaster card, it is not possible for 
  492. me to test this out.  Chris Pye, who wrote the Sound Blaster 
  493. routines, has observed frequency problems, but only when the 
  494. sampling rate exceeded 13 kHz.  Try this out for yourself.  If 
  495. you use a tuning fork (or some other stable frequency 
  496. generator), you should get approximately similar frequency peaks 
  497. at different sampling frequencies.  Keep in mind that any error 
  498. introduced by this extra processing will affect high sampling 
  499. rates.  Thus, compare low rates with very high rates.  If the 
  500. frequency display is stable, everything should be pretty 
  501. accurate. 
  502.  
  503. In SB-mode, MicFFT polls the ADC port (default address at 220 
  504. hex) after testing the data available port.  The data available 
  505. port is set high when the ADC has sampled and confirmed the next 
  506. input sample.  However, you can turn off this checking using the 
  507. "a" key (as described above).  This will enable the program to 
  508. oversample the ADC by not testing for the next sample value.  It 
  509. is possible to observe stair-stepping in the raw PCM samples 
  510. using this approach, but it should be noted that the accuracy of 
  511. the plot will also be affected.  For example, this will produce 
  512. sqare waves, which will have a variety of high-frequency 
  513. components.  It may be possible to sample at a slightly higher 
  514. frequency, since this extra looping is removed from the 
  515. processing.  However, once the maximum sampling rate is reached, 
  516. it is not possible to get any additional information.  I left 
  517. this in the program just as a "gee-whiz" sort of feature.  If 
  518. you want to do serious spectral analysis, I'd suggest not using 
  519. this feature.  However, you can see just how fast the program 
  520. can calculate the FFTs by turning off checking and speeding up 
  521. the sample rate.  Just be cognisant of the limitations 
  522. mentioned.
  523.  
  524. I have noticed that it is not possible to sample at a rate 
  525. higher than 34090 Hz (not even 34091!) on the Covox card.  When 
  526. I try, I get no output (or output only in the first channel).  I 
  527. don't know why this occurs, but it is probably related to the 
  528. way in which this specific card samples data, as well as my 
  529. machine's clock rate (33 MHz).  I assumed that I would see a 
  530. smearing of frequency at these higher rates (i.e. shifting to 
  531. reflect a lower actual rate than set by the program), but rather 
  532. this is a brick wall beyond which sampling doesn't work.  In a 
  533. way, I much prefer this, since it helps to know that the program 
  534. is accurate upto this maximum rate.  Again, it is important to 
  535. test this out on each system, if you are really interested in 
  536. accurate, high-frequency sampling.  In this respect, I may move 
  537. to DMA-controlled PCM sampling support for the Covox, Sound 
  538. Blaster Pro and Pro Audio Spectrum cards in future releases.  
  539. This would allow the card itself to do the work of ensuring 
  540. accurate sampling.
  541.  
  542. Of all the cards tested, the ProAudio Spectrum 16 is the most 
  543. stable and is capable of impressive performance.  The card is 
  544. capable of sampling at 88200 Hz, which means that the entire 
  545. spectrum encountered in perceptible audio signals is represented 
  546. in plots produced by the program (20-20,000 Hz).  This card also 
  547. has a preset hardware anti-aliasing filter (in the form of a 
  548. programmable capacitor network at both the input and output of 
  549. the analog stages).  When MicFFT is initiated, the defined 
  550. sampling rate preselects the appropriate best-match filter for 
  551. the chosen sampling rate.  If you start the program with the -
  552. f88200 flag, all frequencies below at least 20kHz should be 
  553. represented properly.  Thus, I recommend adding this flag when 
  554. starting the program using the ProAudio Spectrum card, unless 
  555. you wish to use a lower frequency filter setting to keep 
  556. aliasing out of the picture.  Also, it is important that the 
  557. "Digital Audio" setting (set using the command PAS * at the DOS 
  558. prompt) be set, since the program does not currently adjust 
  559. mixer settings.  If you do not set this to zero, you will get a 
  560. great deal of bothersome feedback.  However, if you set this to 
  561. a value of about 50% or so, it is possible to hear the different 
  562. anti-aliasing filters kicking in upon initiation of sampling, if 
  563. you have a signal impinging on the ADC at this point (for 
  564. example, CD audio). 
  565.  
  566. The refresh rate (i.e. the amount of time between sampling 
  567. periods) will vary, depending on the machine used.  MicFFT is 
  568. set up to sample 256 data points, transform and plot out the 
  569. data, then repeat this.  On slow machines, the refresh rate will 
  570. be low; on fast machines, particularly those equipped with 
  571. floating-point coprocessors, it will be impressively fast.  
  572. Nevertheless, it is important to stress that the time spent 
  573. processing the data is time spent not sampling.  Thus, events 
  574. occuring between sampling periods will be ignored.  This may be 
  575. problematic with time-varying signals, particularly those with 
  576. substantial transient components.  For this reason, it is 
  577. necessary to carefully analyze the plot for such data.  
  578. Sometimes, the plot will miss these transients.  If this is a 
  579. concern, I suggest slowing the sampling rate to the lowest 
  580. allowable frequency (based on the bandwidth of the signal), as 
  581. this will increase the chance of capturing this varying signal 
  582. in the plot.  You can freeze a waveform, but this is difficult 
  583. with rapidly varying signals.  A more suitable approach would be 
  584. to sample the waveform and select the parts of a time-domain 
  585. plot to display.  Future versions of MicFFT will include this 
  586. feature.  Also note that the cosine envelope will reduce the 
  587. refresh rate, because it adds a lot of floating-point 
  588. calculations.  The show PCM mode (turned on by pressing the "s" 
  589. key) will also slow down the refresh rate.  This is due to the 
  590. extra graphics processing occuring.  It is possible to cycle 
  591. between off, line-draw and pixel plot for this option.  I 
  592. suggest pixel plot for the quickest display of the PCM data, 
  593. since large-amplitude waveforms will not affect the graphing 
  594. speed.  The line-draw is somewhat slower for large-amplitude 
  595. waveforms since the program must calculate and graph not only 
  596. the endpoints, but all of the points on the line as well.  Of 
  597. course, the line-draw mode looks nicer.  Finally, the show-phase 
  598. option (toggled by the "x" key) can also slow down the refresh 
  599. rate.  All of the graphics options should be tested for a 
  600. particular system to determine the optimal trade-off between 
  601. performance and the desired information.  
  602.  
  603. I have gotten some flak from a variety of people about the 
  604. sluggishness of the program.  I was a bit suprised, because I 
  605. was observing pretty suitable performance from the program on my 
  606. 486DX.  However, after disabling coprocessor support for the 
  607. program, I was amazed at how slow the program can be.  As a 
  608. test, you can set an environmental variable to ignore the 
  609. coprocessor if your computer is equipped with one.  To do this, 
  610. just type "SET NO87=Boy is this program slow!" at the DOS 
  611. prompt, then run the program.  This is one of those tests where 
  612. you will feel pretty lucky to have a coprocessor, if you ever 
  613. wondered what it was good for.  I believe the speed difference 
  614. is probably on the order of about 10 to 50 fold.  If your 
  615. computer doesn't have a coprocessor, you may wish to purchase 
  616. one, particularly if you do a lot of number crunching.  As far 
  617. as MicFFT goes, there is pretty much no way around it.  There 
  618. are a LOT of calculations going on, and anytime the processor 
  619. can offload some for a little cheap "parallel" processing the 
  620. better.  I guess I might be able to enhance performance somewhat 
  621. by coding the routines entirely in assembly, but I have other 
  622. things to do with my time.
  623.  
  624. It is important to be cognisant of the Nyquist limit for any 
  625. particular waveform, as signals with components exceding the 
  626. limit will be "aliased" and not represented properly by the 
  627. spectral plot.  As I described above, frequencies above the 
  628. Nyquist limit will produce errors (aliasing) unless these are 
  629. removed from the signal before they are sampled.  This is 
  630. interesting in one respect: set the sampling frequency to about 
  631. 4000 Hz and start a low whistle.  As you increase the frequency, 
  632. you will notice that the peak wraps around as it moves to the 
  633. right side of the plot.  If it goes far enough, it will also 
  634. wrap around the left side of the plot as well.  This a very 
  635. graphic demonstration of aliasing.  Beyond the academics, 
  636. aliasing can be a serious problem to accurate spectral analysis.  
  637. MicFFT does not yet have any low-pass filtering built in 
  638. (although future versions may include this), so you will have to 
  639. consider aliasing when chosing a particular signal and sampling 
  640. frequency.  If you are capable, it is possible to add a low-pass 
  641. filter to the input line of your signal generator (or mic) to 
  642. eliminate these higher frequencies.  Your sound card may even 
  643. provide for this type of bandwidth limiting (incidentally, the 
  644. PAS16 does, and is set to the best match when the program 
  645. starts, based on the initial frequency value).
  646.  
  647. MicFFT is not designed to compete with hardware spectrum 
  648. analyzers (not yet, at least).  But, since these hardware 
  649. analyzers are many thousands of dollars, the cost of this 
  650. approach is more suitable for many applications, particularly 
  651. experimentation into sound, etc.  Although you may come up with 
  652. interesting ideas, I don't yet recommend its use in building the 
  653. next-generation Hubble Telescope, etc.  However, it might work 
  654. really well in analysis of Cold Fusion experiments.  If you have 
  655. any results in this arena, please inform me so I can buy the 
  656. stock (SEC, just kidding already!).
  657.  
  658.  
  659. Acknowledgements:
  660.  
  661. I'd like to take this opportunity to thank many of you who 
  662. downloaded MicFFT v1.0 and v1.1 and sent comments to me about 
  663. the program.  Since I've not asked for a fee for the program, at 
  664. least it gives me a little ego boost, and makes the programming 
  665. a bit more fun.  Your comments and criticisms have certainly 
  666. made development a more enlightened process.
  667.  
  668. Andy Charmatz, here at UCLA, has been a fantastic help in 
  669. getting the SB routines to work with the PAS16, as well as the 
  670. implementation of the PAS16-specific coding.  He lent me his 
  671. PAS16 so that I could test out the SB routines and find out 
  672. where the real problems were occuring.  As it turns out, MicFFT 
  673. didn't really crash the computer when it was having problems 
  674. with the PAS compatability, it was just not getting info from 
  675. the data available port.  So it goes for SB compatability!  
  676. Incidentally, if you have a card which does not work with this 
  677. program, I'd be happy to make arrangements to work some routines 
  678. into the program to make it run properly. 
  679.  
  680. Chris Pye has been instrumental in making MicFFT compatible with 
  681. Sound Blaster cards.  He also provided code for the freeze-
  682. window routine and the cosine-envelope function.  He knows a lot 
  683. more about Fourier transforms than I (I'm a molecular biology 
  684. grad student, and just a engineering/physics hacker), and I'll 
  685. be working with him a lot in the future for developing better 
  686. versions of the program.  Additionally, the FFT routines used in 
  687. this program are based on those implemented in an archive called 
  688. FFT.ARC found on Compuserve by the author Steve Sampson, as well 
  689. as those found in a book called Numerical Recipes in C.  The 
  690. 8253 timer routines (which have extraordinary accuracy) are 
  691. based on a Compuserve archive called TIMERH.ARC, uploaded by the 
  692. author Micahel Walraven.  I am indebted to the work of these 
  693. authors.
  694.  
  695.  
  696. Conditions of Use:
  697.  
  698. MicFFT v1.2 is freeware, which means that I continue to hold the 
  699. rights to the program (i.e. it is not released into the public 
  700. domain).  You are entitled to copy the program, and are 
  701. encouraged to post the program on BBSs, distribute it to 
  702. friends, etc.  However, if you use the program, I ask that you 
  703. contact me (see Contacting The Author) to let me know what you 
  704. are using it for, its fitness, and other comments, problems, 
  705. etc.  When and if I decide to charge for my work, I won't 
  706. require this.  When I download programs I find interesting, I 
  707. often notify the author out of courtesy.  Usually, I get lots of 
  708. ideas as well.  You may find that such discourse can be fun and 
  709. interesting.  On the other hand, you may find that I don't know 
  710. anything about this stuff.  You'll just have to try me.  The 
  711. code for MicFFT is not available, unless you make specific 
  712. arrangements with me first.  The main reason for this is that I 
  713. want to maintain control of the development of the program.  If 
  714. you have good ideas, and are proficient in coding, I'll make 
  715. exceptions.  
  716.  
  717.  
  718. Future Directions:
  719.  
  720. I've initiated work on the next version, which should be 
  721. available much sooner than this version has taken (I've been 
  722. pretty busy with other things).  The next version will 
  723. definitely include DMA-based input, and perhaps if some of you 
  724. contact me soon, support for other cards (like the SB Pro 16 
  725. ASP, etc).  Also, I will include support for 16 bit sampling for 
  726. cards where this is permissible.  I may also include stereo 
  727. sampling, although I've not quite determined the usefulness of 
  728. it in this context (ideas? ideas?).  Additionally, a few other 
  729. windowing functions will be included ( Hamming-Hanning, Parzen, 
  730. etc), as well as digital lowpass filtering.  I am also playing 
  731. around with the FM chip (Adlib compatibles) so that it will be 
  732. possible to use the FM chip to produce test signals that can be 
  733. analyzed (particularly useful for us speaker builders!).  I have 
  734. been writing some very fast graphics routines, so I hope to 
  735. increase the speed of the program output by implementing them.  
  736. Additionally, I will definitely provide a REAL user interface in 
  737. the next version, with all the buttons, etc.  I recently 
  738. purchased MS Visual C++, and will eventually produce a program 
  739. for Windows-based sound analysis.
  740.  
  741.  
  742. Contacting The Author:
  743.  
  744. You can contact me at the following E-mail addresses:
  745.  
  746. Compuserve 70701,1614
  747. Internet: walsh@biovx1.dnet.nasa.gov
  748.  
  749. (Incidentally, I don't work for NASA, but our mail-server here 
  750. at UCLA is named this way for some strange reason).  
  751.  
  752. I can also be contacted by phone at my Los Angeles residence at 
  753.  
  754. (310) 390-0598
  755.  
  756. Please note that I'd prefer to get mail via Internet, since my 
  757. Compuserve bills have been skyrocketing (and I'm just a poor, 
  758. lowly grad student).  You can do this on Compuserve by sending 
  759. the mail to an Internet address (see the help screen for the 
  760. specifics here.  I don't recall offhand how to do this).  I 
  761. check my mail on the Internet on a daily basis; I check 
  762. Compuserve much less frequently.  For a super low-tech approach, 
  763. you can send a post via hardcopy to:
  764.  
  765. Craig Walsh
  766. 12420 Woodgreen Ave #203
  767. Los Angeles, CA 90066
  768.  
  769.  
  770. Have fun, and good luck with MicFFT v1.2.  Let me know what you 
  771. think.
  772.