我正在阅读 Richard Boulanger 所著的音频编程书。在第二章中,我们使用 C 语言和标准库创建了几个基本音频速率振荡器来生成简单的 WAV 文件。
我的实现和本书的代码都表现出一个奇怪的问题:
我能够使用 sin() (来自 math.h)生成一个简单的正弦波,但注意到播放有一点静态。经过调查,我注意到有时某些峰值音频帧会“翻转”为负值。
为了调试这种情况,我将生成的音频帧的值输出到标准输出,并且这种翻转行为与峰值 0.999999 一致。
当我将输出缩放 0.99 时,这个问题就消失了。这是怎么回事?
最佳答案
查看 siggen.c,我发现真正的问题与最大值转换为短数据类型有关:
portsf.c:78
#define MAX_16BIT (32768.0)
portsf.c:1618
ssamp = (short) psf_round(fsamp * MAX_16BIT);
当我们的浮点样本接近 1.0 时,会导致转换(短)(32768)。鉴于短路最多只能容纳 32767,该值将被包裹到可能的最小短路 -32768。
要解决此问题,我建议将第 1618 行修改为:
ssamp = (short) psf_round(fsamp * 32767.0);
这会将峰峰值范围缩小 1,但我认为非常值得避免这个问题
关于c - 镜像音频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57548914/