WAV格式音频控制

时间:2017-10-26 15:21:08

标签: c wav volume pcm

我试图在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文件,固件字节被正确验证观看者。

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

我出错了什么?

1 个答案:

答案 0 :(得分:0)

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

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