我想从完整的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) “
我需要了解这里发生了什么。我问的原因是,为了存储完整的全频谱,我必须从歌曲长度中推导出我需要分配的样本数量。
你能解释这种差异吗?谢谢。
那么这也是我的第一个想法。这首歌确实是立体声。但根据我的理解,这不应该干涉。因为根据文档,(1)ChannelGetLength返回两个通道的字节长度,(2)ChannelGetData返回为FFT样本计算读取的总字节数。或者我可能是错的。 – 2009-12-17 18:06:30