Hello everyone,
I am a DSP hobbyist of sorts and I have discovered a technique for
frequency determination (and magnitude and phase) for the
constituent wave components of "nice" signals that I have not seen
anywhere in my web searches.
(Engineers should page down to the numbers now. Read this later.)
By "nice", I mean signals that are composed of linear combinations
of pure tones that are reasonably well spaced in frequency compared
to the FFT resolution. My goal is add a digital frequency display
of the dominant frequencies to a audio recording program I have
written. Thus the program could be used as a tuner for tuning
instruments to nonchromatic scales. I have no idea how it is
going to work with real world data, but I am hopeful.
The technique is quite straightforward and can probably rightly
be called "quick and dirty":
Step 1. Do a straight up FFT (No Hanning Window)
Step 2. Do a "Peak Deframing Transform" (PDT) on the FFT output
Step 3. For each Magnitude Peak in the PDT:
Empirically Calculate Constituent Wave Parameters
All the magic seems to occur in Step 2. The transform consists simply
of subtracting from each FFT coefficient the average of its neighbors.
This is a linear transform so it preserves the magnitude. It also
seems to make the output magnitude spectrum invariant on the input
phase or "FFT bin", as well as introducing symmetry. The phase angles
are much better behaved as well. I called it "Peak Deframing" because
it makes the exact frequency spikes a little smeared out and the smeared
out fractional frequencies a lot more localized. In other words, it
doesn't matter as much how you frame your signal with FFT windows, you
are going to get visually perceptively similar results. I think
you can call it much better behaved for my purposes.
Because of the invariances and the symmetries, I found it much easier
than I thought to derive empirical approximation equations to apply
to the peaks. I also found much simpler and more accurate equations
than I expected. All the empirical equations were derived by "playing
with the numbers" and reducing the equations to their simplest form.
My attempts at a theoretical proof quickly ran into a algebraic thicket
I didn't want to mess with. If anyone is sporting, or this has already
been done, I would love to see it.
The nature of the phase approximation equation, and the nature of the
data, lead me to believe there are better equations based on the underlying
DFT coefficients (as complex numbers or vectors). These equations would save
many square root and arctangent calculations. These are what I will be
searching for next, as well as ways to resolve nearby frequencies.
Since more people tend to be interested in results, I have listed them first.
I then show the code for the PDT and the empirical approximating equations.
Finally, I have run the equations on a wide range of single wave input tones
to give a baseline accuracy assessment.
Again, I am not an expert in the field, so if this is a well known technique,
please forgive my renaming of things.
Warm regards,
Anders
==============================================================================
==============================================================================
Two Component Signal
Signal_Real#(I&) = 0.97 * Sin( 6.1 * Angle#) + _
0.97 * Cos(16.1 * Angle#)
FFT PDT
---------------------------- ----------------------------
Real Imag Magn Phas Real Imag Magn Phas
----- ----- ------ ------ ----- ----- ------ ------
1 0.012 0.005 0.0134 1.1985 0.000 0.000 0.0006 3.8140
2 0.014 0.011 0.0172 0.9032 -0.001 -0.001 0.0013 3.5699
3 0.016 0.019 0.0245 0.6925 -0.001 -0.003 0.0035 3.4924
4 0.020 0.034 0.0392 0.5407 -0.004 -0.013 0.0133 3.4646
5 0.033 0.074 0.0807 0.4234 -0.128 -0.393 0.4130 3.4560
6 0.302 0.899 0.9481 0.3237 0.298 0.917 0.9638 0.3140 0.9701 6.1000 6.2830
7 -0.025 -0.109 0.1120 3.3708 -0.173 -0.531 0.5579 3.4560
8 -0.007 -0.056 0.0563 3.2718 0.006 0.018 0.0193 0.3035
9 -0.001 -0.039 0.0394 3.1594 0.001 0.004 0.0045 0.2489
10 0.004 -0.032 0.0319 3.0250 0.000 0.002 0.0018 0.0619
11 0.008 -0.027 0.0286 2.8616 0.000 0.001 0.0011 5.8725
12 0.013 -0.025 0.0285 2.6682 -0.001 0.001 0.0016 5.3452
13 0.021 -0.025 0.0325 2.4546 -0.003 0.001 0.0036 5.1117
14 0.035 -0.028 0.0445 2.2421 -0.013 0.004 0.0133 5.0419
15 0.074 -0.039 0.0839 2.0527 -0.393 0.128 0.4130 5.0269
16 0.899 -0.306 0.9499 1.8984 0.917 -0.298 0.9638 1.8848 0.9700 16.1000 1.5707
17 -0.109 0.023 0.1112 4.9213 -0.531 0.172 0.5580 5.0267
18 -0.056 0.007 0.0561 4.8333 0.018 -0.006 0.0192 1.8818
19 -0.039 0.002 0.0393 4.7694 0.004 -0.001 0.0044 1.8740
20 -0.031 0.000 0.0313 4.7240 0.002 0.000 0.0017 1.8620
21 -0.027 -0.001 0.0266 4.6926 0.001 0.000 0.0008 1.8466
22 -0.024 -0.001 0.0235 4.6719 0.000 0.000 0.0005 1.8283
23 -0.021 -0.001 0.0214 4.6595 0.000 0.000 0.0003 1.8078
24 -0.020 -0.001 0.0199 4.6533 0.000 0.000 0.0002 1.7855
25 -0.019 -0.001 0.0187 4.6521 0.000 0.000 0.0001 1.7617
26 -0.018 -0.001 0.0179 4.6548 0.000 0.000 0.0001 1.7368
27 -0.017 -0.001 0.0172 4.6604 0.000 0.000 0.0001 1.7108
28 -0.017 -0.001 0.0167 4.6683 0.000 0.000 0.0001 1.6840
29 -0.016 -0.001 0.0163 4.6779 0.000 0.000 0.0001 1.6564
30 -0.016 0.000 0.0161 4.6888 0.000 0.000 0.0001 1.6283
Things to look for:
The FFT coefficients have been normalized
Uniformity in the two peaks in the PDT magnitudes
The 180 degree flip and the persistence in the PDT phases around a peak
Quick die off of PDT magnitudes near the peaks
A Cosine signal is just a PI/2 phase shift of a Sine signal
Near 2*PI = Near 0
==============================================================================
A More Complicated Mixed Signal
Signal_Real#(I&) = 0.97 * Sin( 6.1 * Angle# ) + _
1 * Sin(11 * Angle# + 0.1) + _
1.234 * Sin(19.5 * Angle# + 0.2) + _
1.234 * Sin(23.8 * Angle# ) + _
0.5 * Sin(27.5 * Angle# + 2 ) + _
0.5 * Sin(29 * Angle# + 2 ) + _
0.97 * Cos(16.1 * Angle# )
FFT PDT
---------------------------- ----------------------------
Real Imag Magn Phas Real Imag Magn Phas
----- ----- ------ ------ ----- ----- ------ ------
1 0.084 0.003 0.0837 1.5407 0.000 0.000 0.0006 3.9580
2 0.085 0.006 0.0852 1.5013 -0.001 -0.001 0.0014 3.6524
3 0.088 0.012 0.0885 1.4380 -0.001 -0.003 0.0035 3.5291
4 0.093 0.024 0.0961 1.3184 -0.004 -0.013 0.0133 3.4756
5 0.107 0.061 0.1234 1.0507 -0.128 -0.393 0.4130 3.4565
6 0.377 0.884 0.9610 0.4030 0.298 0.917 0.9638 0.3138 0.9701 6.1000 6.2828
7 0.052 -0.127 0.1369 2.7541 -0.173 -0.530 0.5579 3.4565
8 0.072 -0.077 0.1052 2.3860 0.005 0.019 0.0193 0.2873
9 0.082 -0.063 0.1033 2.2310 0.001 0.004 0.0045 0.1607
10 0.090 -0.059 0.1073 2.1540 -0.050 -0.496 0.4981 3.2428
11 0.198 0.936 0.9569 0.2086 0.099 0.996 1.0012 0.0987 1.0012 11.0006 0.0968
12 0.109 -0.061 0.1254 2.0805 -0.052 -0.496 0.4990 3.2463
13 0.125 -0.066 0.1414 2.0570 -0.005 0.002 0.0052 5.0868
14 0.150 -0.075 0.1678 2.0325 -0.015 0.005 0.0160 5.0362
15 0.206 -0.094 0.2260 1.9977 -0.397 0.129 0.4178 5.0264
16 1.056 -0.371 1.1191 1.9083 0.907 -0.295 0.9535 1.8856 0.9617 16.1153 1.5233
17 0.093 -0.057 0.1092 2.1207 -0.560 0.179 0.5883 5.0219
18 0.251 -0.102 0.2708 1.9570 -0.188 0.037 0.1912 4.9067
19 0.784 -0.221 0.8143 1.8454 1.030 -0.207 1.0503 1.7695 1.2528 19.5185 0.1407
20 -0.743 0.075 0.7463 4.8133 -1.027 0.212 1.0490 4.9156
21 -0.214 -0.052 0.2203 4.4731 0.199 -0.031 0.2018 1.7275
22 -0.084 -0.117 0.1438 3.7669 -0.003 0.041 0.0414 6.2004
23 0.053 -0.263 0.2687 2.9448 0.482 -0.649 0.8083 2.5026
24 -0.775 0.887 1.1781 5.5653 -0.700 0.976 1.2011 5.6605 1.2345 23.7943 0.0237
25 -0.201 0.087 0.2194 5.1190 0.265 -0.343 0.4333 2.4846
26 -0.157 -0.028 0.1597 4.5384 0.053 0.055 0.0763 0.7669
27 -0.219 -0.252 0.3339 3.8573 -0.171 -0.392 0.4278 3.5527
28 0.061 0.308 0.3140 0.1957 -0.048 0.488 0.4899 6.1850
29 0.437 -0.107 0.4501 1.8108 0.421 -0.286 0.5090 2.1680 0.5288 28.7576 2.9297
30 -0.028 0.050 0.0579 5.7717 -0.231 0.093 0.2493 5.0941
Things to look for:
Distortion effects of nearby components (compare to two component sample)
Failure of algorithm to resolve the 27.5 and 29 cycle components
==============================================================================
The PDT - Peak Deframing Transform
For I& = 1 To ClipLimit& - 1
PDT_R# = FFT_Real#(I&) - 0.5 * (FFT_Real#(I& - 1) + FFT_Real#(I& + 1))
PDT_I# = FFT_Imag#(I&) - 0.5 * (FFT_Imag#(I& - 1) + FFT_Imag#(I& + 1))
PDT_Real#(I&) = PDT_R#
PDT_Imag#(I&) = PDT_I#
PDT_Magn#(I&) = Sqr(PDT_R# * PDT_R# + PDT_I# * PDT_I#)
PDT_Phas#(I&) = FindAngle#(PDT_I#, PDT_R#)
Next
Things to look for:
In VB, a # suffix means "double" and & suffix means "int"
==============================================================================
Empirical Constituent Wave Parameter Calculations
Mag# = PDT_Magn#(PeakFreq&)
Mag1# = PDT_Magn#(PeakFreq& - 1)
Mag2# = PDT_Magn#(PeakFreq& + 1)
Ratio1# = Mag1# / Mag#
Ratio2# = Mag2# / Mag#
Frac1# = (2 * Ratio1# - 1) / (Ratio1# + 1)
Frac2# = (2 * Ratio2# - 1) / (Ratio2# + 1)
AveFrac# = 0.5 * (Frac2# - Frac1#)
AveFrac_2# = AveFrac# * AveFrac#
ApproxMagn# = Mag# * (1 + AveFrac_2# * ( _
0.646 + AveFrac_2# * ( _
0.265)))
ApproxFreq# = PeakFreq& + AveFrac#
ApproxPhas# = ProperRange(PDT_Phas#(PeakFreq&) - AveFrac# * PI)
Things to look for:
The fraction is calculated from both sides of the peak
The output phase formula is really a simple sum
The magnitude calculation is base frequency and phase independent
The magnitude calculation is an ugly curve fit
==============================================================================
Base Line Pure Tone Accuracy
Signal_Real#(I&) = Sin(Frequency# * Angle# + Phase#)
Input Magnitude = 1, Input Frequency = Down the Side, Input Phases = 0,2,4
( Phase Input = 0 ) ( Phase Input = 2 ) ( Phase Input = 4 )
----------------------- ----------------------- -----------------------
Tone Magn Freq Phase Magn Freq Phase Magn Freq Phase
----- ------ ------- ------ ------ ------- ------ ------ ------- ------
4.50 1.0004 4.49997 0.0001 0.9997 4.50002 2.0003 0.9999 4.50000 3.9995
4.60 1.0005 4.60001 6.2829 1.0002 4.60000 2.0004 1.0000 4.59999 3.9997
4.70 1.0002 4.70001 6.2829 1.0003 4.70002 2.0002 0.9999 4.69997 4.0001
4.80 1.0000 4.79999 6.2830 1.0002 4.80004 2.0000 0.9999 4.79996 4.0002
4.90 0.9999 4.89997 0.0000 1.0001 4.90003 1.9999 1.0000 4.89998 4.0001
5.00 1.0000 5.00000 0.0000 1.0000 5.00000 2.0000 1.0000 5.00000 4.0000
5.10 1.0001 5.10004 6.2830 1.0000 5.10000 2.0001 0.9999 5.09996 4.0000
5.20 1.0001 5.20004 6.2829 1.0002 5.20006 2.0000 0.9999 5.19989 4.0003
5.30 1.0001 5.29994 6.2831 1.0005 5.30017 1.9996 0.9999 5.29983 4.0006
5.40 0.9999 5.39979 0.0005 1.0006 5.40025 1.9992 1.0000 5.39988 4.0006
5.50 0.9994 5.49969 0.0010 1.0003 5.50020 1.9991 1.0000 5.50005 4.0002
9.50 1.0000 9.49999 0.0000 0.9999 9.50001 2.0000 1.0000 9.50000 3.9999
9.60 1.0003 9.59999 6.2832 1.0002 9.60000 2.0000 1.0002 9.60000 4.0000
9.70 1.0002 9.70000 6.2832 1.0002 9.70000 2.0000 1.0001 9.70000 4.0000
9.80 1.0001 9.80000 6.2832 1.0001 9.80000 2.0000 1.0000 9.80000 4.0000
9.90 1.0000 9.90000 6.2832 1.0000 9.90000 2.0000 1.0000 9.90000 4.0000
10.00 1.0000 10.00000 0.0000 1.0000 10.00000 2.0000 1.0000 10.00000 4.0000
10.10 1.0000 10.10000 6.2832 1.0000 10.10000 2.0000 1.0000 10.10000 4.0000
10.20 1.0001 10.20000 6.2832 1.0001 10.20000 2.0000 1.0000 10.19999 4.0000
10.30 1.0001 10.30000 6.2832 1.0002 10.30001 2.0000 1.0001 10.29999 4.0001
10.40 1.0002 10.39998 0.0000 1.0003 10.40002 1.9999 1.0002 10.39999 4.0001
10.50 0.9999 10.49997 0.0001 1.0000 10.50002 1.9999 1.0000 10.50000 4.0000
14.50 1.0000 14.50000 6.2832 1.0000 14.50000 2.0000 1.0000 14.50000 4.0000
14.60 1.0002 14.60000 6.2832 1.0002 14.60000 2.0000 1.0002 14.60000 4.0000
14.70 1.0002 14.70000 6.2832 1.0002 14.70000 2.0000 1.0002 14.70000 4.0000
14.80 1.0001 14.80000 6.2832 1.0001 14.80000 2.0000 1.0001 14.80000 4.0000
14.90 1.0000 14.90000 0.0000 1.0000 14.90000 2.0000 1.0000 14.90000 4.0000
15.00 1.0000 15.00000 0.0000 1.0000 15.00000 2.0000 1.0000 15.00000 4.0000
15.10 1.0000 15.10000 6.2832 1.0000 15.10000 2.0000 1.0000 15.10000 4.0000
15.20 1.0001 15.20000 6.2832 1.0001 15.20000 2.0000 1.0001 15.20000 4.0000
15.30 1.0002 15.30000 6.2832 1.0002 15.30000 2.0000 1.0002 15.30000 4.0000
15.40 1.0002 15.40000 0.0000 1.0002 15.40000 2.0000 1.0002 15.40000 4.0000
15.50 1.0000 15.50000 0.0000 1.0000 15.50000 2.0000 1.0000 15.50000 4.0000
19.50 0.9999 19.50001 6.2831 1.0000 19.49999 2.0000 1.0000 19.50000 4.0000
19.60 1.0002 19.60001 6.2832 1.0002 19.60000 2.0000 1.0002 19.59999 4.0000
19.70 1.0002 19.70000 0.0000 1.0001 19.70000 2.0000 1.0002 19.69999 4.0000
19.80 1.0001 19.80000 0.0000 1.0001 19.80000 2.0000 1.0001 19.80000 4.0000
19.90 1.0000 19.90000 0.0000 1.0000 19.90000 2.0000 1.0000 19.90000 4.0000
20.00 1.0000 20.00000 0.0000 1.0000 20.00000 2.0000 1.0000 20.00000 4.0000
20.10 1.0000 20.10000 0.0000 1.0000 20.10000 2.0000 1.0000 20.10000 4.0000
20.20 1.0001 20.20000 0.0000 1.0001 20.20000 2.0000 1.0001 20.20000 4.0000
20.30 1.0002 20.30000 0.0000 1.0001 20.30000 2.0000 1.0002 20.30000 4.0000
20.40 1.0002 20.40000 0.0000 1.0002 20.40000 2.0000 1.0002 20.40000 4.0000
20.50 1.0000 20.50001 6.2832 1.0000 20.50000 2.0000 1.0000 20.50000 4.0000
24.50 0.9998 24.50010 6.2829 1.0001 24.49993 2.0001 1.0000 24.49999 4.0002
24.60 1.0001 24.60006 6.2830 1.0002 24.59999 1.9999 1.0003 24.59994 4.0003
24.70 1.0001 24.70002 0.0000 1.0001 24.70003 1.9998 1.0003 24.69994 4.0002
24.80 1.0001 24.79999 0.0001 1.0000 24.80003 1.9999 1.0001 24.79997 4.0001
24.90 1.0000 24.89999 0.0001 1.0000 24.90001 2.0000 1.0000 24.89999 4.0000
25.00 1.0000 25.00000 0.0000 1.0000 25.00000 2.0000 1.0000 25.00000 4.0000
25.10 1.0000 25.10001 0.0000 1.0000 25.10000 2.0000 1.0000 25.10000 4.0000
25.20 1.0000 25.20000 0.0001 1.0000 25.20000 1.9999 1.0001 25.19999 4.0000
25.30 1.0002 25.30000 0.0001 1.0001 25.30000 2.0000 1.0003 25.30000 4.0000
25.40 1.0003 25.40001 0.0000 1.0001 25.39999 2.0001 1.0003 25.40001 3.9999
25.50 1.0001 25.50003 6.2831 0.9999 25.49998 2.0002 0.9999 25.50000 3.9999
Things to look for:
Pretty darn accurate if you have a signal composed of a single pure tone
==============================================================================
Empirical Determination of Frequencies in "Nice" Signals
Started by ●July 25, 2005
Reply by ●July 25, 20052005-07-25
H=2E Ander L=F6nnemo wrote: .=2E.> The technique is quite straightforward and can probably rightly > be called "quick and dirty": > > Step 1. Do a straight up FFT (No Hanning Window) > Step 2. Do a "Peak Deframing Transform" (PDT) on the FFT output > Step 3. For each Magnitude Peak in the PDT: > Empirically Calculate Constituent Wave Parameters > > All the magic seems to occur in Step 2. The transform consists simply > of subtracting from each FFT coefficient the average of its neighbors.It's odd that you explicitely mention in Step 1. that no Hanning window is applied (out of all possible windows), only to then apply a Hanning window (via frequency domain convolution) in Step 2. Is that coincidence? By the way, I know this is often called Hanning window. The correct name should however be von Hann window. Regards, Andor
Reply by ●July 25, 20052005-07-25
In article <1122306925.601342.135410@z14g2000cwz.googlegroups.com>, an2or@mailcircuit.com says...> >H=2E Ander L=F6nnemo wrote: >.=2E. >> The technique is quite straightforward and can probably rightly >> be called "quick and dirty": >> >> Step 1. Do a straight up FFT (No Hanning Window) >> Step 2. Do a "Peak Deframing Transform" (PDT) on the FFT output >> Step 3. For each Magnitude Peak in the PDT: >> Empirically Calculate Constituent Wave Parameters >> >> All the magic seems to occur in Step 2. The transform consists simply >> of subtracting from each FFT coefficient the average of its neighbors. > >It's odd that you explicitely mention in Step 1. that no Hanning window >is applied (out of all possible windows), only to then apply a Hanning >window (via frequency domain convolution) in Step 2. Is that >coincidence? > >By the way, I know this is often called Hanning window. The correct >name should however be von Hann window. > >Regards, >Andor >Andor, Well, I knew if I posted on this group I would learn something new. But are you sure of the equivalence. If I use the wave addition formula on the two neighboring cells I get the the "beat phenomenon" with two beats across my frame. The point is, the average frequency is near, but not on, the center frequency, so I don't understand your stated equivalency. This is the discrete case. SIN(A) + SIN(B) = SIN( (A+B)/2 ) * COS( (A-B)/2 ) 1/(N-1) + 1/(N+1) = N / (N^2 - 1) != 1 / N Am I still misunderstanding? What I am more curious about is if anyone has seen the magnitude/frequency/phase approximation formulas before. Thanks, Anders
Reply by ●July 25, 20052005-07-25
> Well, I knew if I posted on this group I would learn something new. But are you > sure of the equivalence.It depends how you handle the start and end-point of the FFT output. If you do true circular convolution with the kernel [-1/2 1 -1/2] (as you say subtracting the average of the neighbours), then this is indeed equivalent to von Hann windowing in time domain.> SIN(A) + SIN(B) = SIN( (A+B)/2 ) * COS( (A-B)/2 ) > > 1/(N-1) + 1/(N+1) = N / (N^2 - 1) != 1 / N > > Am I still misunderstanding?I'm not quite sure what you mean to imply with those two equations. They are both wrong by a factor of two, by the way.> What I am more curious about is if anyone has seen the > magnitude/frequency/phase approximation formulas before.Sorry, I can't really comment on your approach for peak frequency detection (as it's not my field of expertise). However, if it works satisfactory for the test signals, go ahead and see how it performs using real world signals. How do you determine the number of "relevant" components (peaks) in your FFT? Regards, Andor
Reply by ●July 25, 20052005-07-25
Andor, Adding, not subtracting, the average of the neighbors to each FFT bin would give the Hanning window (scaled by 2). Just curious, what authority named the window the 'von Hann' window? Dirk Andor wrote:> H. Ander L=F6nnemo wrote: > ... > > The technique is quite straightforward and can probably rightly > > be called "quick and dirty": > > > > Step 1. Do a straight up FFT (No Hanning Window) > > Step 2. Do a "Peak Deframing Transform" (PDT) on the FFT output > > Step 3. For each Magnitude Peak in the PDT: > > Empirically Calculate Constituent Wave Parameters > > > > All the magic seems to occur in Step 2. The transform consists simply > > of subtracting from each FFT coefficient the average of its neighbors. > > It's odd that you explicitely mention in Step 1. that no Hanning window > is applied (out of all possible windows), only to then apply a Hanning > window (via frequency domain convolution) in Step 2. Is that > coincidence? > > By the way, I know this is often called Hanning window. The correct > name should however be von Hann window. >=20 > Regards, > Andor
Reply by ●July 26, 20052005-07-26
Dirk,> Adding, not subtracting, the average of the neighbors to each FFT bin > would give the Hanning window (scaled by 2).take the inverse FFT of [1 1/2 0 ... 0 1/2 ] and [1 -1/2 0 ... 0 -1/2 ] (where the dots represent arbitrary length zero-padding) and tell me which one do you think looks like a von Hann window (scaled by 2), and which one looks like a (1 - von Hann) "window".> Just curious, what authority named the window the 'von Hann' window?Blackman and Tukey (they used "hanning" as a verb denoting the action of applying a "von Hann" window, starting off the whole mix-up). Regards, Andor
Reply by ●July 26, 20052005-07-26
Andor, I stand corrected. In my haste I was computing a zero phase window, which of course you wouldn't use. On the name topic. Why does anyone care? Dirk
Reply by ●July 26, 20052005-07-26
In article <1122328208.594140.182440@f14g2000cwb.googlegroups.com>, an2or@mailcircuit.com says...> >> Well, I knew if I posted on this group I would learn something new. But areyou>> sure of the equivalence. > >It depends how you handle the start and end-point of the FFT output. If >you do true circular convolution with the kernel [-1/2 1 -1/2] (as you >say subtracting the average of the neighbours), then this is indeed >equivalent to von Hann windowing in time domain. > >> SIN(A) + SIN(B) = SIN( (A+B)/2 ) * COS( (A-B)/2 ) >> >> 1/(N-1) + 1/(N+1) = N / (N^2 - 1) != 1 / N >> >> Am I still misunderstanding? > >I'm not quite sure what you mean to imply with those two equations. >They are both wrong by a factor of two, by the way.Yes. I sure responded in a hurry, I was also off by reciprocals too. PDT_N = FFT_N - 1/2 * ( FFT_N-1 + FFT_N+1 ) = S_N dot W - 1/2 * ( S_N-1 dot W + S_N+1 dot W ) ' Sines side only = ( S_N - 1/2 * ( S_N-1 + S_N+1 ) ) dot W = ( SIN( Nt ) - 1/2 * ( SIN( (N-1)t ) + SIN( (N+1)t ) ) dot W = ( SIN( Nt ) - 1/2 * ( 2 * SIN( Nt ) * COS( t ) ) ) dot W = ( ( 1 - COS( t ) ) * SIN( Nt ) ) dot W So a Von Hann window function of 1 - COS is equivalent to subtracting the average of the neighbors in the frequency domain. That is so cool.>> What I am more curious about is if anyone has seen the >> magnitude/frequency/phase approximation formulas before. > >Sorry, I can't really comment on your approach for peak frequency >detection (as it's not my field of expertise). However, if it works >satisfactory for the test signals, go ahead and see how it performs >using real world signals.That is what I plan to do. What I am aiming for is an "oscilliscope" display in my recording program that will lock on to the dominant frequency (if one is clearly found) in real time. I am very interested in studying, and modelling, how an audio waveform degrades over distance.> >How do you determine the number of "relevant" components (peaks) in >your FFT?I simply loop through the cells looking for the ones that are larger than their immediate neighbors. The peaks are remarkably well behaved in isolation and they should be equally well predictible in their "interference" when they get close to each other. I am very confident that I should be able to measure these interactions and come up with adjustment formulas for nearby peaks. I also think that I should be able to resolve multiple constituent peaks/slopes in the signal envelope when they occur.> >Regards, >Andor >
Reply by ●July 27, 20052005-07-27
Andor wrote:> Dirk, > > > Adding, not subtracting, the average of the neighbors to each FFT bin > > would give the Hanning window (scaled by 2). > > take the inverse FFT of [1 1/2 0 ... 0 1/2 ] and [1 -1/2 0 ... 0 -1/2 ] > (where the dots represent arbitrary length zero-padding) and tell me > which one do you think looks like a von Hann window (scaled by 2), and > which one looks like a (1 - von Hann) "window". > > > Just curious, what authority named the window the 'von Hann' window? > > Blackman and Tukey (they used "hanning" as a verb denoting the action > of applying a "von Hann" window, starting off the whole mix-up).I think whoever did the change (Blackman & Tukey?) also introduced "hanning" as a "playful refernce" to the Hamming window, which was suggested by Richard Hamming. Except for the hanning/von Hann/Hann window, the names of the windows either point to the first person to suggest them (Hamming, von Hann, Kaiser, Blackman, Bartlett,...) or the shape of the window (triangular, rectangular, raised cosine,...). Rune
Reply by ●July 27, 20052005-07-27
"dbell" <dirkman@erols.com> wrote in message news:1122385286.673814.55080@g49g2000cwa.googlegroups.com...> Andor, > > I stand corrected. In my haste I was computing a zero phase window, > which of course you wouldn't use. > > On the name topic. Why does anyone care? > > Dirk >I think Otto von Hann would care if he were still alive. Clay






