用Bass库绘制音频谱

时间:2015-03-17 21:43:58

标签: c++ fft spectrum bass

如何使用Bass library 为给定音频文件绘制光谱?

我的意思是类似于Audacity生成的图表: enter image description here

我知道我可以在给定时间t(当我播放音频时)获得FFT数据:

float fft[1024];
BASS_ChannelGetData(chan, fft, BASS_DATA_FFT2048); // get the FFT data

这样我每次都会在数组中获得1024个值t。我是对的,那个数组中的值是信号幅度(dB)?如果是这样,频率(Hz)如何与这些值相关联?按指数?

我是程序员,但我根本没有音频处理经验。所以我不知道用我的数据做什么来绘制所需的光谱。

我正在使用C ++版本,但其他语言的示例很好(我可以转换它们)。

1 个答案:

答案 0 :(得分:2)

从文档中,该标志将导致计算FFT幅度,并且根据它的声音,它是线性幅度。

dB = 10 * log10(intensity);
dB = 20 * log10(pressure);

(我不确定音频文件样本是强度还是压力的测量。麦克风输出与线性相关的是什么?)

此外,它表示输入的长度和FFT匹配的长度,但FFT的一半(对应于负频率)被丢弃。因此,最高FFT频率将是采样频率的一半。这发生在N / 2。文档实际上说

  

例如,使用2048样本FFT,将返回1024个浮点值。如果使用BASS_DATA_FIXED标志,则FFT值将以8.24定点形式而不是浮点形式。每个值或&#34; bin&#34;的范围从0到1(如果样本数据是浮点且未剪切,则实际上可以更高)。 第1个bin包含DC分量,第2个bin包含通道采样率的1/2048幅度,然后是2/2048,3 / 2048等的幅度 < / p>

这似乎很清楚。