gpt4 book ai didi

c++ - 写入8位PCM正弦波wav文件产生泛音

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:59 25 4
gpt4 key购买 nike

我用 C++ 编写了一个程序来生成 800Hz 正弦波的 .wav 文件(1 channel ,8 位,16000Hz 采样,32000 个样本,所以 2 秒长),但是当我在 Audacity 中播放它或检查它的频谱图时, 它有泛音。

我认为问题在于将正弦波转换为 PCM 的算法;我不确定将“零”位移放在哪里,例如 127、127.5 或 128 等。

char data[32000];
for (int j = 0; j < 32000; ++j)
{
data[j] = (char) (round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j / 20.0))));
}

生成的文件是这样的:output.wav

如有必要,这里是 cpp 文件:wavwriter.cpp

谢谢!

编辑 2:我已将 char 更改为 uint8_t

uint8_t data[32000];
for (int j = 0; j < 32000; ++j)
{
data[j] = round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j / 20.0)));


}
outfile.write((char *)&data[0], sizeof data);


outfile.close();
return true;

避免未定义的行为。同样的问题仍然存在。

最佳答案

您添加了舍入噪声和确定性量化噪声。您的正弦波以精确的整数个样本重复;因此,舍入误差(或正弦波的浮点值与 UInt_8 值之间的差异)会精确地周期性重复,从而产生可听见的谐波。

在将浮点正弦波转换为 UInt_8 值时,您可以通过使用抖动和噪声过滤舍入来减少这种噪声。

抖动(或在舍入之前向每个样本添加小数随机值)消除确定性噪声。由此产生的噪音会更白,而不是泛音。

噪声过滤不仅将小数部分从舍入中剔除,而且将此小数余数与 IIR 滤波器集成,以将量化噪声移动到不太可能被听到且不太可能产生 DC 偏移的位置。

关于c++ - 写入8位PCM正弦波wav文件产生泛音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36814549/

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