PCM音频数据音量大小调节

xiaoxiao2021-02-28  61

转载:http://blog.csdn.net/timsley/article/details/50683084

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

C语言实现

#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; } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

上面程序中,main函数中pcm_volume_control(100),这里设置为100主要是为了让其走入volume_adjust函数中的最后一个else语句,而最终放大的数据,是将其乘上一个40,这个值可以根据你自己的需求去调整。

vol = 40; tmp = (*in_buf)*vol; 12 12

经过上面的算法放大后,可以用Audacity工具去查看,放大后的PCM数据,如下图所示,上面的波形是原始数据,下面的波形是经过音量放大后的数据 

转载请注明原文地址: https://www.6miu.com/read-53272.html

最新回复(0)