4

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?

Lorem Ipsum
  • 5,944
  • 3
  • 34
  • 42
  • 2
    You will almost certainly want to do the FFT before you convert to decibels, not after. – Oliver Charlesworth Jan 02 '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 02 '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? –  Jan 02 '12 at 12:57

1 Answers1

6

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.

Paul R
  • 3,392
  • 20
  • 34
  • 1
    @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 03 '12 at 17:56