2014-02-17 66 views
2

這是我第一次使用wav文件和fft文件。考慮下面的代碼:C++將FFT應用於wav文件數據

char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){ 
     char buffer[4]; 
     ifstream in(fn, ios::binary); 
     in.read(buffer, 4);                //ChunkID "RIFF" 
     if(strncmp(buffer, "RIFF", 4) != 0){ 
       cerr << "this is not a valid wave file"; 
       return NULL; 
     } 
     in.read(buffer,4);                //ChunkSize 
     in.read(buffer,4);                //Format "WAVE" 
     in.read(buffer,4);                // "fmt " 
     in.read(buffer,4);                // 16 
     in.read(buffer,2);                // 1 
     in.read(buffer,2);                // NUMBER OF CHANNELS 
     chan = convertToInt(buffer,2); 
     in.read(buffer,4);                // SAMPLE RATE 
     samplerate = convertToInt(buffer,4); 
     in.read(buffer,4);                // ByteRate 
     in.read(buffer,2);                // BlockAlign 
     in.read(buffer,2);                // bits per sample 
     bps = convertToInt(buffer,2); 
     in.read(buffer,4);                // "data" 
     in.read(buffer,4); 
     size = convertToInt(buffer,4); 
     char * data = new char[size]; 
     in.read(data,size); 
     return data; 
} 

我假設數據指針包含我需要的信息,但我不知道如何辨別這些信息。 我使用this作爲參考,但我不知道如何製作「右聲道左聲道」方面以及如何準備這些數據以用於FFT。 如果您有任何關於此的良好文檔的參考信息,我會很感激,迄今爲止,我的搜索工作已導致NILL。

編輯:如果任何人都可以指向我一個很好的指導,以在這個級別上操作wav格式文件,我將不勝感激。先謝謝你。

+0

你知道你想要什麼格式的數據?什麼是你的FFT函數期望? – RJFalconer

+0

關於左/右:網站聲稱立體聲源的樣本量會增加一倍(請參閱ByteRate如何乘以numChannels),並且左/右將以流式交織(一個給定的塊「Subchunk2Size」包含兩側) 。 – RJFalconer

+0

我明白了,我必須查看gnu八度音源中的wavread.m文件,並且在讀取它時似乎將該邏輯考慮在內。我將嘗試將其複製到C++中。我試圖做脈衝檢測,並從八度的wavread函數產生的向量的外觀我可能不需要FFT。隨着時間繪製它隨着時間的推移給我提供頻率。現在我需要弄清楚在播放音頻的同時如何使用數據並進行脈衝檢測。 –

回答

1

您擁有的數據是PCM數據包。

嘗試這些問題爲出發點:

對於你的問題的FFT部分,你可能要考慮https://dsp.stackexchange.com/

+0

我正在考慮使用gnu八度音源(wavread.m)中的代碼,它可以方便地將數據讀入一個矢量並繪製它給我適當的頻率。正在翻譯它成爲一個C++函數的方式去?這意味着我必須事先處理數據,並想出一種方法來同步數據流與音頻。如果我使用openal從單獨的樣本緩衝區播放wav流,我應該多線程嗎? –

+0

我正在嘗試做脈衝檢測,最終目標是讓一個機器人跳舞到一個wav文件。謝謝。 –

+1

這是很多問題。 RE:C++,使用你感覺舒服的語言。 C++是一個好方法。 RE:同步流,這通常很困難。 RE:多線程,很可能,但在切換到生產者 - 消費者模式之前,您應該專注於在一個大緩衝區上工作。希望這可以幫助。 – RJFalconer