gpt4 book ai didi

c - WAV格式音频控制

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:20 26 4
gpt4 key购买 nike

我试图改变 C:2 channel 中 PCM 波形文件的音量,采样率:22050 赫兹。每个样本 24 位。

但是当我这样做时,我会得到很多失真,我尝试了一种在 Reduce the volume of a Wav audio file using C 的答案中找到的方法.我还对 24 位数据进行了简单的除以 2,但我尝试的所有操作都导致信号非常失真(尽管音量下降)。

当我大胆地将音量降低 -6dB 并将新的 wav 流式传输到我的 I2S 放大器时,它会以完美的质量和低音量播放 wav。所以 audacity 完美地转换了样本。但是他们是怎么做到的?

我的软件肯定有问题,但我不知道是什么。

以下代码使用 100% 容量数据填充 DMA 缓冲区:

buffer[i] = ((uint32_t)b2 << 16) | ((uint32_t)b1 << 8) | ((uint32_t)b0);

有了这段代码,我预计音量会变小,但它只会变得非常失真:

int32_t temp;
temp = (int32_t)((uint32_t)b2 << 16) | ((uint32_t)b1 << 8) | ((uint32_t)b0);
buffer[i] = (uint32_t)(temp /2);

知道为什么会发生失真吗?

我也试图弄清楚数据是如何存储的,因此我从 audacity 中导出了前 2 个样本,以及我的固件打印的 10 个样本(通过使用十六进制查看 wav 文件验证固件字节是否正确观众。

WAV 数据:

000000h,FFFEFEh,FFFF01h,000002h,FFFEFEh,FFFEFEh,000002h,000002h,FFFFFDh,FFFFFFh,FFFF04h,000000h,FFFFFDh,000000h,000002h,FFFFFFh,FFFF02h,FFFEFFh,FFFFFEh,000003h,000002h,FFFFFDh,FFFEFEh,000002h,FFFF01h,FFFFFFh,FFFFFFh,000000h,000002h,000002h,FFFFFDh,000002h,000003h,FFFFFEh,FFFFFDh,FFFF01h,000003h,000001h,FFFEFDh,FFFFFEh,FFFF03h,000002h,FFFFFDh,FFFFFFh,FFFF03h,FFFFFEh

我认为看到像 000000h,FFFEFEh 这样不同的值很奇怪,而第一个示例在 audacity 示例图中显示 0。这是前 2 个示例的大胆示例导出:

0.00000     0.00000
-0.00002 -0.00002

我做错了什么?

最佳答案

为了收听“缓冲区”的新内容,必须将其从 32 位转换回 24 位,或者必须将文件格式更改为 32 位 wav。您的问题中未描述此步骤。到 32 位的转换应该向左移动 8 位,以便在正确的位置获得符号位并使用 32 位的完整动态。如果您的主机是小端(如 wave),则字节序应该不是问题。

在尝试改变增益之前测试两个方向的转换!通过使用 float 而不是 32 位整数可以获得更精细的调整增益。

关于c - WAV格式音频控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958120/

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