通過pcm音訊資料計算分貝

2021-08-28 14:41:24 字數 2216 閱讀 7405

引數:pref:就是聲音總的振幅最大值;prms:就是當前聲音的振幅值;lp:就是我們需要的聲音分貝值了。

比如:我們聲音是無符號16bit深度的,那麼其每個取樣點的值應該在(0~2^16-1既:0~65535)範圍內,帶入公式我們可以計算到(不用除以最大振幅值):20*log(65535)=96.32db,所以根據這個我們只要拿到某個取樣點的振幅值,也就是當前聲音取樣點轉成16bit後的值就可以計算出相應的分貝值了。那麼怎麼求聲音取樣點的振幅呢?這是乙個問題,不過也有解決辦法了。

獲取pcm聲音取樣點的振幅:

/**

* 獲取所有振幅之平均值 計算db (振幅最大值 2^16-1 = 65535 最大值是 96.32db)

* 16 bit == 2位元組 == short int

* 無符號16bit:96.32=20*lg(65535);

** @param pcmdata 轉換成char型別,才可以按位元組操作

* @param size pcmdata的大小

* @return

*/int audio::getpcmdb(const unsigned char *pcmdata, size_t size)

sum = sum / (size / 2); //求平均值(2個位元組表示乙個振幅,所以振幅個數為:size/2個)

if(sum > 0)

return db;

}

很多場合我們需要動態顯示實時聲音分貝,下面列舉三種計算分貝的演算法。(以雙聲道為例,也就是乙個short型別,最大能量值為32767)

首先我們分別累加每個取樣點的數值,除以取樣個數,得到聲音平均能量值。

然後再將其做100與32767之間的等比量化。得到1-100的量化值。

通常情況下,人聲分布在較低的能量範圍,這樣就會使量化後的資料大致分布在1-20的較小區間,不能夠很敏感的感知變化。

所以我們將其做了5倍的放大,當然計算後大於100的值,我們將其賦值100.

//引數為資料,取樣個數

//返回值為分貝

#define volumemax 32767

int ******calculate_db(short* pcmdata, int sample)

ret = sum * 500.0 / (sample * volumemax);

if (ret >= 100)

}return ret;

}

static const float kmaxsquaredlevel = 32768 * 32768;

constexpr float kminlevel = 30.f;

void process(const int16_t* data, size_t length)

sample_count_ += length;.

float rms = sum_square_ / (sample_count_ * kmaxsquaredlevel);

//20log_10(x^0.5) = 10log_10(x)

rms = 10 * log10(rms);

if (rms < -kminlevel)

rms = -kminlevel;

rms = -rms;

return static_cast(rms + 0.5);

}

const int8_t permutation[33] =

;int16_t webrtcspl_maxabsvaluew16c(const int16_t* vector, size_t length)

}if (maximum > 32767)

return (int16_t)maximum;

}void computelevel(const int16_t* data, size_t length)

_currentlevel = permutation[position];

_absmax >>= 2;}}

alsa驅動下常用的PCM音訊資料格式

s8 signed 8 bits,有符號字元 char,表示範圍 128 127 u8 unsigned 8 bits,無符號字元 unsigned char,表示範圍 0 255 s16 le little endian signed 16 bits,小端有符號字 short,表示範圍 32768...

C語言 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 void pcm volume control int...

C語言 PCM音訊資料處理 降低取樣率

用一麥克風錄製的pcm資料,為16bit 48khz 單聲道,而我希望得到的是16khz取樣率的pcm資料,那就通過降低取樣率的方法,去實現48000hz到16000hz取樣率的轉換。轉換原理比較簡單,48000hz降到16000hz,實際上降了3倍,同一時間的單位區間內,48000hz取樣了3個點...