FreeCalypso > hg > efr-experiments
comparison src/pstfilt2.c @ 0:56410792419a
src: original EFR source from ETSI
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 03 Apr 2024 05:31:37 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:56410792419a |
|---|---|
| 1 /************************************************************************* | |
| 2 * | |
| 3 * FILE NAME: pstfilt2.c | |
| 4 * | |
| 5 * Performs adaptive postfiltering on the synthesis speech | |
| 6 * | |
| 7 * FUNCTIONS INCLUDED: Init_Post_Filter() and Post_Filter() | |
| 8 * | |
| 9 *************************************************************************/ | |
| 10 | |
| 11 #include "typedef.h" | |
| 12 #include "basic_op.h" | |
| 13 #include "sig_proc.h" | |
| 14 #include "count.h" | |
| 15 #include "codec.h" | |
| 16 #include "cnst.h" | |
| 17 | |
| 18 /*---------------------------------------------------------------* | |
| 19 * Postfilter constant parameters (defined in "cnst.h") * | |
| 20 *---------------------------------------------------------------* | |
| 21 * L_FRAME : Frame size. * | |
| 22 * L_SUBFR : Sub-frame size. * | |
| 23 * M : LPC order. * | |
| 24 * MP1 : LPC order+1 * | |
| 25 * MU : Factor for tilt compensation filter * | |
| 26 * AGC_FAC : Factor for automatic gain control * | |
| 27 *---------------------------------------------------------------*/ | |
| 28 | |
| 29 #define L_H 22 /* size of truncated impulse response of A(z/g1)/A(z/g2) */ | |
| 30 | |
| 31 /*------------------------------------------------------------* | |
| 32 * static vectors * | |
| 33 *------------------------------------------------------------*/ | |
| 34 | |
| 35 /* inverse filtered synthesis */ | |
| 36 | |
| 37 static Word16 res2[L_SUBFR]; | |
| 38 | |
| 39 /* memory of filter 1/A(z/0.75) */ | |
| 40 | |
| 41 static Word16 mem_syn_pst[M]; | |
| 42 | |
| 43 /* Spectral expansion factors */ | |
| 44 | |
| 45 const Word16 F_gamma3[M] = | |
| 46 { | |
| 47 22938, 16057, 11240, 7868, 5508, | |
| 48 3856, 2699, 1889, 1322, 925 | |
| 49 }; | |
| 50 const Word16 F_gamma4[M] = | |
| 51 { | |
| 52 24576, 18432, 13824, 10368, 7776, | |
| 53 5832, 4374, 3281, 2461, 1846 | |
| 54 }; | |
| 55 | |
| 56 /************************************************************************* | |
| 57 * | |
| 58 * FUNCTION: Init_Post_Filter | |
| 59 * | |
| 60 * PURPOSE: Initializes the postfilter parameters. | |
| 61 * | |
| 62 *************************************************************************/ | |
| 63 | |
| 64 void Init_Post_Filter (void) | |
| 65 { | |
| 66 Set_zero (mem_syn_pst, M); | |
| 67 | |
| 68 Set_zero (res2, L_SUBFR); | |
| 69 | |
| 70 return; | |
| 71 } | |
| 72 | |
| 73 /************************************************************************* | |
| 74 * FUNCTION: Post_Filter() | |
| 75 * | |
| 76 * PURPOSE: postfiltering of synthesis speech. | |
| 77 * | |
| 78 * DESCRIPTION: | |
| 79 * The postfiltering process is described as follows: | |
| 80 * | |
| 81 * - inverse filtering of syn[] through A(z/0.7) to get res2[] | |
| 82 * - tilt compensation filtering; 1 - MU*k*z^-1 | |
| 83 * - synthesis filtering through 1/A(z/0.75) | |
| 84 * - adaptive gain control | |
| 85 * | |
| 86 *************************************************************************/ | |
| 87 | |
| 88 void Post_Filter ( | |
| 89 Word16 *syn, /* in/out: synthesis speech (postfiltered is output) */ | |
| 90 Word16 *Az_4 /* input: interpolated LPC parameters in all subframes */ | |
| 91 ) | |
| 92 { | |
| 93 /*-------------------------------------------------------------------* | |
| 94 * Declaration of parameters * | |
| 95 *-------------------------------------------------------------------*/ | |
| 96 | |
| 97 Word16 syn_pst[L_FRAME]; /* post filtered synthesis speech */ | |
| 98 Word16 Ap3[MP1], Ap4[MP1]; /* bandwidth expanded LP parameters */ | |
| 99 Word16 *Az; /* pointer to Az_4: */ | |
| 100 /* LPC parameters in each subframe */ | |
| 101 Word16 i_subfr; /* index for beginning of subframe */ | |
| 102 Word16 h[L_H]; | |
| 103 | |
| 104 Word16 i; | |
| 105 Word16 temp1, temp2; | |
| 106 Word32 L_tmp; | |
| 107 | |
| 108 /*-----------------------------------------------------* | |
| 109 * Post filtering * | |
| 110 *-----------------------------------------------------*/ | |
| 111 | |
| 112 Az = Az_4; | |
| 113 | |
| 114 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) | |
| 115 { | |
| 116 /* Find weighted filter coefficients Ap3[] and ap[4] */ | |
| 117 | |
| 118 Weight_Ai (Az, F_gamma3, Ap3); | |
| 119 Weight_Ai (Az, F_gamma4, Ap4); | |
| 120 | |
| 121 /* filtering of synthesis speech by A(z/0.7) to find res2[] */ | |
| 122 | |
| 123 Residu (Ap3, &syn[i_subfr], res2, L_SUBFR); | |
| 124 | |
| 125 /* tilt compensation filter */ | |
| 126 | |
| 127 /* impulse response of A(z/0.7)/A(z/0.75) */ | |
| 128 | |
| 129 Copy (Ap3, h, M + 1); | |
| 130 Set_zero (&h[M + 1], L_H - M - 1); | |
| 131 Syn_filt (Ap4, h, h, L_H, &h[M + 1], 0); | |
| 132 | |
| 133 /* 1st correlation of h[] */ | |
| 134 | |
| 135 L_tmp = L_mult (h[0], h[0]); | |
| 136 for (i = 1; i < L_H; i++) | |
| 137 { | |
| 138 L_tmp = L_mac (L_tmp, h[i], h[i]); | |
| 139 } | |
| 140 temp1 = extract_h (L_tmp); | |
| 141 | |
| 142 L_tmp = L_mult (h[0], h[1]); | |
| 143 for (i = 1; i < L_H - 1; i++) | |
| 144 { | |
| 145 L_tmp = L_mac (L_tmp, h[i], h[i + 1]); | |
| 146 } | |
| 147 temp2 = extract_h (L_tmp); | |
| 148 | |
| 149 test (); | |
| 150 if (temp2 <= 0) | |
| 151 { | |
| 152 temp2 = 0; move16 (); | |
| 153 } | |
| 154 else | |
| 155 { | |
| 156 temp2 = mult (temp2, MU); | |
| 157 temp2 = div_s (temp2, temp1); | |
| 158 } | |
| 159 | |
| 160 preemphasis (res2, temp2, L_SUBFR); | |
| 161 | |
| 162 /* filtering through 1/A(z/0.75) */ | |
| 163 | |
| 164 Syn_filt (Ap4, res2, &syn_pst[i_subfr], L_SUBFR, mem_syn_pst, 1); | |
| 165 | |
| 166 /* scale output to input */ | |
| 167 | |
| 168 agc (&syn[i_subfr], &syn_pst[i_subfr], AGC_FAC, L_SUBFR); | |
| 169 | |
| 170 Az += MP1; | |
| 171 } | |
| 172 | |
| 173 /* update syn[] buffer */ | |
| 174 | |
| 175 Copy (&syn[L_FRAME - M], &syn[-M], M); | |
| 176 | |
| 177 /* overwrite synthesis speech by postfiltered synthesis speech */ | |
| 178 | |
| 179 Copy (syn_pst, syn, L_FRAME); | |
| 180 | |
| 181 return; | |
| 182 } |
