1. 程式人生 > >PCM音訊資料音量大小調節

PCM音訊資料音量大小調節

轉載: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資料,如下圖所示,上面的波形是原始資料,下面的波形是經過音量放大後的資料 
這裡寫圖片描述