我试图在C:2通道中更改一个PCM波形文件的音量,
采样率:22050赫兹。每个样本24位。
但当我这样做的时候,我得到了很多扭曲,我尝试了一种在Reduce the volume of a Wav audio file using C的答案中找到的方法。
我也做了一个简单的除以2的24位数据,但所有的事情,我试图导致一个非常扭曲的信号(虽然音量下降)。
当我大胆地将音量降低了-6dB,并将新的wav传输到我的I2S放大器时,它将以完美的质量和低音量播放wav。所以大胆地将样本完美地转换。。但是他们是怎么做到的呢?
我的软件肯定做错了什么,但我不知道是什么。
以下代码使用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中导出了前两个样本,以及由我的固件打印的10个样本(通过使用十六进制查看器查看wav文件验证固件字节是否正确)。
WAV数据:
000000h,FFFEFEh,FFFFFF01H,00000H,FFFFFEh,FFFEFEh,FFFEFEh,00000H,00000H,00000H,00000H,00000H,FFFFFFFFDH,FFFFFFFFFFFF H,FFFFFFFF H,FFFFFFFFFF H,FFFFFFFF H,FFFFFFFF H,FFFFFFFF H,FFFFFFFFFF H,00000H,00000H,00000H,00000H,FFFFFFFF DH,FFFFFFFF DH,FFFFFFFFFF H,FFFFFFFFFF H,FFFFFF H,00000H,FFFFFFFF DHH,00000H,FFFFFFFFFF DHH,00000H,FFFFFFFFFFFF DHH,00000H,FFFFFFFFFFFFFFFEH,00000H,FFFFFFFFFFFFFFffff01h,000003h,000001h,FFFEFDh,fffff eh,FFFF03h,000002h,fffff dh,ffffff h、FFFF03h、fffff eh
我觉得奇怪的是,当第一个样本在audacity样本图中显示0时,会看到这样不同的值,比如000000h,FFFEFEh
这是前两个示例的audacity示例导出:
0.00000     0.00000
-0.00002    -0.00002

我做错什么了?

最佳答案

要收听“buffer”的新内容,必须将其从32位转换回24位,或者必须将文件格式更改为32位wav。你的问题中没有描述这一步骤。
转换到32位时,应左移8位,以使符号位处于正确位置,并使用32位的全动态。如果你的主人是小endian(如wave),endianness应该不是问题。
在试图改变增益之前,测试两个方向的转换!
用浮点数代替32位整数可以获得更精细的调谐增益。

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

10-10 07:04