Rob*_* No 6 c++ audio wav pcm modulation
我用c ++编写了一个程序来生成800Hz正弦波的.wav文件(1通道,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))));
}
Run Code Online (Sandbox Code Playgroud)
生成的文件是: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;
Run Code Online (Sandbox Code Playgroud)
避免未定义的行为.同样的问题仍然适用.
您添加了舍入噪声和确定性量化噪声。您的正弦波以精确整数个样本重复;因此,舍入误差(或正弦波的浮点值和 UInt_8 值之间的差值)会精确地周期性重复,从而产生可听见的谐波。
将浮点正弦波转换为 UInt_8 值时,可以通过使用抖动和噪声过滤舍入来减少这种噪声。
抖动(或在舍入之前向每个样本添加分数随机值)可以消除确定性噪声。产生的噪声将更白,而不是由泛音组成。
噪声滤波不仅会舍弃舍入中的小数部分,还会将此小数余数与 IIR 滤波器集成,以将量化噪声移动到听得较少且不太可能产生 DC 偏移的位置。
| 归档时间: |
|
| 查看次数: |
884 次 |
| 最近记录: |