0

我正在尝试实现一个使用低音音频(http://www.un4seen.com/)绘制音频频谱的应用程序。我的理解是我必须:

  1. 从流中获取 FFT 数据 float[] buffer = new float[256]; Bass.BASS_ChannelGetData(句柄,缓冲区,(int)(BASS_DATA_FFT_COMPLEX|BASS_DATA_FFT_NOWINDOW));

  2. 对于每个 fft,计算它的大小

  3. 将窗函数应用于 FFT(汉宁或汉明都可以)

  4. 然后,画出漂亮的频谱分析

然而问题在于:

  • 似乎无法访问 BASS_DATA_FFT_COMPLEX BassData。我可以看到它应该在文档http://www.bass.radio42.com/help/html/a13cfef0-1056-bb94-81c4-a4fdf21bd463.htm中可用,但我无法使用它,因为我收到 BassData 错误不包括此类枚举
  • 此外,我想知道我所做的是否正确。要绘制频谱,我应该简单地绘制 fft 的幅度还是绘制 fft 的幅度与该 fft 的频率?在这种情况下,我将如何获得与该 fft 对应的频率?我不介意从任何语言(C/C++、C#、VB、Java 等)截取的任何代码

注意:我不确定这是否有帮助,但这就是我正在使用的:Plotting using Microsoft Chart control。C# with the BASS.NET API by http://www.bass.radio42.com/ 非常感谢任何帮助和建议

4

1 回答 1

2

You have mixed up the order of the steps - you need to apply a window function to the time domain data before calculating the FFT. The steps are typically:

1. acquire time domain data
2. apply window function
3. calculate FFT
4. calculate log magnitude of FFT (log(re*re+im*im))
5. plot log magnitude (with appropriate scaling) against frequency

Note that using log magnitude for the Y axis gives you effectively a dB scale, which is a more natural and useful way to view sound amplitude than a linear magnitude scale.

Normally for visualizing audio etc you apply steps 1 - 5 above on successive blocks of time domain data, typically with an overlap of 50%.

于 2013-05-13T10:00:00.967 回答