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;}
上面程式中,main函數中pcm_volume_control(100),這裡設定為100主要是為了讓其走入volume_adjust函數中的最後一個else語句,而最終放大的資料,是將其乘上一個40,這個值可以根據你自己的需求去調整。
vol = 40; tmp = (*in_buf)*vol;
經過上面的演算法放大後,可以用Audacity工具去查看,放大後的PCM資料,如下圖所示,上面的波形是未經處理資料,下面的波形是經過音量放大後的資料
參考資料
1.PCM聲音資料解析
2.音頻重採樣與PCM音量大小最後代碼
3.PCM 音量大小