g723原始碼詳細分析 19 基音後置濾波器

2021-06-03 07:21:28 字數 2570 閱讀 1905

現在來分析g723基音後置濾波器

根據基音周期間,激勵訊號的相關性,來對激勵訊號做乙個增強處理

相應的函式分別是 comp_lpf filt_lpf

comp_lpf 負責計算最佳的基音延後,

具體地說,是在基音週期延遲附近,找出最匹配當前子幀激勵的60個連繼激勵e[i].

使用的方法自然找自相關最大的.找到之後,對e[i]進行加權,與當前子幀的激勵相加,

這樣就能達到增加音效的作用.查詢分兩個方向進行,前向與後向.

公式見itu 723文件3.6節 式42

現在來看**,

一開始,就查詢前向後向自相關最大的兩個延遲

bindx = find_b( buff, olp, sfc ) ;//lsc 這個返回負值

findx = find_f( buff, olp, sfc ) ;//lsc 這個返回正值

find_b find_f 這兩個函式十分類似,只是查詢的方向不同,乙個前向,乙個後向,

前向後向都為負值,則基音後置濾波就不進行了

find_b函式:

word16   find_b( word16 *buff, word16 olp, word16 sfc )

}return indx ;

}接下來計算能量,用於計算增益

/* compute target energy */

acc0 = (word32) 0 ;

for ( j = 0 ; j < subfrlen ; j ++ )

acc0 = l_mac( acc0, buff[pitchmax+(int)sfc*subfrlen+j],

buff[pitchmax+(int)sfc*subfrlen+j] ) ;

lcr[0] = acc0 ;//lsc 當前子幀的能量

然後是計算基音延後自相關,以及基音延後的能量

前向和後向延後當中,選擇的依據是以下兩式的大小

cb^2/eb  cf^2/ef

cb:後向自相關 eb:後向的能量

cf:前向自相關 ef:前向的能量

計算後向的自相關與能量的**片段如下:

if ( bindx != (word16) 0 )

lcr[1] = acc0 ;//lsc 互相關

lcr[2] = acc1 ;//lsc 能量

}else

前向的計算與以類似,就不例舉了

計算結果 當前子幀能量,前後向相關以及能量會被歸一化存入scr陣列當中

比較,並計算基音後置濾波的引數,比較仍然是用交叉乘繞開除法

if ( (bindx != (word16) 0) && ( findx != (word16) 0) )

get_ind 這個函式負責計算基音後置濾波器引數

這裡有個基音後置濾波器是否有效的判斷,

依據基音延遲激勵與當前子幀激勵的相關性來判斷的,itu裡的定義比較繞,

直接看**反而簡單:

/* check valid gain */

acc0 = l_mult( ten, enr ) ;

acc0 = l_shr( acc0, (word16) 2 ) ;

acc1 = l_mult( ccr, ccr ) ;

if ( acc1 > acc0 )

/* compute scaling gain */ //lsc 這裡是計算ppf` 即itu文件的 式 42

acc0 = l_deposit_h( ten ) ;

acc0 = l_shr( acc0, (word16) 1 ) ;

acc0 = l_mac( acc0, ccr, pf.gain ) ;//lsc 平方展開,會有乙個自相關的項,這裡被加上

exp  = mult( pf.gain, pf.gain ) ;

acc1 = l_mult( enr, exp ) ;

acc1 = l_shr( acc1, (word16) 1 ) ;

acc0 = l_add( acc0, acc1 ) ;

exp = round( acc0 ) ;

acc1 = l_deposit_h( ten ) ;

acc0 = l_deposit_h( exp ) ;

acc1 = l_shr( acc1, (word16) 1 ) ;

if ( acc1 >= acc0 )

exp = (word16) 0x7fff ;

else

exp = div_l( acc1, exp ) ;

acc0 = l_deposit_h( exp ) ;

pf.scgn = sqrt_lbc( acc0 ) ;//這裡得到了gp

}else

pf.gain = mult( pf.gain, pf.scgn ) ;//gp需要單獨保留,而gf/gb則是不需要的 見式42

將濾波器應用與激勵訊號,這個比較簡單,基本是把itu文件3.6節的式42翻譯成c**

void  filt_lpf( word16 *tv, word16 *buff, pfdef pf, word16 sfc )

return;

}林紹川

2012.01.18於杭州

g723原始碼詳細分析 三 lsp量化

4 lsp系數量化 現在來分析這個 10 lsp係數已經計算出來了,由於lsp的性質,可以將它們分成若干段,分別量化 它們將會被分成 3,3,4這三個分向量 每個向量都會有乙個256的碼本表 大概是這麼多的,可以直接計算一下那個陣列的大小 lsp qnt 這個函式,執行lsp量化的過程,會形成乙個l...

g723原始碼詳細分析 17 舒適雜訊解碼

dec cng舒適雜訊解碼 知道舒適雜訊如何生成,解碼就簡單了.sid會傳遞濾波引數 在濾波器相似度不高時,sid報文會被傳送 解出報文裡的lpc引數與增益估值 片段 sid frame decoding deccng.sidgain dec sidgain line sfs 0 mamp inve...

g723原始碼詳細分析 18 丟包補償

g723對網路丟包行為了一些處理 涉及的函式為comp info regen comp info 負責計算插值依據 它的四個引數 word16 buff 激勵陣列,包含之前的145個激勵 word16 olp 當前幀的基音週期 word16 gain 輸入增益 歸一化的 word16 shgain ...