c - 镜像音频帧

标签 c audio audacity

我正在阅读 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/

相关文章:

ios - 在没有麦克风权限的情况下在iOS7中使用蓝牙声音设备

audio - 录制带有大量静音的流式音频

audio - 如何在安静的地方批量分割音频文件?

c - 扩展动态分配的指针数组

c - 为什么使用 a[i][j] 访问动态分配的二维数组元素有效?

C能完全抽象出数据结构吗?

html - HTML5音频标签+ jQuery:切换事件按钮

audio - 订阅/动态静音WebRTC房间中的许多音频流的理想方法?

python - 为什么 librosa 图与 matplotlib 和 audacity 不同

c - 在未正确分配的函数中初始化的链表结构