c# - 无法用麦克风捕捉 15k 的音频 C# naudio

标签 c# fft naudio frequency-analysis

我用 NAudio 将一些声音录制到 float 组中,在获取录制的音频后,我想将其从 float 组转换回 wav 来检查它。

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

  1. 我首先用 matlab 生成这个音调,然后用 Audacity 记录它是正确的音调。 Audacity 显示了一个不错的频谱,峰值为 15k,-30db。

  2. 我尝试用 Naudio 记录音调,然后将其从记录的 float 组转换回 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 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);

    }

最佳答案

好的,所以:我创建了一个带通滤波器,峰值为 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 频率的新向量。现在有两种方法来估计系数:

  1. 脉冲 [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。

    关于c# - 无法用麦克风捕捉 15k 的音频 C# naudio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568675/

    相关文章:

    c - FFT 2D 数组的实现

    algorithm - 使用傅立叶分析将函数拟合到数据

    c# - 将 a-law 转换为 pcm

    c# - 检测歌曲中的节拍

    c# - 在自定义对象集合上使用 LINQ 时,IEquatable<T>、IEqualityComparer<T> 和覆盖 .Equals() 之间的区别?

    c# - .net web api 服务器中的静态变量

    c# - 从 UserControls 使用时在 wpf 中设置选项卡顺序?

    c# - C# 中的 JPEG 工件去除

    algorithm - FFT 有多少 FLOPS?

    c# - 在 C# 中从麦克风和扬声器录制音频