there and does not consume additional computing resources). The values of the
complex FFT are magnitude values of signal strength for 256bins across the whole
spectrum of 48000Hz. That means, one calculated value for one bin holds the average
magnitude for a bin bandwidth (binBW) of 187.5Hz = 48000Hz / 256. A bin bandwidth
of 187.5Hz is of course not accurate enough for precision tuning, as necessary for DSB
or StereoAM listening. We would need an accuracy of a few Hz to be able to listen to a
signal in these modes without annoying heterodynes or oscillations of the signal. This is
achievable by inter‐ bin three‐point quadratic interpolation! You use the magnitude
values of three bins adjacent to each other and use these values to interpolate a
quadratic curve (which stands on its “head”) (Jacobsen & Kootsookos
2007,
www.ericjacobsen.org
, Thanks vladn for pointing me to this method and this and
other papers!). That’s all. Now you would set up a tuning process:
I used a very simple process, only two frequency steps are sufficient for very accurate
tuning to the carrier:
1.
determine the bin numbers, between which the maximum FFT magnitude is
being searched for (bins within the passband, as I can use different USB & LSB
bandwidths in DSB tuning (passband tuning) mode)
2.
search for maximum FFT magnitude value in that frequency range
3.
coarse tune to that bin (delta = deltabins * binBW)
4.
interpolate with three‐point‐quadratic
interpolator (equation (4) of Jacobsen &
Kootsookos 2007) with the three bins in the center of my frequency
5.
fine tune: set freq to that interpolation ‐‐> delta = binBW * (1.36 * (bin3 ‐ bin1)) /
(bin1 + bin2 + bin3); for maximum accuracy, this requires the FFT window type to
be set to Hanning!
6.
done!
I tested several formulas (e.g. Lyons (2011)): The paper by Jacobsen & Kootsookos
(2007) had the final implementation formula. As I used a complex FFT library, that
already calculated magnitudes, I was looking for a formula for magnitudes. Also, I
wanted to use Hanning, so their equation (4) solved my problem: delta = binBW * (1.36
* (bin3 ‐ bin1)) / (bin1 + bi
n2 + bin3); This is astonishingly accurate! With a fs = 48000Hz
and 256point FFT I have an accuracy of 2‐3Hz with strong signals, and 4‐5Hz with very
noisy signals.
That’s
perfect with a binBW of 187.5Hz in my view.
With this method it was possible to implement a fine tuning graphical helper for zero
beat tuning in CW. We do this by the following steps:
• we have the FFT already done for spectrum display/waterfall display