PCM數據的各種算法


1.pcm音量加強
算法:
獲取一個音頻幀中的最大值max和最小值min
根據獲取到的最大值和最小值分別計算出在不失真的情況下,允許的放大倍數maxfactor和minfactor,取其最小值為允許的最大放大倍數allowfactor
根據給定的經驗系數factor,選擇合適的系數,對PCM數據放大即可
code:
void raiseVolume(unsigned char* buffer,int length,int factor)
{
signed short MIN = -0x8000;
signed short MAX = 0x7FFF;
signed short low = 0, high = 0, data = 0, maxData = 0, minData = 0;
//獲取一個音頻幀中的最大值max和最小值min
for (int i = 0; i < length; i+=2) {
low = buffer[i];
high = buffer[i+1];
data = low+(high<<8);
maxData = maxData > data ? maxData : data;
minData = minData < data ? minData : data;
}
//根據獲取到的最大值和最小值分別計算出在不失真的情況下,允許的放大倍數maxfactorminfactor
signed short maxfactor = maxData != 0 ? MAX/maxData : 1;
signed short minfactor = minData != 0 ? MIN/minData : 1;
if (minfactor == 1 || maxfactor == 1) {
return;
}
//取其最小值為允許的放大倍數allowfactor
signed short allowfactor = MIN(maxfactor, minfactor);
//根據經驗系數factor,選擇合適的系數
factor = factor > allowfactor ? allowfactor : factor;
if (factor <= 1) {
return;
}
//對PCM數據放大
signed long newData = 0;
for (int i = 0; i < length; i+=2) {
low = buffer[i];
high = buffer[i+1];
data = low+(high<<8);
newData = data*factor;
//邊界值溢出處理
if (newData < MIN) {
newData = MIN;
}else if (newData > MAX) {
newData = MAX;
}
data = newData&0xffff;
buffer[i] = data&0x00ff;
buffer[i+1] = (data&0xff00)>>8;
}
}

2.根據分貝調整音量
算法:參考:https://blog.jianchihu.net/pcm-vol-control-advance.html

dB = 20 * log(A1 / A2),我們取參考聲音振幅A2為原始聲音振幅,A1為調節后的聲音振幅大小。可知調節后的聲音:
A1 = A2 * pow(10 , db/20);
看過一篇文章說理想的聲音調節步長最好是2db,對於96db范圍,我們按2db步長進行分割,可以分成48份,這樣我們得到的聲音變化為[-96db,-94db,-92db,...-4db.-2db,0db],假設我們要調節一半音量大小,也就是-48db,由上述公式可知:調節后音量A1大小:
A1 = A2 * pow(10 , -48/20)
code:
int16_t pcm[1024] = read in some pcm data;
int32_t pcmval;
float multiplier = pow(10,db/20);
for (ctr = 0; ctr < 1024; ctr++) {
pcmval = pcm[ctr] * multiplier;
if (pcmval < 32767 && pcmval > -32768) {
pcm[ctr] = pcmval
} else if (pcmval > 32767) {
pcm[ctr] = 32767;
} else if (pcmval < -32768) {
pcm[ctr] = -32768;
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM