我试图在C:2频道中更改PCM波形文件的音量, 采样率:22050 Hz。每个样本24位。
但是当我这样做时,我得到了很多失真,我尝试了一种我在Reduce the volume of a Wav audio file using C的答案中找到的方法。 我还对24位数据中的2位进行了简单的除法,但我尝试的所有内容都导致信号失真(尽管音量下降)。
当我将音量降低-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);
知道扭曲发生的原因吗?
我也试图找出数据是如何存储的,因此我已经输出了大胆的前2个样本,以及我的固件打印的10个样本(通过查看带有十六进制的wav文件,固件字节被正确验证观看者。
000000,FFFEFEh,FFFF01h,为000002h,FFFEFEh,FFFEFEh,为000002h,为000002h,FFFFFDh,为FFFFFFh,FFFF04h,000000,FFFFFDh,000000,为000002h,为FFFFFFh,FFFF02h,FFFEFFh,FFFFFEh,000003h,为000002h,FFFFFDh,FFFEFEh,为000002h ,FFFF01h,为FFFFFFh,为FFFFFFh,000000,为000002h,为000002h,FFFFFDh,为000002h,000003h,FFFFFEh,FFFFFDh,FFFF01h,000003h,000001H,FFFEFDh,FFFFFEh,FFFF03h,为000002h,FFFFFDh,为FFFFFFh,FFFF03h,FFFFFEh
我觉得看到像000000h,FFFEFEh
这样的不同值很奇怪,而第一个样本在大胆样本图中显示为0。
这是前两个样本的大胆样本导出:
0.00000 0.00000
-0.00002 -0.00002
我出错了什么?
答案 0 :(得分:0)
为了侦听“缓冲区”的新内容,必须将其从32位转换回24位,或者必须将文件格式更改为32位wav。您的问题中没有描述此步骤。 转换为32位应该向左移8位,以使符号位处于正确位置并使用32位的完整动态。如果您的主机是小端(如波形),则字节顺序不应成为问题。
在尝试改变增益之前测试两个方向的转换! 通过使用float而不是32位整数可以获得更精细的调整增益。