转载: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;
float vol = in_vol -
98;
if(-
98<vol && vol<
0)
vol =
1/(vol
*(-
1));
else if(
0<=vol && vol<=
1)
vol =
1;
else if(vol<=-
98)
vol =
0;
else if(vol>=
2)
vol =
40;
tmp = (
*in_buf)
*vol;
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数据,如下图所示,上面的波形是原始数据,下面的波形是经过音量放大后的数据