我有一个使用 NAudio 的音频播放器,我想显示每个频段的实时强度。
我为每个 1024 个样本块触发了一个事件:
public void Update(Complex[] fftResults)
{
// ??
}
我想要的是一组数字,表示每个频带的强度。假设我想将窗口分成 16 个波段。
例如,当有更多的低音频率时,它可能看起来像这样:
░░░░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓▓░░░░░░░░░░░░
▓▓▓▓▓░░░░░░░░░░░
▓▓▓▓▓▓▓▓░░░▓░░▓░
如果可以使用该数据,我应该在该事件处理程序中放入什么?
传入的数据 (Complex[]) 已经使用 FFT 进行了转换。这是一个立体声流。
第一次尝试:
double[] bandIntensity = new double[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public void Update(Complex[] fftResults)
{
// using half fftResults because the others are just mirrored
int band = 0;
for (int n = 0; n < fftResults.Length/2; n++)
{
band = (int)((double)n / (fftResults.Length / 2) * bandIntensity.Length);
bandIntensity[band] += Math.Sqrt(fftResults[n].X * fftResults[n].X + fftResults[n].Y * fftResults[n].Y);
bandIntensity[band] /= 2;
}
}
以上正在做一些事情,但我认为前两个乐队的内容太多了,我正在演奏没有那么多低音的夏奇拉。
谢谢!