【问题标题】:c++ applying FFT to wav file datac ++将FFT应用于wav文件数据
【发布时间】: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。将它与时间作图给了我随着时间的推移的频率。现在我需要弄清楚如何在播放音频时使用数据来同步和进行脉冲检测。

标签: c++ audio fft wav openal


【解决方案1】:

您拥有的数据在PCM 数据包中。

尝试这些问题作为起点:

对于您问题的 FFT 部分,您可能需要考虑 https://dsp.stackexchange.com/

【讨论】:

  • 我正在考虑使用 gnu octave 源代码 (wavread.m) 中的代码,它可以方便地将数据读入向量并绘制它给我正确的频率。将它翻译成 C++ 函数是要走的路吗?这意味着我必须事先处理数据并想出一种将数据流与音频同步的方法。如果我使用 openal 从单独的样本缓冲区播放 wav 流,我应该多线程吗?
  • 我正在尝试进行脉冲检测,最终目标是让机器人跳到 wav 文件。谢谢。
  • 这是很多问题。 RE:C++,使用任何你觉得舒服的语言。 C++ 是一个不错的选择。 RE:同步流,这通常很困难。 RE:多线程,最有可能,但在切换到生产者-消费者模式之前,您应该专注于让它在一个大缓冲区上工作。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 2016-05-30
  • 2014-06-16
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多