【发布时间】:2014-03-16 09:50:06
【问题描述】:
这是我第一次使用 wav 文件和 fft 文件。给定以下代码:
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 函数期望什么?
-
关于左/右:该网站说立体声源将具有两倍的样本大小(请参阅 ByteRate 如何乘以 numChannels),并且左/右将交错传输(给定的块“Subchunk2Size”包含两边)。
-
我明白了,我必须查看 gnu octave 源中的 wavread.m 文件,并且在读入它时似乎考虑了该逻辑。我将尝试将其复制过来进入 C++。我正在尝试进行脉冲检测,从 octave 的 wavread 函数产生的矢量的外观来看,我可能不需要 FFT。将它与时间作图给了我随着时间的推移的频率。现在我需要弄清楚如何在播放音频时使用数据来同步和进行脉冲检测。