gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:08 25 4
gpt4 key购买 nike

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

    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 channel ),每个样本 8 位,采样率为 11025Hz。

输出数据给我(更新后)从 0 到 255 的值,因此这些值是 8 位调制的正确 PCM 值。但是,知道什么 BUFFER_SIZE 会更适合正确读取这些值吗?

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

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

最佳答案

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

第二种常见情况是 WAV 文件代表相当长的录音,您希望分段处理它,通常是实时写入输出设备。所以 BUFFER_SIZE 需要足够大以容纳一口大小的 block ,但又不能大到需要过多的内存。现在音频“帧”的大小通常由输出设备本身给出,它期望每秒 25 个样本与视频或类似的东西同步。一般需要双缓冲,以保证在DAC(数模转换器)用完时,总能满足更多采样的需求。然后在给出一个样本时,你从磁盘加载下一个数据 block 。有时 block 大小没有“正确”的值,您只需要使用一些相当合理的值来平衡内存占用量和调用次数。

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

关于c++ - 在应用 FFT 之前从 wav 文件中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com