📄 postfilt.dsp
字号:
IF MV SAT MR;
AR=MR0-AY0,SR0=AY0;
AY0=AR,AR=MR1-AY1+C-1;
NONE=PASS AR;
IF LT JUMP find_cormax;
NONE=AR OR AY0;
IF EQ JUMP find_cormax;
SR0=MR0;
AR=PASS AF,AY1=MR1;
DM(T0_index)=AR;
find_cormax: AF=AF+1,AY0=SR0;
DM(cormax_lo)=AY0;
DM(cormax_hi)=AY1;
AR=DM(T0_index);
{-------------Compute the energy of the signal delayed by t0----------}
MR =0;
MR0=1;
I4=I2;
AR=-AR;
M5=AR;
// CNTR=SI;
MODIFY(I4,M5);
CNTR=SI;
DO mac_ener UNTIL CE;
AR=DM(I4,M4);
mac_ener: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
AX1=MR1;
MR=0,AX0=MR0;
{-------------Compute the signal energy in the present subframe------------}
MR0=1;
I4=I2;
CNTR=SI;
DO mac_ener0 UNTIL CE;
AR=DM(I4,M4);
mac_ener0: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
NONE=PASS AY1;
IF GE JUMP no_recmax;
AY1=0;
AY0=0;
no_recmax: AR=MR0-AY0;
AR=MR1-AY1+C-1;
NONE=PASS AR;
{----------scale "cor_max", "ener" and "ener0" on 16 bits-------}
IF LT JUMP exc_ener0;
AY1=MR1;
AY0=MR0;
exc_ener0: AR=AX0-AY0;
AR=AX1-AY1+C-1;
NONE=PASS AR;
IF LT JUMP exc_ener;
AY1=AX1;
AY0=AX0;
exc_ener: AR=PASS AY1;
AY1=DM(cormax_hi);
SE=EXP AR(HI),AR=AY0;
AY0=DM(cormax_lo);
SE=EXP AR(LO),AR=AY0;
SR=NORM AR(LO),AR=AY1;
SR=SR OR NORM AR(HI);
AR=SR0+H#8000;
AR=SR1+C;
AR=PASS AX0,MX0=AR;
SR=NORM AR (LO),AR=AX1;
SR=SR OR NORM AR(HI);
AR=SR0+H#8000;
AR=SR1+C;
SR=NORM MR0 (LO),MY0=AR;
SR=SR OR NORM MR1(HI);
AR=SR0+H#8000;
AR=SR1+C;
/*-----------prediction gain (dB)= -10 log(1-cor_max*cor_max/(ener*ener0))---*/
/*-----------temp = (cor_max * cor_max) - (0.5 * ener * ener0)---------------*/
MR=AR * MY0(SS);
SR=LSHIFT MR0 BY -1(LO);
SR=SR OR ASHIFT MR1 BY -1(HI);
AY0=SR0;
MR=MX0 * MX0(SS);
AF=MR0-AY0,AY1=SR1;
AF=MR1-AY1+C-1,AY0=MX0;
NONE=PASS AF;
IF GE JUMP cal_gain;
CNTR=SI;
DO copy_pstsig UNTIL CE;
AR=DM(I1,M1);
copy_pstsig: DM(I0,M1)=AR;
RTS;
cal_gain: AR=MY0;
NONE=AY0-AR;
IF LE JUMP cmax_bran2;
MY1=GAMMAP_2;
MY0=INV_GAMMAP;
JUMP cal_signal;
cmax_bran2: MY1=GAMMAP;
MR=MX0 * MY1(SS);
SR=ASHIFT MR1 BY -1(LO);
AF=PASS SR0,MX0=SR0;
SR=ASHIFT AR BY -1(LO);
AR=SR0+AF,MY0=SR0;
IF LE JUMP gain_bran1;
SR=ASHIFT AR BY 0(LO);
MR0=MX0;
MR1=MR2;
CALL div_s;
AY0=H#7FFF;
AR=AY0-AR,MY1=AR;
MY0=AR;
JUMP cal_signal;
gain_bran1: MY1=0;
MY0=H#7FFF;
cal_signal: I4=I1;
// CNTR=SI;
MODIFY(I4,M5);
CNTR=SI;
{-----------signal_pst[i] = g0*signal[i] + gain*signal[i-t0]----}
DO pst_signal UNTIL CE;
MX0=DM(I1,M1);
MR=MX0 * MY0(SS),MX1=DM(I4,M4);
MR=MX1 * MY1(SS),AY0=MR1;
AR=MR1+AY0;
pst_signal: DM(I0,M1)=AR;
RTS;
/**************************************************************************
* Procedure Init_Post_Filter: *
* Initializes the postfilter parameters: *
* $$01/10/2000 only used in decoder *
* Calling Parameters *
* Return Values *
* Altered Registers: AR,I0,I1,M1 *
* Computation Time : 18 cycles *
***************************************************************************/
.ENTRY Init_Post_Filter;
Init_Post_Filter:
// CNTR=M;
AR=^res2_buf + PIT_MAX;
DM(res2)=AR;
AR=^scal_res2_buf + PIT_MAX;
DM(scal_res2)=AR;
I0=^mem_syn_pst;
CNTR=M;
DO zero_mem UNTIL CE;
zero_mem: DM(I0,M1)=0;
I0=^res2_buf;
I1=^scal_res2_buf;
CNTR=PIT_MAX+L_SUBFR;
DO zero_res2 UNTIL CE;
DM(I0,M1)=0;
zero_res2: DM(I1,M1)=0;
AR=PASS 0;
DM(mem_pre)=AR;
AR=PASS 4096;
DM(past_gain)=AR;
RTS;
/**************************************************************************
* Preemphasis: filtering through 1 - g z^-1 *
* $$01/10/2000 only used in decoder *
* Calling Parameters *
* MX0 : Q15 preemphasis coefficient *
* AY0 : size of filtering (L-1) *
* Return Values *
* I0 : input signal overwritten by the output *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
preemphasis: M3=AY0;
// CNTR=AY0;
MODIFY(I0,M3);
I1=I0;
MODIFY(I1,M2);
AX0=DM(I0,M0);
MY0=DM(I1,M2);
CNTR=AY0;
DO save_p1 UNTIL CE;
MR=MX0 * MY0(SS),AY0=DM(I0,M0);
AR=AY0-MR1,MY0=DM(I1,M2);
save_p1: DM(I0,M2)=AR;
MY0=DM(mem_pre);
MR=MX0 * MY0(SS),AY0=DM(I0,M0);
AR=AY0-MR1;
DM(I0,M0)=AR;
DM(mem_pre)=AX0;
RTS;
/**************************************************************************
* Scale the postfilter output on a subframe basis by automatic control *
* of the subframe gain. *
* gain[n] = AGC_FAC * gain[n-1] + (1 - AGC_FAC) g_in/g_out *
* $$01/10/2000 only used in decoder *
* Calling Parameters *
* I1 : postfilter input signal *
* SI : subframe size *
* Return Values *
* I2 : postfilter output signal *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf signal[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMtmp expon;
agc: I0=I2;
// CNTR=SI;
I4=^signal;
CNTR=SI;
{---------calculate gain_out with exponent-----------}
DO shr_signal UNTIL CE;
AR=DM(I0,M1);
SR=ASHIFT AR BY -2(LO);
shr_signal: MR=0,DM(I4,M4)=SR0;
nop;
I4=^signal;
CNTR=SI;
DO mac_signal UNTIL CE;
AR=DM(I4,M4);
mac_signal: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
AY0=MR0;
AR=MR1 OR AY0;
IF NE JUMP not_zero;
DM(past_gain)=AR;
RTS;
not_zero: SE=EXP MR1 (HI);
SE=EXP MR0 (LO);
AR=PASS -1,AY0=SE;
AR=AR-AY0;
SE=AR;
DM(expon)=AR;
SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1 (HI);
AR=SR0+H#8000;
AR=SR1+C;
{---------calculate gain_in with exponent-------------}
I0=I1;
// CNTR=SI;
I4=^signal;
CNTR=SI;
DO shr_sigout UNTIL CE;
SR0=DM(I0,M1);
SR=ASHIFT SR0 BY -2(LO);
shr_sigout: MR=0,DM(I4,M4)=SR0;
nop;
I4=^signal;
CNTR=SI;
DO mac_sigout UNTIL CE;
SR0=DM(I4,M4);
mac_sigout: IF NOT MV MR=MR+SR0*SR0(SS);
IF MV SAT MR;
AY1=MR0;
AF=MR1 OR AY1;
IF EQ JUMP comp_gain;
SE=EXP MR1(HI);
SE=EXP MR0(LO);
SR=NORM MR0(LO),AX1=SE;
SR=SR OR NORM MR1(HI),MR1=AR;
AR=SR0+H#8000;
AR=SR1+C,MR0=MR1;
/*---------------------------------------------------*
* g0(Q12) = (1-AGC_FAC) * sqrt(gain_in/gain_out); *
*--------------------------------------------------*/
SR=ASHIFT AR BY 0(LO);
AY1=DM(expon);
AR=AX1+AY1,MR1=MR2;
AR=-AR;
DM(expon)=AR;
CALL div_s;
SR=ASHIFT AR BY 0(LO);
SR=ASHIFT SR1 BY 7(HI);
SR=SR OR LSHIFT AR BY 7(LO);
SE=DM(expon);
SR=LSHIFT SR0 (LO),AR=SR1;
SR=SR OR ASHIFT AR (HI);
/*---------i(Q12) = s(Q19) = 1 / sqrt(s(Q22))----------*/
MR0=SR0;
MR1=SR1;
CALL Inv_sqrt;
AR=PASS SR1;
SR=LSHIFT SR0 BY 9(LO);
SR=SR OR ASHIFT AR BY 9(HI);
AR=SR0+H#8000;
AR=SR1+C;
/*---------g0(Q12) = i(Q12) * (1-AGC_FAC)(Q15)---------*/
MY0=AGC_FAC1;
MR=AR * MY0(SS);
AF=PASS MR1;
/*----------compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out---*/
/*----------sig_out(n) = gain(n) sig_out(n)-------------------------------------*/
comp_gain: //CNTR=SI;
MX0=DM(past_gain);
MY0=AGC_FAC;
CNTR=SI;
DO sigout_loop UNTIL CE;
MR=MX0 * MY0(SS);
AR=MR1+AF,MY1=DM(I2,M0);
MR=AR * MY1(SS),MX0=AR;
SR=LSHIFT MR0 BY 3(LO);
SR=SR OR ASHIFT MR1 BY 3(HI);
sigout_loop: DM(I2,M1)=SR1;
DM(past_gain)=MX0;
RTS;
/***************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -