2009-12-17 27 views
0

我想从完整的FFT表示中绘制一首歌的全部谱。BASS_GetChannelLength()和BASS_GetChannelData()之间的信道大小差异

使用低音音频库,我创建一个解码器流,得到它的长度,然后检索所有的FFT采样。我的第一个原型完美工作:

Decoder := BASS_StreamCreateFile(FALSE, pchar(fn), 0, 0, BASS_STREAM_DECODE); 
    SongLen := BASS_ChannelGetLength(Decoder, BASS_POS_BYTE); 
    repeat 
    NRead := BASS_ChannelGetData(Decoder, @FftBuf, BASS_DATA_FFT1024); 
    TotRead := TotRead + NRead; 
    until (NRead<=0); 

但运行它后,我已经意识到,TotRead积累从NREAD返回由BASS_ChannelGetData()是系统(在所有测试的歌我试过了,用不同的FFT大小)两次SongLen由BASS_ChannelGetLength()返回。

这个结果是我没想到的。我希望从BASS_ChannelGetLength()返回的值与从BASS_ChannelGetData()返回的所有返回值相同,因为文档中提到“请求FFT数据时,返回从通道读取的字节数(执行FFT)

我需要了解这里发生了什么。我问的原因是,为了存储完整的全频谱,我必须从歌曲长度中推导出我需要分配的样本数量。

你能解释这种差异吗?谢谢。

回答

2

原来是BASS.DLL中的一个错误。

这是我从BASS开发人员在unseseen开发论坛收到的答案。

你说得对! BASS_ChannelGetData为 ,当请求来自 16位通道的FFT数据时的确会返回正确的 值的两倍。这是由于它不是 在FFT处理中补偿16位样本 数据被转换为浮点数 。这是 更正... www.un4seen.com/stuff/bass.dll

0

只是猜测在这里,但也许你的歌是立体声,你读总长的两倍,因为有两个音频通道?

+0

那么这也是我的第一个想法。这首歌确实是立体声。但根据我的理解,这不应该干涉。因为根据文档,(1)ChannelGetLength返回两个通道的字节长度,(2)ChannelGetData返回为FFT样本计算读取的总字节数。或者我可能是错的。 – 2009-12-17 18:06:30