PCM音訊和音量調節

2021-10-09 10:23:53 字數 2064 閱讀 9195

聲音的本質是一種能量波,由振動而產生的能量波,通過傳輸介質傳輸出去。聲音有三個屬性:

波長是決定音調高低;振幅是決定音量高低;波紋是決定音色。

pcm(pulse code modulation,脈衝編碼調製)音訊資料是未經壓縮的音訊取樣資料裸流,它是由模擬訊號經過取樣、量化、編碼轉換成的標準數字音訊資料。

描述pcm資料主要有以下6個引數:

sample rate : 取樣頻率。8khz(**)、44.1khz(cd)、48khz(***)。

sample size : 量化位數,描述數碼訊號所使用的位數。8位(8bit)代表2的8次方=256,16 位(16bit)則代表2的16次方=65536;取樣位數越高,精度越高。

number of channels : 通道個數。常見的音訊有立體聲(stereo)和單聲道(mono)兩種型別,立體聲包含左聲道和右聲道。另外還有環繞立體聲等其它不太常用的型別。

sign : 表示樣本資料是否是有符號位,比如用一位元組表示的樣本資料,有符號的話表示範圍為-128 ~ 127,無符號是0 ~ 255。

byte ordering : 位元組序。位元組序是little-endian還是big-endian。通常均為little-endian。

integer or floating point : 整形或浮點型。大多數格式的pcm樣本資料使用整形表示,而在一些對精度要求高的應用方面,使用浮點型別表示pcm樣本資料。

對於16位,單聲道的音訊,取樣點幅值為2^15-1-2^15,即32767-32768,當乘以放大倍數後,需要對超出此範圍的資料進行溢位處理,但是如果乙個音訊幀中溢位資料過多,就會造成音訊失真,故要合理的動態的選擇放大倍數。

下面是兩種對16位,單聲道的音訊調節音量演算法

/*

*samples 音訊資料

*numsamples 音訊資料長度

*factor 振幅的係數 比如1.2

*/static int adjustmentvolume(short *samples,int numsamples,float factor)

else if(1.0 == factor)

for (int i = 0; i32767)

samples[i] = tmpvalue;

}return numsamples;

}

/*

*samples 音訊資料

*numsamples 音訊資料長度

*factor 振幅的係數 比如1.2

*/int adjustmentvolume(short *samples ,int numsamples, int factor)

//根據獲取到的最大值和最小值分別計算出在不失真的情況下,允許的放大倍數`maxfactor`和`minfactor`

short maxfactor = maxdata != 0 ? maxd/maxdata : 1;

short minfactor = mindata != 0 ? mind/mindata : 1;

//取其最小值為允許的放大倍數`allowfactor`

short allowfactor = maxfactor > minfactor ? minfactor : maxfactor;

//選擇合適的振幅的係數

factor = factor > allowfactor ? allowfactor : factor;

if (factor == 1)

else if(0 == factor)

//對pcm資料放大

long newdata = 0;

for (int i = 0; i < numsamples; i++) else if (newdata > maxd)

data = newdata&0xffff;

samples[i] = data;

}return numsamples;

}

C 調節PCM音量

在用 解碼器 具體的實現函式如下 void raisevolume char buf,uint32 size,uint32 urepeat,double vol buf為需要調節音量的音訊資料塊首位址指標,size為長度,urepeat為重複次數,通常設為1,vol為增益倍數,可以小於1 for i...

菜鳥修煉筆記 alsa 調節音訊音量大小

二。方法二 在linux終端直接設定alsa的引數。但實際上,我只成功使用了第二種方法,下面將簡單介紹一下第一種方法的原理,和我的嘗試,然後將重點放在第二種方法的介紹上。由於我沒有成功通過這個方法來放大音量,所以不詳細介紹具體的過程。下面主要是簡單介紹一下這個方法的原理和我做過的相關嘗試。具體的過程...

音量調節流程

在分析 android音訊系統時,習慣將其實現分為兩個部分 資料流和策略。資料流描述了音訊資料從資料來源流向目的地的過程。而策略則是管理及控制資料流的路徑與呈現的過程.audiotrack audiorecord 和audioflinger 可以被劃歸到資料流的範疇去討論。而 audiopolicy...