# How to increase the spectral resolution?

My question is about the spectral resolution of a discrete signal. Each sample of my signal is made up with 2^n frames sampled at 44.1 kHz.

So, when I want to know the spectral resolution, I calculate : 44100/number_of_frames. With 2048 frames, my spectral resolution is around 20Hz. But, when I take a look to the bands filtered by an equalizer, the band with in the low frequencies are around only 5 Hz (16 Hz -> 20 Hz -> 25 Hz -> 32 Hz...). How is it possible ?

I thought about using "zero padding", but, even if it will help me to have a better location of each peak of the the spectrum analyze, this method don't magically increase the spectral resolution.

I also thought about increasing the number of frames analyzed. But, to get a spectral resolution of 5 Hz with a signal sampled at 44.1 kHz, I would need 8192 frames and it would represent 185 ms. It's very far from a pseudo real-time analysis and a singer who would listen his voice after this analyze while he is singing would hear this "delay".

So, what is the solution ?

You seem to have a good grasp of the tradeoffs. When using short-time Fourier analysis like you are, there is a version of the uncertainty principle at play. Increasing your time resolution (in your case, using a shorter DFT) results in coarser frequency resolution, and vice versa. That is, the time-bandwidth product is a constant.

The way to increase your STFT's spectral resolution is to increase the duration of time that the transform covers, as you noted. If you truly need to be able to resolve frequencies that precisely (within a few Hz of one another), then you need to observe them for a long enough period of time to discern them. If you know a priori some characteristics of your signal, and conditions are favorable (i.e. SNR is high enough), then you might be able to get the job done with coarser resolution (and therefore a shorter transform).

For instance, if you know that your signal is likely to be a single tone somewhere in a particular band, and you want to know its frequency precisely, then you don't necessarily need to use a really long DFT. Instead, you can use a shorter DFT, then use peak interpolation techniques to give a sub-bin estimate of where the peak actually lies.

Actually, you can achieve exact frequency retrieval from the DFT samples: Super-Resolving a Frequency Band. What is interesting is that you have an exact formula to characterize the frequency with zero error. This may help you.

• You should probably add more content / content related to the referenced paper as this is currently a link only answer. Links rot, and this link is probably be hind a pay wall for most readers. Dec 3, 2023 at 20:30

Spectral resolution has multiple meanings.

An FFT can resolve (as in separate) multiple simultaneous narrow-band frequencies only if they are roughly 2 or more FFT result bins apart in order to see at least a 3 dB separation gap. This is around 40 Hz or farther apart with a 2048 length FFT at 44.1k, depending on window. In order to get more separation resolution using an FFT, you need to gather more samples for a longer FFT. This is the time-frequency resolution trade-off.

But if you have a single frequency pitch of known timbre with no noise, no tremolo, and no vibrato, you might be able to estimate the repeat distance with as little as two periods of a pitch waveform to sub-millisecond resolution (perhaps using upsampled or interpolated autocorrelation, AMDF, or ASDF, et.al., instead of an FFT). This initial pitch frequency estimate can be refined further or updated later with more pitch periods, or with a waveform following PLL.

For isolated sinewaves (which is often very different from human pitch) in very low noise, you can interpolate isolated spectral peaks between FFT bins to perhaps a fraction of the FFT bin spacing in frequency estimation resolution. You can also interpolate between FFT bins to plot at a much higher resolution than the FFT bin spacing in order to graph a more precise location of any spectral peaks that are significantly above the noise floor. Zero-padding works similarly to this interpolation (using Sinc kernel interpolation).