signalssignal-processingfftnoisetime-frequency

How to increase the no of points in a FFT Narrow band for 1/3 octave analysis


I am calculating Sound pressure level of a Pressure-Time signal. The number of samples per second is 9831.(dt = 0.0001017 sec) Totally 749 samples are collected for a simple example case.

I am using 512 FFT points for this example case,so the frequency starts from 19.2 Hz to 4877 Hz, and the dF = 19.2 Hz.

I want to calculate the SPL(sound pressure level) for 1/3 octave frequencies.

So I take the 10 band octave frequency range 1Hz, 1.25Hz, 1.6Hz, 2Hz, 2.5Hz, 3.15Hz, 4Hz, 5Hz, 6.3Hz, 8Hz, which is a multiple of 10 (ie. it goes next like 10Hz, 12.5Hz, 16Hz.....till 5000Hz)

Note this is Center frequency of a 1/3 octave band.

And each band has lower and upper frequencies ("fl" and "fu") as show below. the "freq" is calculated based on sampling rate, so it increments by 19.2. "i" represent the fft point number, note point 1 is 0Hz. "j" represent the fft band number, as the frequency increases the number of points inside the band increases.

 i=2 j=13 fl=   17.82  freq=    19.2  fu=   22.27  
 i=3 j=16 fl=   35.64  freq=    38.4  fu=   44.54  
 i=4 j=18 fl=   56.13  freq=   57.61  fu=   71.27  
 i=5 j=19 fl=   71.27  freq=   76.81  fu=   89.09  
 i=6 j=20 fl=   89.09  freq=   96.01  fu=   111.4  
 i=7 j=21 fl=   111.4  freq=   115.2  fu=   142.5  
 i=8 j=21 fl=   111.4  freq=   134.4  fu=   142.5  
 i=9 j=22 fl=   142.5  freq=   153.6  fu=   178.2  
 i=10 j=22 fl=   142.5  freq=   172.8  fu=   178.2  
 i=11 j=23 fl=   178.2  freq=     192  fu=   222.7  
 i=12 j=23 fl=   178.2  freq=   211.2  fu=   222.7  
 i=13 j=24 fl=   222.7  freq=   230.4  fu=   280.6  
 i=14 j=24 fl=   222.7  freq=   249.6  fu=   280.6  
 i=15 j=24 fl=   222.7  freq=   268.8  fu=   280.6  
 i=16 j=25 fl=   280.6  freq=     288  fu=   356.4  
 i=17 j=25 fl=   280.6  freq=   307.2  fu=   356.4  
 i=18 j=25 fl=   280.6  freq=   326.4  fu=   356.4  
 i=19 j=25 fl=   280.6  freq=   345.6  fu=   356.4  
 i=20 j=26 fl=   356.4  freq=   364.8  fu=   445.4 

So this causes my calculation of rms inside the lower octave bands to give bad results, as it does not have enough points inside bands (usually 1 or 2), as the frequency increases the averaging is better (for example in band "j"= 25 four points are used for rms calculation).

Is there any way I could improve the rms calculation by splitting the frequency range into two (low and high band) and apply different fft sampling size to include as much as points inside lower band frequencies( usually from 100Hz to 600Hz).

I also plan to use Hann window function to reduce leakage, should I apply before FFT or after FFT.

your suggestions are welcome.


Solution

  • The Hann window is applied in the time domain, before the FFT.

    As for frequency resolution - there is no silver bullet - if you only have 749 samples at 9.8 kHz sample rate then that will limit the available resolution. You can get a little more resolution if you use a longer mixed radix FFT, e.g. N = 735 factorises nicely and will work with FFTW. You can also use zero padding to effectively interpolate the output spectrum, e.g. pad your 749 samples up to say 4096 with zero samples than do a 4096 point FFT. This doesn't actually generate more information but the interpolation can be useful.