绘制音频频谱

时间:2013-05-13 07:52:42

标签: audio signal-processing bass.dll

我正在尝试实现一个使用低音音频(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. 然后,绘制一个漂亮的光谱分析

  5. 问题是:

    • 似乎无法访问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等)剪掉任何代码。

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

1 个答案:

答案 0 :(得分:2)

您已经混合了步骤的顺序 - 您需要在计算FFT之前将时间域数据应用窗口函数。步骤通常是:

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

请注意,使用Y轴的对数幅度可以有效地提供dB比例,这是查看声音幅度比线性幅度比例更自然和有用的方法。

通常,为了可视化音频等,您可以在连续的时域数据块上应用上面的步骤1 - 5,通常重叠率为50%。