PCM音訊資料音量大小調節
阿新 • • 發佈:2019-02-06
轉載: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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
上面程式中,main函式中pcm_volume_control(100),這裡設定為100主要是為了讓其走入volume_adjust函式中的最後一個else語句,而最終放大的資料,是將其乘上一個40,這個值可以根據你自己的需求去調整。
vol = 40;
tmp = (*in_buf)*vol;
- 1
- 2
- 1
- 2
經過上面的演算法放大後,可以用Audacity工具去檢視,放大後的PCM資料,如下圖所示,上面的波形是原始資料,下面的波形是經過音量放大後的資料