2015-07-10 52 views
0

Matlab有一個叫做audioread的函數,我試圖在C++中重現,但僅僅用於wav文件。我可以讀取一個wav文件並從中獲取double類型的值,但這些值似乎與Matlab函數返回的值不同。我的情況與this guy非常相似。我讀文件代碼:讀取一個16位的wav文件,並將其規範化爲Matlab

vector<double> rawAudioSignal; 

    std::basic_ifstream<uint8_t> inputStream(path.c_str(), std::ifstream::binary); 
    if (inputStream) { 
     // get length of file: 
     inputStream.seekg(0, inputStream.end); 
     int fileLength = inputStream.tellg(); 
     // go back to start of stream 
     inputStream.seekg(0, inputStream.beg); 

     uint8_t *buffer = new uint8_t[fileLength]; 
     inputStream.read((uint8_t *)buffer, fileLength); 
     inputStream.close(); 

     const int wavHeaderSize = 44; 
     for (size_t i = wavHeaderSize; i < fileLength; i += 2) 
     { 
      // removes those huge 65000+ value spikes 
      int c = ((char)buffer[i + 1]) << 8 | 
       ((unsigned char)buffer[i]); 

      // failed attempts 
      //int c = (buffer[i + 1] << 8 | buffer[i]); // little endian 
      //int c = (buffer[i] << 8 | buffer[i + 1]); // big endian 

      // failed normalizations 
      //rawAudioSignal.push_back((c/32768.0) - 1); 
      //rawAudioSignal.push_back(((c - 32768.0)/32768.0)); 
      rawAudioSignal.push_back(c); 
     } 
     delete[] buffer; 
    } 

所有rawAudioSignal值都約-5到5,但在Matlab整數,編號是從-1到1,其中該特定的最低值Matlab的文件是-0.2511,最高值是0.3846。我不知道Matlab函數是正常化的還是正常化的。任何幫助表示讚賞。

回答

3

樣本是在-32768到32767範圍內的16位,並且您希望它們縮放到-1.0到1.0。執行此操作的方法是除以32768.0(-32768/32768.0 == -1,32767/32768.0略小於1)。

你有從字節轉換爲int的正確的基本思想,所以我懷疑一些鑄造可能會解決你的問題。在左移之前嘗試將單個字節轉換爲int以防止可能的溢出。將其分解成多個語句並在調試器中觀察它。

int c = ((int)buffer[i+1]) << 8 | buffer[i]; 
+0

我不知道爲什麼沒有發生在我身上。我必須做的唯一改變如下:rawAudioSignal.push_back(c/32768.0);非常感謝您的幫助。 –

相關問題