2015-12-15 70 views
0

這是我第一次使用波形文件。 問題是我不完全明白如何正確讀取存儲的數據。我的用於讀取的代碼:在應用FFT之前從wav文件讀取數據

uint8_t* buffer = new uint8_t[BUFFER_SIZE]; 
    std::cout << "Buffering data... " << std::endl; 
    while ((bytesRead = fread(buffer, sizeof buffer[0], BUFFER_SIZE/(sizeof buffer[0]), wavFile)) > 0) 
    { 
     //do sth with buffer data 
    } 

樣品文件頭給我的信息數據是PCM(1個信道),每個樣品8位和採樣速率爲11025Hz。

輸出數據給我(更新後)從0到255的值,所以對於8位調製,值是合適的PCM值。但是,有什麼想法BUFFER_SIZE會正確讀取這些值prefinrable?我使用

WAV文件:http://www.wavsource.com/movies/2001.htm(daisy.wav)

TXT輸出:https://paste.ee/p/pXGvm

+2

您的意思是-128到127(而不是172)?你看到有符號值的原因是你將它們存儲在已簽名的int8中。 uint8是無符號 – Borgleader

+0

是真的,我的錯,我改變了我的代碼。現在它給了我四個不同的值:128,127,87,0。我仍然不知道它是怎麼回事? – user3038744

+1

我們沒有你的數據,所以我沒有看到我們如何知道這些值是否正確。 – Borgleader

回答

0

你有兩種常見的情況。首先是WAV文件代表一個簡短的音頻樣本,並且您想將整個內容讀入內存並對其進行處理。所以BUFFER_SIZE是一個變量。基本上你會尋求文件的結尾以獲得它的大小,然後加載它。

第二種常見情況是WAV文件代表相當長的音頻記錄,並且您希望通過實時寫入輸出設備來對其進行分段處理。所以BUFFER_SIZE需要足夠大以容納一口大小的塊,但不能太大以至於需要過多的內存。現在,音頻「幀」的大小通常由輸出設備本身給出,它預計每秒25個採樣與視頻或類似的東西同步。您通常需要一個雙緩衝器來確保在DAC(數模轉換器)用完時始終能滿足更多樣品的需求。然後在給出一個樣本時,您從磁盤加載下一個數據塊。有時對於塊大小沒有一個「正確」的值,你只需要做一些相當合理的事情來平衡內存佔用和調用次數。

如果您需要進行FFT,則使用2的冪的緩衝區大小是正常的,以使快速變換更簡單。您需要的尺寸取決於您感興趣的最低頻率。