can';t使用麦克风c#naudio捕捉15k的音频

can';t使用麦克风c#naudio捕捉15k的音频,c#,fft,naudio,frequency-analysis,C#,Fft,Naudio,Frequency Analysis,我用NAudio将一些声音录制到float array,在获得录制的音频后,我想将其从float array转换回wav以进行检查 我写了一个方法,但我不确定,因为:我尝试记录一个5秒的15Khz音调,并通过fft检查频谱,以确保捕捉到15k。 以下是我的步骤: 我首先用matlab生成这个音调,并大胆地记录下它是正确的音调。Audacity显示了一个很好的频谱,峰值为15k,峰值为-30db 我尝试用Naudio录制音调,然后将其从录制的浮点数组转换回wav,以便在Audacity中进行检查。

我用NAudio将一些声音录制到float array,在获得录制的音频后,我想将其从float array转换回wav以进行检查

我写了一个方法,但我不确定,因为:我尝试记录一个5秒的15Khz音调,并通过fft检查频谱,以确保捕捉到15k。 以下是我的步骤:

  • 我首先用matlab生成这个音调,并大胆地记录下它是正确的音调。Audacity显示了一个很好的频谱,峰值为15k,峰值为-30db

  • 我尝试用Naudio录制音调,然后将其从录制的浮点数组转换回wav,以便在Audacity中进行检查。不幸的是,它只显示了一些高达12k的噪声,并且没有更多(12k时为-80db)

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

    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 myWaveIn\u数据可用(对象发送方,WaveInEventArgs e)
    {
    myMemoryStream.Write(e.Buffer,0,e.BytesRecorded);//这是用来播放myMemoryStream的
    for(int index=0;index8));
    }
    myMemoryStream2.Position=0;
    myRaw2=新的RawSourceWaveStream(myMemoryStream2,新的波形(44100,1));
    CreateWaveFile(“C:/Users/alon/Desktop/myRecordings/myCalibration.wav”,myRaw2);
    }
    
    好的,所以:我创建了一个带通滤波器,峰值为15 kHz。峰值为+80dB,因为您说过在12 kHz时为-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频率的新矢量。现在有两种估算系数的方法:

    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;
    
  • 脉冲[rad/s]=2*pi*频率[Hz]
  • 这是正确的物理方程。系数:

    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);
    
  • 第二种方法是假设脉冲的单位为[Hz]。不要怪我,甚至有些IDE程序也采用了这种不合适的方法 对于这种情况,我们有以下系数:

    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。

    听起来好像在某个地方有一个低通滤波器。。。您使用的采样率是多少?你能用标准的录音软件来录音吗?44.1Khz。未应用数字滤波器。我必须用NAudio类录音。你是如何设置你的
    WaveInEvent
    ?默认情况下,它使用8kHz采样率。myWaveIn.WaveFormat=新的波形(44100,1);调试时,首先要隔离出现故障的系统。我建议你换掉其中一个系统,看看问题是你是如何使用NAudio的。你好,Rafal,你是用matlab提取系数的吗?我如何计算其他频率的系数呢?好吧,为了设计滤波器,你必须对波特图有很好的了解。假设您想要切断高于10 kHz的频率。这是脉冲2*pi*10000 rad/s。接下来计算时间常数T=1/脉冲。简单滤波器是一阶动力学系统,其传递函数为G=k/(1+sT),其中k为增益,应为1。因此,您可以使用命令tf(..)在Matlab中创建此传递函数。接下来,您必须使用c2d(…)将连续函数更改为离散函数。传递函数等于Y/U,因此得到方程yx函数\分母=ux函数\命名子。离散函数中的运算符为“z”,乘以z表示前面有一个样本,因此,例如Y*(2+5z)=2y[k]+5y[k+1]。将方程更改为如下形式:y[k+1]=f(y[k],y[k-1],…,u[k],u[k-1],…)。然后,您就可以用任何编程语言实现这个方程了。