使用麦克风c#naudio无法获得15k的音调频率

时间:2015-06-01 08:16:22

标签: c# fft naudio frequency-analysis

我用NAudio录制一些声音来浮动数组,在获得录制的音频后,我想将它从float数组转换回wav来检查它。

我写了一个方法但是我不确定它是因为:我尝试录制5秒的15Khz音调并通过fft传递以检查频谱以确保15k被捕获。 这些是我的步骤:

  1. 我首先用matlab生成这个音调并用Audacity录制它是正确的音调。 Audacity显示了一个很好的光谱,峰值在15k,-30db。

  2. 我尝试用Naudio录制音调,然后将其从录制的float数组转换回wav,以便在Audacity中进行检查。不幸的是,它只显示了12k以上的噪音(不超过12k时为-80db)。

  3. 以下是数据可用时的常规记录转换:

    void myWaveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            myMemoryStream.Write(e.Buffer, 0, e.BytesRecorded);//this is for playing the myMemoryStream
            for (int index = 0; index < e.BytesRecorded; index += 2)//Here I convert in a loop the stream into floating number samples
            {
    
                short sample = (short)((e.Buffer[index + 1] << 8) |
                                        e.Buffer[index + 0]);
                samples32.Add(sample / 32768f);//IEEE 32 floating number 
            }
        }
    

    这是我的转换代码:

    void floatBackToStream(float[] myfloatArray)
        {
            short[] myShort = new short [myfloatArray.Length];
            myMemoryStream2 = new MemoryStream();
            for (int i = 0; i < myfloatArray.Length; i++)
            {
                myShort[i] = (short)(myfloatArray[i] * 32768f);
                myMemoryStream2.WriteByte((byte)(myShort[i] & 255));
                myMemoryStream2.WriteByte((byte)(myShort[i] >> 8));
            }
    
            myMemoryStream2.Position = 0;
            myRaw2 = new RawSourceWaveStream(myMemoryStream2, new WaveFormat(44100,1));
            WaveFileWriter.CreateWaveFile("C:/Users/alon/Desktop/myRecordings/myCalibration.wav", myRaw2);
    
        }
    

1 个答案:

答案 0 :(得分:2)

好的,所以:我创建了一个带通滤波器,峰值为15 kHz。因为你说你在12 kHz时有-80dB,所以峰值是+ 80dB。如果我们希望过滤器运行良好,它需要是一个高阶传递函数。因此方程式可能会很长,但它只是乘法和加法,因此它不会花费很长时间让CPU执行。我假设您的采样率为44,1 kHz。公式如下:

y[k]=a7*u[k-1]+a6*u[k-2]+a5*u[k-3]+a4*u[k-4]+a3*u[k-5]+a2*u[k-6]+a1*u[k-7]+a0*u[k-8] -b7*y[k-1]-b6*y[k-2]-b5*y[k-3]-b4*y[k-4]-b3*y[k-5]-b2*y[k-6]-b1*y[k-7]-b0*y[k-8];

其中u是测量信号,y是包含15 kHz频率的新矢量。现在有两种估算系数的方法:

  1. pulse [rad / s] = 2 * pi *频率[Hz]
  2. 这是适当的物理方程。 Coeffecients:

    a7=207.5; 
    a6=-578.1;
    a5=546.6;
    a4=-149.8;
    a3=-49.39;
    a2=22.21;
    a1=1.349;
    a0=0.006915;
    b7=-0.945;
    b6=0.3907;
    b5=-0.09229;
    b4=0.01363;
    b3=-0.001288;
    b2=0.00007605;
    b1=-2.567*10^(-6);
    b0=3.79*10^(-8);
    
    1. 第二种方法是假设脉冲以[Hz]为单位。不要怪我,甚至一些IDE程序都遵循这种不恰当的方法。
    2. 对于这种情况,我们有以下系数:

      a7=3.301;
      a6=8.643;
      a5=-51.47;
      a4=59.35;
      a3=-5.498;
      a2=-23.56;
      a1=8.625;
      a0=0.6114;
      b7=-5.693;
      b6=14.18;
      b5=-20.19;
      b4=17.96;
      b3=-10.22;
      b2=3.638;
      b1=-0.7397;
      b0=0.0658;
      

      试试这两个,看看你得到了什么。确保使用足够精确的数据类型,以确保我们不会乘以0。