這是我第一次使用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格式文件,我將不勝感激。先謝謝你。
你知道你想要什麼格式的數據?什麼是你的FFT函數期望? – RJFalconer
關於左/右:網站聲稱立體聲源的樣本量會增加一倍(請參閱ByteRate如何乘以numChannels),並且左/右將以流式交織(一個給定的塊「Subchunk2Size」包含兩側) 。 – RJFalconer
我明白了,我必須查看gnu八度音源中的wavread.m文件,並且在讀取它時似乎將該邏輯考慮在內。我將嘗試將其複製到C++中。我試圖做脈衝檢測,並從八度的wavread函數產生的向量的外觀我可能不需要FFT。隨着時間繪製它隨着時間的推移給我提供頻率。現在我需要弄清楚在播放音頻的同時如何使用數據並進行脈衝檢測。 –