用于FFT的音频文件读取

时间:2012-12-01 09:10:43

标签: c# signal-processing fft

第一次询问我已经访问了一段时间。

问题在于:

我目前正在尝试使用以下属性来隔离WAVE数据文件中包含的信号的基本频率:

  • PCM音频格式,即线性量化
  • 8000 Hz采样率
  • 每个样本16位
  • 16000字节率

仅一个频道没有交错。

获取字节值:

System.IO.FileStream WaveFile = System.IO.File.OpenRead(@"c:\tet\fft.wav");
        byte[] data = new byte[WaveFile.Length];
        WaveFile.Read(data,0,Convert.ToInt32(WaveFile.Length));

将其转换为双打数组:

 for (int i = 0; i < 32768; i++)//this is only for a relatively small chunk of the file 
        {
           InReal[i] =BitConverter.ToDouble(data, (i + 1) * 8 + 44);
        }

并将其传递给变换函数。

       FFT FftObject = new FFT();
       FftObject.Transform(InReal, InImg, 0, 32768, out outReal, out outImg, false);

现在第一个问题,据我所知,wav文件的PCM值应该在边界内 -1和1,但转换为Double时,我得到这个值:

 2.65855908666825E-235
 2.84104982662944E-285
-1.58613492930337E+235
-1.25617351166869E+264
 1.58370933499389E-242
 6.19284549187335E-245
-2.92969500042228E+254
-5.90042665390976E+226
 3.11954507295188E-273
 3.06831908609091E-217
 NaN
 2.77113146323761E-302
 6.76597919848376E-306
-1.55843653898344E+291

在这些限制中,这些阵列中的少数阵列也是阵列的其余部分。

我的结论是我有某种代码故障,但我似乎能够找到它。 任何帮助将不胜感激。

第二个问题,因为我只在响应向量中为FFT算法提供实际数据,我是否只期望实部分数据?

非常感谢你。

1 个答案:

答案 0 :(得分:2)

我终于能够找出出现了什么问题似乎我没有考虑到数据表示中信号的脉冲编码调制,并且因为我在波形文件上找到许多未解决的问题准备进行傅里叶变换这是准备wave文件的函数中的代码。

public static Double[] prepare(String wavePath, out int SampleRate)

    {
        Double[] data;
        byte[] wave;
        byte[] sR= new byte[4];
        System.IO.FileStream WaveFile = System.IO.File.OpenRead(wavePath);
        wave = new byte[WaveFile.Length];
        data = new Double[(wave.Length - 44) / 4];//shifting the headers out of the PCM data;
        WaveFile.Read(wave,0,Convert.ToInt32(WaveFile.Length));//read the wave file into the wave variable
        /***********Converting and PCM accounting***************/
        for (int i = 0; i < data.Length - i * 4; i++)
        {
            data[i] = (BitConverter.ToInt32(wave, (1 + i) * 4)) / 65536.0;
            //65536.0.0=2^n,       n=bits per sample;
        }
        /**************assigning sample rate**********************/
        for (int i = 24; i < 28; i++)
        {
            sR[i-24]= wave[i];
        }
        SampleRate = BitConverter.ToInt32(sR,0);
        return data;
    }

现在您需要做的就是将采样率和返回的结果发送到FFT算法。 代码未处理,因此您需要自己处理。 我已接受电话录音,忙音,铃声和语音测试,功能正常。