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 方法的主要内容,如果未能解决你的问题,请参考以下文章

枚举 NAudio 中的录音设备

NAudio 中的静音功能 (waveOut)

NAudio在改变音高而不是文件时寻找一种从流中读取的方法

使用 NAudio 交叉淡入淡出

wav 文件连接异常与 naudio 库

NAudio - WaveStram 和 BlockAlignReductionStream