在应用FFT之前从wav文件中读取数据

时间:2015-12-15 18:45:34

标签: c++ fft wav pcm

这是我第一次使用wave文件。 问题是我并不完全了解如何正确读取存储的数据。我的阅读代码:

    uint8_t* buffer = new uint8_t[BUFFER_SIZE];
    std::cout << "Buffering data... " << std::endl;
    while ((bytesRead = fread(buffer, sizeof buffer[0], BUFFER_SIZE / (sizeof buffer[0]), wavFile)) > 0)
    {
        //do sth with buffer data
    }

示例文件头向我提供数据为PCM(1通道)的信息,每个采样8位,采样率为11025Hz。

输出数据给出了(更新后)0到255之间的值,因此值是8位调制的正确PCM值。但是,任何想法BUFFER_SIZE可以正确读取这些值的任何想法吗?

我正在使用的WAV文件:http://www.wavsource.com/movies/2001.htm(daisy.wav)

TXT输出:https://paste.ee/p/pXGvm

1 个答案:

答案 0 :(得分:0)

您有两种常见情况。第一个是WAV文件代表一个简短的音频样本,你想要将整个内容读入内存并进行操作。所以BUFFER_SIZE是一个变量。基本上你寻找到文件的末尾来获取它的大小,然后加载它。

第二种常见情况是WAV文件代表相当长的录音,并且您希望通过实时写入输出设备来分段处理它。因此BUFFER_SIZE需要足够大才能容纳一口大小的块,但不要太大以至于需要过多的内存。现在通常是&#34;框架的大小&#34;音频由输出设备本身给出,它希望每秒25个样本与视频或类似的东西同步。您通常需要一个双缓冲器,以确保在DAC(数模转换器)用完时始终满足更多样本的需求。然后在给出样本时,从磁盘加载下一块数据。有时候没有&#34;对&#34;对于块大小的值,您只需要使用相当合理的东西来平衡内存占用与呼叫数量。

如果你需要进行FFT,使用2的幂的缓冲区大小是正常的,以使快速变换更简单。您需要的大小取决于您感兴趣的最低频率。