gpt4 book ai didi

c++ - 来自wav文件的数据在-1和1之间,c++,sndfile

转载 作者:太空宇宙 更新时间:2023-11-04 12:54:04 24 4
gpt4 key购买 nike

我正在尝试从 .wav 中读取数据并将其放入 fft。要读取 wav 文件,我正在使用 sndfile 库。

SNDFILE*    infile;
SF_INFO sfinfo ;

memset (&sfinfo, 0, sizeof (sfinfo)) ;
infile = sf_open ("sound.wav", SFM_READ, &sfinfo);

double data [BUF_SIZE];
while (readcount = (int)sf_readf_double (infile, data, BUF_SIZE))
{
for (int i = 0; i < readcount; i++)
{
cout << data[i] << " ";
}
}

但是这个(和其他文件)中的每个值都在 (-1 ; 1) 之间。它是否正确?为什么每个值都这么小?我应该读取时域中的振幅(音量)。

最佳答案

这是浮点样本的规范格式。使用 float 值,您可以获得完整的 32 位精度。裁剪也很容易表示。如果样本值高于 1 或低于 -1,则表示样本被裁剪了。对于整数值,没有办法知道这一点。

float 也是一种应用操作的简单示例格式。例如,混合是微不足道的(您只需将样本值加在一起。)

所以即使一开始看起来很奇怪,它也是音频样本表示的最佳格式。将所需的操作应用于浮点值后,即可将它们转换为输出所需的格式(如 16 位整数)。此操作很简单。这是一个将浮点样本转换和剪辑为当今使用的任何已知整数样本格式的函数:

#include <limits>

/* Convert and clip a float sample to an integer sample. This works for
* all usual integer sample types (8-bit, 16-bit, 32-bit, signed or
* unsigned.)
*/
template <typename T>
T floatSampleToInt(float src) noexcept
{
if (src >= 1.f)
return std::numeric_limits<T>::max();
if (src < -1.f)
return std::numeric_limits<T>::min();
return src * (float)(1UL << (sizeof(T) * 8 - 1))
+ ((float)(1UL << (sizeof(T) * 8 - 1))
+ (float)std::numeric_limits<T>::min());
}

例如,如果您想将浮点样本转换为带符号的 16 位整数样本,您可以:

int16_t intSample = floatSampleToInt<int16_t>(floatSample);

请注意,24 位整数样本被 32 位覆盖。 32 位样本也是有效的 24 位样本;它的低 8 位只是被截断了。

关于c++ - 来自wav文件的数据在-1和1之间,c++,sndfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518980/

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