NAudio 中的 GetFFTData 方法
Posted
技术标签:
【中文标题】NAudio 中的 GetFFTData 方法【英文标题】:GetFFTData method in NAudio 【发布时间】:2016-03-12 13:22:29 【问题描述】:我正在为 NAudio 开发频谱分析仪。我的问题是 - 我怎样才能在 Bass.net 中使用方法获得 FFTData
public static int BASS_ChannelGetData(int handle, float[] buffer, int length);
我尝试使用
public void GetFFTResults(float[] fftBuffer)
Complex[] channelDataClone = new Complex[bufferSize];
channelData.CopyTo(channelDataClone, 0);
FastFourierTransform.FFT(true, binaryExponentitation, channelDataClone);
for (int i = 0; i < channelDataClone.Length / 2; i++)
fftBuffer[i] = (float)Math.Sqrt(channelDataClone[i].X * channelDataClone[i].X + channelDataClone[i].Y * channelDataClone[i].Y);
这只是在 NAudio 中获取 FFTData 的一种方法吗?
【问题讨论】:
真正的问题是什么? 什么是channelData
?
频道数据 - 是流的 FFT 数据。
【参考方案1】:
Mark 在 NAudio WPF 演示文件夹中编写了一些代码,展示了 FFT 类在 NAudio 中的工作方式。有一个方便的类,它封装了整个 FFT 过程,使用起来非常简单。
SampleAggregator
类(它应该完全是主库 Mark 的一部分!)是一个 ISampleProvider
,它观察通过它的波形数据,并在每次观察到足够的数据来填充和处理 FFT 缓冲区时触发事件或者当它处理了一个块(任何长度)的最小值/最大值时。
为了使用,只需将它的一个实例内嵌在您的音频流中:
// open the source file
var waveStream = new AudioFileReader(sourceFilename);
// create an aggregator
var aggregator = new SampleAggregator(waveStream);
aggregator.PerformFFT = true;
aggregator.FftCalculated += OnFftCalculated;
// start wave playback
waveOut.Init(aggregator)
waveOut
设备每读取 1024 个样本,就会调用一次 OnFftCalculated
。您可以通过将不同的 2 次幂 FFT 大小作为第二个参数传递给构造函数来调整它。
SampleAggregator 只会为您提供第一个通道的 FFT 数据,并且不会进行重叠的 FFT,因此您只会得到离散的块。在 44.1 kHz 采样率下,块大小只有 ~2.3ms 宽,所以可能不是问题。 8kHz 已经够丑了,稍微降低 FFT 缓冲区大小可能不会有太大影响。
SampleAggregator
的数据流由 Read
方法键入,并且事件在与 WaveOut
相同的线程上下文中引发,因此您响应事件所做的任何事情都应该相当快,或者您正在可能会出现断断续续的音频。
【讨论】:
以上是关于NAudio 中的 GetFFTData 方法的主要内容,如果未能解决你的问题,请参考以下文章