can';t使用麦克风c#naudio捕捉15k的音频
我用NAudio将一些声音录制到float array,在获得录制的音频后,我想将其从float array转换回wav以进行检查 我写了一个方法,但我不确定,因为:我尝试记录一个5秒的15Khz音调,并通过fft检查频谱,以确保捕捉到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中进行检查。
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;
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);
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],…)。然后,您就可以用任何编程语言实现这个方程了。