2009-12-17 26 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