C++ 用Bass库绘制音频频谱

C++ 用Bass库绘制音频频谱,c++,fft,spectrum,bass,C++,Fft,Spectrum,Bass,我怎样才能为给定的音频文件绘制频谱 我指的是类似于Audacity生成的图表: 我知道在播放音频时,我可以获得给定时间t的FFT数据: float fft[1024]; BASS_ChannelGetData(chan, fft, BASS_DATA_FFT2048); // get the FFT data 这样,每次t在数组中得到1024个值。数组中的值是信号振幅dB,对吗?如果是,频率Hz如何与这些值关联?按索引 我是一名程序员,但我对音频处理毫无经验。所以我不知道该怎么做,用我掌握的

我怎样才能为给定的音频文件绘制频谱

我指的是类似于Audacity生成的图表:

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

float fft[1024];
BASS_ChannelGetData(chan, fft, BASS_DATA_FFT2048); // get the FFT data
这样,每次t在数组中得到1024个值。数组中的值是信号振幅dB,对吗?如果是,频率Hz如何与这些值关联?按索引

我是一名程序员,但我对音频处理毫无经验。所以我不知道该怎么做,用我掌握的数据来绘制所需的光谱


我用C++版本工作,但是其他语言的例子很好,我可以转换它们。

< P>从文档中,这个标志会导致FFT的大小被计算出来,从它的声音,它是线性大小。< /P>
dB = 10 * log10(intensity);
dB = 20 * log10(pressure);
我不确定音频文件样本是测量强度还是压力。麦克风输出与什么有线性关系

此外,它还指示输入的长度和FFT匹配的长度,但与负频率对应的FFT的一半被丢弃。因此,最高FFT频率将为采样频率的一半。这发生在N/2。医生实际上说

例如,对于2048采样FFT,将返回1024个浮点值。如果使用BASS_DATA_FIXED标志,则FFT值将采用8.24定点形式,而不是浮点形式。如果样本数据是浮点数据且未剪裁,则范围从0到1的每个值(或bin)实际上可能会变高。第一个存储单元包含直流分量,第二个存储单元包含通道采样率的1/2048处的振幅,然后是2/2048、3/2048处的振幅,等等


这似乎很清楚。

你看过他们网站上的这个文档链接了吗?它可能有你在备注部分需要的东西@莫法特:是的,但不知何故,我找不到更进一步的方法。可能是因为我缺乏音频处理方面的知识:/Thank you man:关于这个问题-是加载了.wav文件并用人声播放的。一个愚蠢的问题:我应该计算每个fft[1024]值的db值来绘制图表吗?如果我不暂停声音,而不是一段时间内我想得到的一张图表Audacity频率分析,那么每次更新计算出的fft数组都是不同的。我对Audacity不太熟悉,不知道它在做什么。。。从您的屏幕截图来看,它似乎是在使用固定大小的FFT,并在您选择的时间窗口内对其进行平均。另一种选择是使用对应于时间窗口的FFT。第三种选择是使用瀑布图-轴是时间和频率,功率密度用颜色显示。因此,经过一些简化,我可以说Audacity从一系列db/Hz图表中绘制了一个以某种方式计算的平均值,每个时间t绘制一个图表?是的,但在转换为db之前必须进行平均。