ShellAlbert / AudioPipeline

Apache License 2.0
0 stars 0 forks source link

PCM audio data 音量放大原理 #6

Closed ShellAlbert closed 3 years ago

ShellAlbert commented 3 years ago

www

ShellAlbert commented 3 years ago

PCM音频数据增大或减小的原理主要是,将采样的数据乘上一个数字或者是除以一个数字,但要注意溢出处理。具体实现如下 `#define OLD_FILE_PATH "file.pcm"

define VOL_FILE_PATH "vol.pcm"

int volume_adjust(short in_buf, short out_buf, float in_vol) { int i, tmp;

// in_vol[0, 100]
float vol = in_vol - 98;

if(-98<vol && vol<0)
    vol = 1/(vol*(-1));
else if(0<=vol && vol<=1)
    vol = 1;
/*
else if(1<=vol && vol<=2)
    vol = vol;
*/
else if(vol<=-98)
    vol = 0;
else if(vol>=2)
    vol = 40;  //这个值可以根据你的实际情况去调整

tmp = (*in_buf)*vol; // 上面所有关于vol的判断,其实都是为了此处*in_buf乘以一个倍数,你可以根据自己的需要去修改

// 下面的code主要是为了溢出判断
if(tmp > 32767)
    tmp = 32767;
else if(tmp < -32768)
    tmp = -32768;
*out_buf = tmp;

return 0;

}

void pcm_volume_control(int volume) { short s16In = 0; short s16Out = 0; int size = 0;

FILE *fp = fopen(OLD_FILE_PATH, "rb+");
FILE *fp_vol = fopen(VOL_FILE_PATH, "wb+");

while(!feof(fp))
{
    size = fread(&s16In, 2, 1, fp);
    if(size>0)
    {        
        volume_adjust(&s16In, &s16Out, volume);
        fwrite(&s16Out, 2, 1, fp_vol);       
    }
}

fclose(fp);
fclose(fp_vol);

}

int main(void) { pcm_volume_control(100); return 0; }`

abs

ShellAlbert commented 3 years ago

音量放大 1.软件放大是有一定范围限制的,如果是16bit的采样位数, 则最大值为2^15-1,最小范围为-2^15-1 , (+32767~ -32768) 2.硬件放大则无限制,只要电流足够能驱动得了后级负载阻抗,声音就可以无限大。 如果后级负载是32欧姆,如果以5V的电压驱动,那么就是5V/32-Ohms=0.15625A的电流, 而如果我们放大信号,以10V的电压驱动,那么负载就能得到10V/32-Ohms=0.3125A的电流,电流增大一倍,功率增大一倍。

最高位表示符号位 最大值:正值=2^15-1 0111,1111,1111,1111=+32767 最小值,负值=-2^15 1111,1111,1111,1111=-32768

ShellAlbert commented 3 years ago

自动音量控制 音量较小时,自适应放大。 1111 agc处理后: 2222

音量较大时,自适应放小。 3333 agc处理后: 4444