C++ c++;FFT在wav文件数据中的应用
这是我第一次使用wav文件和fft。给定以下代码:C++ c++;FFT在wav文件数据中的应用,c++,audio,fft,wav,openal,C++,Audio,Fft,Wav,Openal,这是我第一次使用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);
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;
}
char*loadWAV(常量char*fn、int&chan、int&samplerate、int&bps、int&size){
字符缓冲区[4];
ifstream-in(fn,ios::binary);
in.read(缓冲区,4);//ChunkID“RIFF”
如果(strncmp(缓冲区,“RIFF”,4)!=0{
cerr您拥有的数据以数据包的形式存在
尝试以下问题作为起点:
-
对于你的问题的FFT部分,你可能想考虑。
你知道你想要什么格式的数据吗?你的FFT函数期待什么?关于左/右:该网站是说一个立体声源将有两倍的样本大小(见字节如何乘以NUMPLANS),而左/右将流交织。(给定块“Subchunk2Size”包含两侧)我知道,我必须在GNU倍频源中查看WaveRe.m文件,当读它时,它会考虑到这个逻辑。我将尝试将它复制到C++中。我正在尝试进行脉冲检测,从OcthVE的WaveRead函数产生的向量的外观中,我可能不需要FFT。随着时间的推移,频率会发生变化。现在我需要弄清楚如何在播放音频时使用数据进行同步和脉冲检测。我正在考虑使用gnu倍频程源(wavread.m)中的代码它方便地把数据读入向量并绘出它给我正确的频率。它将它转换成C++函数的方式。这意味着我必须手工处理数据,并想出一种方法来同步数据流和音频。如果我使用OpenAL来从一个SEP播放WAV流,我应该多线程吗?我尝试做脉冲检测,最终目的是让机器人跳到WAV文件。谢谢。这是很多问题。R:C++,使用你觉得舒服的语言。C++是一种很好的方法。Re:同步流,这通常很难。R:多线程,最有可能,但是你应该集中精力让它工作。在切换到生产者-消费者模式之前,在一个大的缓冲区上使用g。希望这有帮助。