如何从麦克风输入读取实时频率?

kas*_*kas 3 .net c# signal-processing frequency-analysis audio-processing

我想实时获取从麦克风获取的语音输入的频率。我搜索了这个并了解了 FFT 和另外 2、3 种算法,但实现这些算法似乎非常复杂。

我正在寻找一个 C# 库,它使我能够简单地将频率放入数组中而无需实现它。

Par*_*dox 5

事实上,就像您猜的那样,信号处理是您不想自己实现的那种算法,因为它们非常复杂。

显然,对于 C#,您可以找到一些库,但这里有一个执行 DFT/FFT 的好库,目前处于活动状态:DSPLib

DSPLib 有几个主要部分,但它的基本目标是允许在时间序列输入阵列上进行真正的傅立叶变换,从而产生可用的经典频谱输出,而无需用户进一步调整。

如果我正确理解你想要什么,第二个例子是你想要完成的任务(它没有麦克风的录音)。

只是一条建议,小心窗口化,因为它会影响您的信号频谱。

只是一个可能让您感到困惑的概念的注释,零填充只是为了使用 FFT 算法而使样本数等于 2 的幂的一种技巧。因此,产生的光谱以某种方式以更好的分辨率“人工”产生。

void example2()
{
  // Same Input Signal as Example 1 - Except a fractional cycle for frequency.
  double amplitude = 1.0; double frequency = 20000.5;
  UInt32 length = 1000; UInt32 zeroPadding = 9000; // NOTE: Zero Padding
  double samplingRate = 100000;

  double[] inputSignal = DSPLib.DSP.Generate.ToneSampling(amplitude, frequency, samplingRate, length);

  // Apply window to the Input Data & calculate Scale Factor
  double[] wCoefs = DSP.Window.Coefficients(DSP.Window.Type.Hamming, length);
  double[] wInputData = DSP.Math.Multiply(inputSignal, wCoefs);
  double wScaleFactor = DSP.Window.ScaleFactor.Signal(wCoefs);

  // Instantiate & Initialize a new DFT
  DSPLib.DFT dft = new DSPLib.DFT();
  dft.Initialize(length, zeroPadding); // NOTE: Zero Padding

  // Call the DFT and get the scaled spectrum back
  Complex[] cSpectrum = dft.Execute(wInputData);

  // Convert the complex spectrum to note: Magnitude Format
  double[] lmSpectrum = DSPLib.DSP.ConvertComplex.ToMagnitude(cSpectrum);

  // Properly scale the spectrum for the added window
  lmSpectrum = DSP.Math.Multiply(lmSpectrum, wScaleFactor);

  // For plotting on an XY Scatter plot generate the X Axis frequency Span
  double[] freqSpan = dft.FrequencySpan(samplingRate);

  // At this point a XY Scatter plot can be generated from,
  // X axis => freqSpan
  // Y axis => lmSpectrum
}
Run Code Online (Sandbox Code Playgroud)

绘图后,这是结果:

信号频谱

放大光谱的峰值:

信号频谱放大