One can achieve better resolution results by taking FFT of different sizes of the input signal. FFT size decreases as frequency increases, i.e. longer FFT length for lower frequencies and shorter FFT length for higher frequencies. I have tried to find papers on this topic but did not find any so far. Rational Acoustics has few brochures where it mentions MTW - Multi-Time Window FFT, but there is no mathematics behind it. Anyone can help me with the answer about underlying mathematics or some code implementation (C++, C, or Java)? In other words, how I can apply longer FFT, in my software, for lower frequencies and shorter FFT for higher frequencies to get uniform resolution as a result?
-
3$\begingroup$ 1) Be careful: you need actual data in the input to the FFT. You cannot zero pad and get "better resolution". 2) The FFT assumes uniform sampling in the time and frequency domains, so expecting different resolutions at different frequencies is not something you'll achieve with the FFT. 3) Wavelets of various sorts were developed to take this approach. $\endgroup$– Peter K. ♦Commented Nov 18, 2015 at 21:47
-
1$\begingroup$ Zero-padding can provide much better non-interpolated result plot resolution (in pixels, et.al.), even if the information-theoretic frequency resolution or peak separation resolution is about the same. $\endgroup$– hotpaw2Commented Nov 18, 2015 at 22:26
-
$\begingroup$ some applications treat frequency in the logarithmic sense such as audio in octaves. Hence while a low octave spans from 30 to 60 hz, a high octave can span from 3840 to 7680 hz. $\endgroup$– Fat32Commented Dec 19, 2015 at 0:56
2 Answers
If your goal is to plot a magnitude spectrum with the frequency axis on a log scale, but with a roughly even visual resolution along that axis, then a single FFT might provide too low a density of plot points (without interpolation) at low frequencies, and more plot points than can be plotted on a line (without averaging) at high frequencies for a given print or pixel display resolution or smoothness. If you use different FFT lengths for different octaves or sub-octaves in frequency, and select subsets of the results from each FFT, then you can maintain a lower delta in density of FFT result points when plotted on such a log scale. How many FFTs you might want to use depends on the maximum variance you want in log frequency resolution of the final joined plot.
However, since the FFTs are of different lengths, then they are for different sets of data. A sequence of longer FFT windows can be done with larger offsets if more time resolution isn't needed at low frequencies. You will have the problem of how to join or blend all these different FFT results (usually subset segments of the results) so that the magnitude response might be uniform across FFT boundaries. In total, you also end up with an overdetermined set of FFT results (but so will highly overlapped windows).
Even better results (in terms of even log frequency plot resolution) might be obtained by using some form of wavelet transform (a Morlet or Gabor wavelet or constant-Q transform, for example) instead of a bunch of semi-redundant FFTs.
But libraries for optimized FFTs might be more available on some platforms. Each basis vector of a windowed FFT in a "multi-time" set can be considered a non-optimally-sized wavelet. So, in some ways, using these so-called "multi-time window" FFTs is a "poor man's" wavelet transform. But some of the many FFT results might be useful for other forms of more traditional DFT analysis of the signal input (in conjunction with the log plot), thus serving a dual purpose.
A partial psycho acoustic justification for increasing FFT size at lower frequencies (or using wavelets) is that, over a certain mid-frequency range, the human ear/brain takes a length of time to determine frequency or pitch of a sound roughly proportional to the period of the frequency.
-
$\begingroup$ Thank you for your answer. I still have to get into wavelets. So, let's stay with FFT for now. Software Smaart v7 has this feature with different sizes of FFT. In my code, written in Java, I get excellent results in getting spectrum, however, I use only one size FFT and I can see the difference in resolution for, say, 1k, 2k, 4k,.,,16k FFT. I use fractional octave banding. My question is still: how I can apply longer FFT, in my software, for lower frequencies and shorter FFT for higher frequencies to get uniform resolution as a result? $\endgroup$ Commented Dec 19, 2015 at 18:05
-
$\begingroup$ What do you mean by a result with "uniform resolution"? A precise mathematical definition would help. $\endgroup$– hotpaw2Commented Dec 19, 2015 at 18:17
-
$\begingroup$ Here is one forum link MTW in v7 Also, here google.ca/… $\endgroup$ Commented Dec 19, 2015 at 20:00
-
$\begingroup$ That won't say what you mean or want. If you want something "math-y", try stating your very own definition of what result you want for your question above. $\endgroup$– hotpaw2Commented Dec 19, 2015 at 21:20
-
$\begingroup$ Ok, here it is, from Rational Acoustics forum. I want to implement the following FFTs for the corresponding frequencies. I have sampling rate of 44.1k, and my code of handling buffers and processing with FFT works fine. How I go about having different FFT sizes for different frequency ranges like here: 10KHz to 20KHz = 256 FFT 1860 Hz to 10 kHz = 1024 FFT 560Hz to 1860Hz = 4096 FFT 280Hz to 560Hz = 8192 FFT 140Hz to 280 = 16384 FFT 10 Hz to 140 = 32768 FFT $\endgroup$ Commented Dec 20, 2015 at 20:36
There is what is known as multi taper analysis, also known as Thompson's Method based on using the Discrete Spherical Prolate Sequences. They are implemented in Matlab.
D. J. Thomson, "Spectrum estimation and harmonic analysis", Proc. IEEE, vol. 70, pp. 1055-1096, 1982.