2014-02-17 31 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