How do I plot the spectrum of a wav file using FFT?

后端 未结 1 1961
醉话见心
醉话见心 2021-01-12 15:36

NOTE: This is not a duplicate, I have specific requirements other than related questions.

To start with, I want to plot the spectrum of an audio file (.wav) just lik

相关标签:
1条回答
  • 2021-01-12 16:05

    The signature is

    public static void  FFT( float[] data, int length, FourierDirection direction )
    
    1. You pass an array of complex numbers, represented as pairs. Since you only have real numbers (the samples), you should put your samples in the even locations in the array - data[0], data[2], data[4] and so on. Odd locations should be 0, data[1] = data[3] = 0...
    2. The length is the amount of samples you want to calculate your FFT on, it should be exactly half of the length of the data array. You can FFT your entire WAV or parts of it - depends on what you wish to see. Audacity will plot the power spectrum of the selected part of the file, if you wish to do the same, pass the entire WAV or the selected parts.
    3. FFT will only show you frequencies up to half of your sampling rate. So you should have values between 0 and half your sampling rate. The amount of values depends on the amount of samples you have (the amount of samples will affect the precision of the calculation)
    4. Audacity plots the power spectrum. You should take each complex number pair in the array you receive and calculate its ABS. ABS is defined as sqrt(r^2+i^2). Each ABS value will correspond to a single frequency.

    Here's an example of a working code:

    float[] data = new float[8];
    data[0] = 1; data[2] = 1; data[4] = 1; data[6] = 1;
    Fourier.FFT(data, data.Length/2, FourierDirection.Forward);
    

    I'm giving it 4 samples, all the same. So I expect to get something only at frequency 0. And indeed, after running it, I get

    data[0] == 1, data[2] == 1, data[4] == 1, data[6] == 1

    And others are 0.

    If I want to use the Complex array overload

    Complex[] data2 = new Complex[4];
    data2[0] = new Complex(1,0);
    data2[1] = new Complex(1, 0);
    data2[2] = new Complex(1, 0);
    data2[3] = new Complex(1, 0);
    Fourier.FFT(data2,data2.Length,FourierDirection.Forward);
    

    Please note that here the second parameter equals the length of the array, since each array member is a complex number. I get the same result as before.

    I think I missed the complex overload before. I seems less error prone and more natural to use, unless your data already comes in pairs.

    0 讨论(0)
提交回复
热议问题