C WAV格式音频控制

C WAV格式音频控制,c,wav,volume,pcm,C,Wav,Volume,Pcm,我曾尝试更改C:2通道中PCM波形文件的音量, 采样率:22050赫兹。每个样本24位 但是当我这样做的时候,我得到了很多扭曲,我尝试了一种我在答案中找到的方法。 我还做了一个简单的除以24位数据中的2,但我尝试的所有方法都导致了一个非常失真的信号(尽管音量下降) 当我在audacity中将音量降低-6dB,并将新的wav传输到我的I2S放大器时,它将以完美的质量和低音量播放wav。所以audacity完美地转换了样本。。但他们是如何做到这一点的 我的软件一定出了问题,但我不知道是什么原因 以下

我曾尝试更改C:2通道中PCM波形文件的音量, 采样率:22050赫兹。每个样本24位

但是当我这样做的时候,我得到了很多扭曲,我尝试了一种我在答案中找到的方法。 我还做了一个简单的除以24位数据中的2,但我尝试的所有方法都导致了一个非常失真的信号(尽管音量下降)

当我在audacity中将音量降低-6dB,并将新的wav传输到我的I2S放大器时,它将以完美的质量和低音量播放wav。所以audacity完美地转换了样本。。但他们是如何做到这一点的

我的软件一定出了问题,但我不知道是什么原因

以下代码用100%的卷数据填充DMA缓冲区:

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

我做错了什么?

为了收听“缓冲区”的新内容,必须将其从32位转换回24位,或者将文件格式更改为32位wav。您的问题中没有描述此步骤。 到32位的转换应向左移位8位,以便使符号位处于正确位置并使用32位的全动态。如果你的主人是小endian(如wave),endian应该不是问题

在尝试改变增益之前,测试两个方向的转换!
使用浮点而不是32位整数可以获得更微调的增益。

您所说的“失真”可能是什么意思?b2、
b1
和b0的类型是什么?它们是否从有符号的值升级?缓冲区的类型是什么?如果您发布了,我们可能会看到您的问题。这些看起来像有符号的值,而不是无符号的。
int32_t temp;
temp = (int32_t)((uint32_t)b2 << 16) | ((uint32_t)b1 << 8) | ((uint32_t)b0);
buffer[i] = (uint32_t)(temp /2);
0.00000     0.00000
-0.00002    -0.00002