# How do you plot an SPL vs frequency curve for a given set of pressure data?

I have a set of pressure data at a sampling rate of 262144 Hz for 3 seconds making it 786432 samples of pressure data. I want to plot a curve of the SPL (sound pressure level) vs frequency. I first converted pressure data to SPL using $20\log_{10}(P/P_{ref})$ and performed a 4096 point FFT for the 192 segments of data and averaged them.

However, I couldn't get the required SPL values in decibels. Was the approach correct? If not, could you please point out the mistake in my approach?

• You will almost certainly want to do the FFT before you convert to decibels, not after. – Oliver Charlesworth Jan 2 '12 at 12:31
• However, this is not a programming question. Once you know what maths you want to do, then programming it should be easy (if it's not, then ask a specific question). – Oliver Charlesworth Jan 2 '12 at 12:31
• programming is not an issue at all..so you want me to do a fft of the pressure data and then do the SPL calculations? – Fayaaz Hussain Jan 2 '12 at 12:57

The steps will be, in this order:

• apply window function (e.g. Hann or Hamming)
• calculate FFT
• calculate magnitude of FFT (sqrt(re*re+im*im))
• convert magnitude to dB (20*log10(magnitude))
• apply combined correction/calibration factors (window function compensation, FFT factor of N scaling if needed, factor of 2 for symmetric FFT, Pref calibration, etc) - this can just be a single dB correction value that you add to the dB magnitude values

If your Pref calibration data varies with frequency (e.g. microphone with non-flat frequency response) then it's a little more complicated than the above, but the same basic principles apply.

Note also that if you want weighted dB SPL (e.g. A weighting) then you'll also need to apply the relevant frequency dependent weighting corrections.

• @Dilip Sarwate: yes, you can get rid of the sqrt and compensate for this in the dB calculation - note that I had a typo there previously - it's normally 20*log10(magnitude) but of course you can just make this 10*log10(magnitude_squared). I deliberately didn't include this optimisation in the interest of clarity. – Paul R Jan 3 '12 at 17:56