Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h"
7 : #include "prot_fx.h"
8 :
9 : /*-------------------------------------------------------------------*
10 : * swb_hr_nonzero_subband_noise_fill()
11 : *
12 : * SWB BWE HR noise filling of zero subbands
13 : *-------------------------------------------------------------------*/
14 861 : static void swb_hr_nonzero_subband_noise_fill_fx(
15 : const Word16 tilt_wb_fx, /* i : tilt of wideband signal Q11 */
16 : Word16 *t_audio_fx, /* i/o: mdct spectrum Q_audio */
17 : Word16 *bwe_highrate_seed, /* i/o: seed of random noise */
18 : const Word16 N, /* i : length of subband */
19 : const Word16 Nsv, /* i : number of subband */
20 : Word16 Q_audio )
21 : {
22 : Word16 i, j;
23 : Word16 *ptr_fx;
24 : Word16 min_bwe_fx, max_bwe_fx, tmpF_fx;
25 : Word16 tmp;
26 :
27 861 : IF( GT_16( tilt_wb_fx, 10240 /* 5 in Q11 */ ) )
28 : {
29 2215 : FOR( i = 0; i < Nsv; i++ )
30 : {
31 2122 : min_bwe_fx = MAX_16;
32 2122 : move16();
33 2122 : max_bwe_fx = 0;
34 2122 : move16();
35 2122 : tmp = i_mult2( i, N );
36 19098 : FOR( j = 0; j < N; j++ )
37 : {
38 16976 : tmpF_fx = abs_s( t_audio_fx[tmp + j] ); // Q_audio
39 :
40 16976 : max_bwe_fx = s_max( tmpF_fx, max_bwe_fx );
41 16976 : if ( tmpF_fx > 0 )
42 : {
43 11560 : min_bwe_fx = s_min( tmpF_fx, min_bwe_fx );
44 : }
45 : }
46 :
47 2122 : test();
48 2122 : if ( EQ_16( max_bwe_fx, min_bwe_fx ) && GT_16( min_bwe_fx, shl( 1, Q_audio ) ) )
49 : {
50 891 : min_bwe_fx = mult_r( min_bwe_fx, 16384 /* 0.5 in Q15 */ ); // Q_audio + Q15 - Q15 -> Q_audio
51 : }
52 :
53 2122 : ptr_fx = &t_audio_fx[tmp];
54 19098 : FOR( j = 0; j < N; j++ )
55 : {
56 16976 : IF( *ptr_fx == 0 )
57 : {
58 5416 : tmp = mult_r( min_bwe_fx, 16384 /* 0.5 in Q15 */ );
59 5416 : if ( Random( bwe_highrate_seed ) <= 0 ) // Q_audio + Q15 - Q15 -> Q_audio
60 : {
61 2705 : tmp = negate( tmp );
62 : }
63 5416 : *ptr_fx = tmp; // Q_audio
64 5416 : move16();
65 : }
66 16976 : ptr_fx++;
67 : }
68 : }
69 : }
70 :
71 861 : return;
72 : }
73 :
74 : /*-------------------------------------------------------------------*
75 : * swb_hr_noise_fill()
76 : *
77 : * SWB BWE HR noise filling
78 : *-------------------------------------------------------------------*/
79 861 : void swb_hr_noise_fill_fx(
80 : const Word16 is_transient, /* i : transient flag */
81 : const Word16 spect_start, /* i : spectrum start point */
82 : const Word16 spect_end, /* i : spectrum end point */
83 : const Word16 tilt_wb_fx, /* i : tilt of wideband signal Q11 */
84 : const Word16 pitch_fx, /* i : pitch value Q4 */
85 : const Word16 nq[], /* i : AVQ nq index */
86 : Word16 Nsv, /* i : number of subband */
87 : Word16 *bwe_highrate_seed, /* i/o: seed of random noise */
88 : Word16 *t_audio_fx, /* i/o: mdct spectrum Q_audio */
89 : Word16 Q_audio )
90 : {
91 : Word16 i, j, k;
92 : Word16 pos_start, pos_end, incr;
93 : Word16 tmp, tmp1, tmp2, tmp3, tmp_exp;
94 : Word16 alpha_fx, beta_fx;
95 :
96 861 : IF( is_transient )
97 : {
98 256 : tmp_exp = sub( 16, Q_audio );
99 2304 : FOR( i = 0; i < Nsv; i++ )
100 : {
101 2048 : IF( nq[i] == 0 )
102 : {
103 568 : tmp = i_mult( i, WIDTH_BAND );
104 5112 : FOR( j = 0; j < WIDTH_BAND; j++ )
105 : {
106 4544 : t_audio_fx[tmp + j] = shr( Random( bwe_highrate_seed ), tmp_exp );
107 4544 : move16(); /*Q_audio */
108 : }
109 : }
110 : }
111 : }
112 : ELSE
113 : {
114 605 : tmp_exp = sub( 15, Q_audio );
115 :
116 605 : Nsv = shr( sub( spect_end, spect_start ), 3 );
117 605 : alpha_fx = 8192;
118 605 : move16(); /*Q15 */
119 605 : IF( GT_16( tilt_wb_fx, 10240 /* 5 in Q11 */ ) )
120 : {
121 53 : beta_fx = 8192;
122 53 : move16(); /*Q15 */
123 : }
124 : ELSE
125 : {
126 552 : IF( GT_16( 6400 /* 400 in Q4 */, pitch_fx ) )
127 : {
128 249 : beta_fx = 8192;
129 249 : move16(); /*Q15 */
130 : }
131 : ELSE
132 : {
133 303 : beta_fx = div_s( 1600, pitch_fx ); /*Q15+4-4 ->Q15 */
134 : }
135 : }
136 :
137 605 : i = 0;
138 605 : move16();
139 605 : IF( nq[i] == 0 )
140 : {
141 4 : i = 1;
142 4 : move16();
143 4 : test();
144 8 : WHILE( LT_16( i, Nsv ) && nq[i] == 0 )
145 : {
146 4 : i++;
147 4 : move16();
148 4 : test();
149 : }
150 :
151 4 : pos_start = i;
152 4 : move16();
153 4 : test();
154 49 : WHILE( LT_16( i, Nsv ) && nq[i] != 0 )
155 : {
156 45 : i++;
157 45 : move16();
158 45 : test();
159 : }
160 :
161 4 : pos_end = sub( i, 1 );
162 4 : move16();
163 :
164 4 : IF( GT_16( pos_end, shl( pos_start, 1 ) ) )
165 : {
166 3 : pos_end = sub( shl( pos_start, 1 ), 1 );
167 3 : move16();
168 : }
169 :
170 4 : incr = pos_end;
171 4 : move16();
172 :
173 12 : FOR( j = sub( pos_start, 1 ); j >= 0; j-- )
174 : {
175 8 : tmp = shl( j, 3 );
176 8 : tmp1 = shl( incr, 3 );
177 72 : FOR( k = 0; k < WIDTH_BAND; k++ )
178 : {
179 64 : tmp2 = mult_r( alpha_fx, t_audio_fx[tmp1 + k] ); // Q_audio + Q15 - Q15 -> Q_audio
180 64 : tmp3 = mult_r( beta_fx, shr( Random( bwe_highrate_seed ), tmp_exp ) ); // Q_audio + Q15 - Q15 -> Q_audio
181 64 : t_audio_fx[tmp + k] = add( tmp2, tmp3 ); // Q_audio
182 64 : move16();
183 : }
184 :
185 : /*incr = sub(incr, pos_start) < 0 ? pos_end : sub(incr, 1); move16(); */
186 8 : IF( LT_16( incr, pos_start ) )
187 : {
188 0 : incr = pos_end;
189 0 : move16();
190 : }
191 : ELSE
192 : {
193 8 : incr = sub( incr, 1 );
194 : }
195 : }
196 : }
197 :
198 20820 : WHILE( LT_16( i, Nsv ) )
199 : {
200 20215 : IF( nq[i] == 0 )
201 : {
202 875 : pos_start = i;
203 875 : move16();
204 875 : pos_end = i;
205 875 : move16();
206 :
207 2052 : FOR( j = pos_start; j < Nsv; j++ )
208 : {
209 1926 : IF( nq[j] != 0 )
210 : {
211 749 : i = j;
212 749 : move16();
213 749 : pos_end = j;
214 749 : move16();
215 749 : BREAK;
216 : }
217 : }
218 :
219 875 : IF( EQ_16( pos_start, pos_end ) )
220 : {
221 126 : i = Nsv;
222 126 : move16();
223 126 : pos_end = Nsv;
224 126 : move16();
225 : }
226 :
227 875 : incr = sub( pos_start, 1 );
228 875 : move16();
229 :
230 :
231 2052 : FOR( j = sub( pos_end, 1 ); j >= pos_start; j-- )
232 : {
233 1177 : tmp = shl( j, 3 );
234 1177 : tmp1 = shl( incr, 3 );
235 10593 : FOR( k = 0; k < WIDTH_BAND; k++ )
236 : {
237 9416 : tmp2 = mult_r( alpha_fx, t_audio_fx[tmp1 + k] ); // // Q_audio + Q15 - Q15 -> Q_audio
238 9416 : tmp3 = mult_r( beta_fx, shr( Random( bwe_highrate_seed ), tmp_exp ) ); // // Q_audio + Q15 - Q15 -> Q_audio
239 9416 : t_audio_fx[tmp + k] = add( tmp2, tmp3 ); // Q_audio
240 9416 : move16();
241 : }
242 : /*incr = (incr == 0) ? sub(pos_start, 1) : sub(incr, 1); */
243 1177 : incr = sub( incr, 1 );
244 1177 : if ( incr < 0 )
245 : {
246 17 : incr = sub( pos_start, 1 );
247 : }
248 : }
249 : }
250 : ELSE
251 : {
252 19340 : i++;
253 : }
254 : }
255 : }
256 :
257 861 : swb_hr_nonzero_subband_noise_fill_fx( tilt_wb_fx, t_audio_fx, bwe_highrate_seed, WIDTH_BAND, Nsv, Q_audio );
258 :
259 861 : return;
260 : }
|