NAudio 中的 GetFFTData 方法

GetFFTData method in NAudio

我正在为 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 的唯一方法吗?

Mark 在 NAudio WPF 演示文件夹中编写了一些代码,展示了 FFT classes 如何在 NAudio 中工作。有一个方便的 class 封装了整个 FFT 过程并且使用起来非常简单。

SampleAggregatorclass(它应该完全是主库 Mark 的一部分!)是一个 ISampleProvider,它观察通过它的波形数据并在每次它有时触发事件观察到足够的数据来填充和处理 FFT 缓冲区,或者当它处理了 min/max 个值的块(无论长度如何)时。

对于用法,只需将它的一个实例内联到您的音频流中即可:

// 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.3 毫秒宽,因此可能不是问题。 8kHz 已经够难看的了,将 FFT 缓冲区大小降低一点可能不会造成太大影响。

SampleAggregator 的数据流是从 Read 方法键入的,事件是在与 WaveOut 相同的线程上下文中引发的,因此您为响应事件所做的任何事情应该相当快,否则您可能会听到断断续续的音频。