这是我第一次使用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。随着时间绘制它随着时间的推移给我提供频率。现在我需要弄清楚在播放音频的同时如何使用数据并进行脉冲检测。 –