add flush() to decoder interface
[nihav.git] / nihav-commonfmt / src / codecs / sipro.rs
CommitLineData
38953fb5
KS
1use nihav_core::formats::*;
2use nihav_core::frame::*;
3use nihav_core::codecs::*;
4use nihav_core::io::bitreader::*;
f4bb5ccb
KS
5
6use std::f32::consts::PI;
7
8#[derive(Clone,Copy,PartialEq)]
c83013a1 9#[allow(clippy::enum_variant_names)]
f4bb5ccb
KS
10enum SiproMode {
11 Mode16k,
12 Mode8_5k,
13 Mode6_5k,
14 Mode5k,
15}
16
17impl SiproMode {
c83013a1 18 fn is16k(self) -> bool { self == SiproMode::Mode16k }
f4bb5ccb
KS
19}
20
21const SIPRO_MODE_FROM_IDX: [SiproMode; 4] = [
22 SiproMode::Mode16k, SiproMode::Mode8_5k, SiproMode::Mode6_5k, SiproMode::Mode5k
23];
24
25const EXCITATION_OFFSET: usize = 281 + 10 + 1;
26
27struct SiproDecoder {
28 chmap: NAChannelMap,
29 ainfo: NAAudioInfo,
2422d969 30 info: NACodecInfoRef,
f4bb5ccb
KS
31 mode: &'static SiproModeInfo,
32 mode_type: SiproMode,
33
34 pred_switch: bool,
35 vq_idx: [usize; 5],
36 pitch_delay: [usize; 5],
37 gp_index: [usize; 5],
38 fc_index: [[i16; 10]; 5],
39 gc_index: [usize; 5],
40 npulses: usize,
41 pulse_data: [i16; 20],
42
43 pitch_lag_prev: usize,
44 prev_pitch_gain: f32,
45 avg_energy: f32,
46 gain_mem: f32,
47
48 lsf_hist: [f32; 16],
49 lsp_hist: [f32; 16],
50 energy_hist: [f32; 4],
51 sf_filter: [[f32; 16]; 5],
52 excitation: [f32; 512+64],
53 synth: [f32; 256],
54 synth_hist: [f32; 16],
55 ir: [f32; 80],
56 fix_vec: [f32; 80],
57
58 postfilt_5k: [f32; 256],
59 postfilt_5k_mem1: [f32; 10],
60 postfilt_5k_mem2: [f32; 10],
61 postfilt_5k_tilt: f32,
62 postfilt_5k_gain: f32,
63
64 postfilt_16k_preemph: [f32; 16],
65 postfilt_16k_filt: [f32; 16],
66 postfilt_16k_filt_prev: [f32; 16],
67 postfilt_16k_buf: [f32; 256],
68
69 iir_state: [f32; 2],
70
71 pitch_int: usize,
72 prev_pitch: usize,
73}
74
75impl SiproDecoder {
76 fn new() -> Self {
77 SiproDecoder {
78 chmap: NAChannelMap::new(),
79 ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, 0),
80 info: NACodecInfo::new_dummy(),
81 mode: &SIPRO_MODES[0],
82 mode_type: SiproMode::Mode5k,
83
84 pred_switch: false,
85 vq_idx: [0; 5],
86 pitch_delay: [0; 5],
87 gp_index: [0; 5],
88 fc_index: [[0; 10]; 5],
89 gc_index: [0; 5],
90 npulses: 0,
91 pulse_data: [0; 20],
92
93 pitch_lag_prev: 0,
94 prev_pitch_gain: 0.0,
95 avg_energy: 0.0,
96 gain_mem: 0.0,
97 pitch_int: 0,
98 prev_pitch: 0,
99
100 lsf_hist: [0.0; 16],
101 lsp_hist: [0.0; 16],
102 energy_hist: [0.0; 4],
103 sf_filter: [[0.0; 16]; 5],
104 excitation: [0.0; 512+64],
105 synth: [0.0; 256],
106 synth_hist: [0.0; 16],
107 ir: [0.0; 80],
108 fix_vec: [0.0; 80],
109
110 postfilt_5k: [0.0; 256],
111 postfilt_5k_mem1: [0.0; 10],
112 postfilt_5k_mem2: [0.0; 10],
113 postfilt_5k_tilt: 0.0,
114 postfilt_5k_gain: 0.0,
115
116 postfilt_16k_preemph: [0.0; 16],
117 postfilt_16k_filt: [0.0; 16],
118 postfilt_16k_filt_prev: [0.0; 16],
119 postfilt_16k_buf: [0.0; 256],
120
121 iir_state: [0.0; 2],
122 }
123 }
124
125 fn unpack_frame(&mut self, br: &mut BitReader) -> DecoderResult<()> {
126 if self.mode.pred {
127 self.pred_switch = br.read_bool()?;
128 } else {
129 self.pred_switch = false;
130 }
131 for i in 0..5 {
132 self.vq_idx[i] = br.read(self.mode.vq_idx_bits[i])? as usize;
133 }
134 for sf in 0..self.mode.subframes {
135 self.pitch_delay[sf] = br.read(self.mode.pitch_delay_bits[sf])? as usize;
136 self.gp_index[sf] = br.read(self.mode.gp_idx_bits)? as usize;
137 for i in 0..self.mode.fc_indices {
138 self.fc_index[sf][i] = br.read(self.mode.fc_idx_bits[i])? as i16;
139 }
140 self.gc_index[sf] = br.read(self.mode.gc_idx_bits)? as usize;
141 }
142 Ok(())
143 }
144 fn decode_lsf_16k(&mut self) {
145 let mut filter: [f32; 16] = [0.0; 16];
146 let mut newfilt: [f32; 16] = [0.0; 16];
147 let mut lsp: [f32; 16] = [0.0; 16];
148
149 for cb in 0..4 {
150 for i in 0..3 {
151 filter[cb * 3 + i] = SIPRO_LSF_CODEBOOK_16K[cb][self.vq_idx[cb]][i];
152 }
153 }
154 for i in 0..4 {
155 filter[4 * 3 + i] = SIPRO_LSF_CB4_16K[self.vq_idx[4]][i];
156 }
157
158 if self.pred_switch {
159 for i in 0..newfilt.len() {
160 newfilt[i] = (filter[i] + self.lsf_hist[i]) * 0.5 + SIPRO_MEAN_LSF_16K[i];
161 }
162 } else {
163 for i in 0..newfilt.len() {
164 newfilt[i] = 0.88 * filter[i] + 0.12 * self.lsf_hist[i] + SIPRO_MEAN_LSF_16K[i];
165 }
166 }
167 for i in 0..filter.len() {
168 self.lsf_hist[i] = filter[i];
169 }
170
171 let mut prev: f32 = 0.0;
172 for i in 0..newfilt.len() {
173 newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST/2.0);
174 prev = newfilt[i];
175 filter[i] = newfilt[i].cos();
176 }
177
178 for i in 0..lsp.len() {
179 lsp[i] = (filter[i] + self.lsp_hist[i]) * 0.5;
180 }
181
182 lsp2lpc_16k(&mut self.sf_filter[0], &lsp);
183 lsp2lpc_16k(&mut self.sf_filter[1], &filter);
184 for i in 0..filter.len() {
185 self.lsp_hist[i] = filter[i];
186 }
187
188 for i in 0..16 {
189 self.synth[i] = self.synth_hist[i];
190 }
191 }
192 fn decode_lsf_lbr(&mut self) {
193 let mut filter: [f32; 10] = [0.0; 10];
194 let mut newfilt: [f32; 10] = [0.0; 10];
195
196 for cb in 0..5 {
197 for i in 0..2 {
198 filter[cb * 2 + i] = SIPRO_LSF_CODEBOOK_LBR[cb][self.vq_idx[cb]][i];
199 }
200 }
201 for i in 0..newfilt.len() {
202 newfilt[i] = filter[i] + 0.33 * self.lsf_hist[i] + SIPRO_MEAN_LSF_LBR[i];
203 }
204 for i in 0..8 { // maybe it's just bubble sort?
205 for j in (0..i+1).rev() {
206 if newfilt[j] <= newfilt[j + 1] { break; }
207 let tmp = newfilt[j];
208 newfilt[j] = newfilt[j + 1];
209 newfilt[j + 1] = tmp;
210 }
211 }
212
213 let mut prev: f32 = 0.0;
214 for i in 0..9 {
215 newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST);
216 prev = newfilt[i];
217 }
218 newfilt[9] = newfilt[9].min(prev + SIPRO_LSF_MIN_DIST_LAST);
219 for i in 0..filter.len() {
220 self.lsf_hist[i] = filter[i];
221 }
222
223 for i in 0..9 {
224 newfilt[i] = newfilt[i].cos();
225 }
226 newfilt[9] *= 6.153848 / PI;
227
228 let mut interp: f32 = 0.5 / (self.mode.subframes as f32);
229 for sf in 0..self.mode.subframes {
230 for i in 0..newfilt.len() {
231 filter[i] = newfilt[i] * interp + self.lsp_hist[i] * (1.0 - interp);
232 }
233 lsp2lpc_lbr(&mut self.sf_filter[sf], &filter);
234 interp += 1.0 / (self.mode.subframes as f32);
235 }
236 for i in 0..newfilt.len() {
237 self.lsp_hist[i] = newfilt[i];
238 }
239
240 for i in 0..10 {
241 self.synth[i] = self.synth_hist[i];
242 }
243 }
244 fn calc_pitch_16k(&mut self, sf: usize) {
245 let idx = self.pitch_delay[sf];
246 let pitch_idx = if sf == 0 {
247 if idx < 390 {
248 idx + 88
249 } else {
250 idx * 3 - 690
251 }
252 } else {
253 if idx < 62 {
254 (self.prev_pitch - 10).max(30).min(281 - 19) * 3 + idx - 2
255 } else {
256 self.prev_pitch * 3
257 }
258 };
259 self.pitch_int = ((pitch_idx + 2) * 10923) >> 15;
260 self.prev_pitch = ((pitch_idx + 1) * 10923) >> 15;
261 let pitch_frac = pitch_idx + 2 - 3 * self.pitch_int;
262
263 for i in 0..80 {
264 let mut sum: f32 = 0.0;
265 let estart = EXCITATION_OFFSET + sf * 80 - self.pitch_int + i + 1;
266 for j in 0..10 {
267 sum += self.excitation[estart + j] * SIPRO_SINC_16K[j * 3 + pitch_frac + 1];
268 sum += self.excitation[estart - j - 1] * SIPRO_SINC_16K[j * 3 + 3 - pitch_frac - 1];
269 }
270 self.excitation[EXCITATION_OFFSET + sf * 80 + i] = sum;
271 }
272 }
273 fn calc_pitch_lbr(&mut self, sf: usize) {
274 let new_sf = (sf == 0) || (self.mode_type == SiproMode::Mode5k && sf == 2);
275 let idx = self.pitch_delay[sf];
276 let pitch_idx = if new_sf {
277 if idx < 197 {
278 idx + 59
279 } else {
280 idx * 3 - 335
281 }
282 } else {
283 idx + (self.prev_pitch - 5).max(20).min(134) * 3 - 1
284 };
285 self.pitch_int = (pitch_idx * 10923) >> 15;
286 let pitch_frac = (pitch_idx as i32) - (self.pitch_int as i32) * 3 - 1;
287 if new_sf {
288 self.prev_pitch = self.pitch_int;
289 }
290 let ffrac = 2 * ((pitch_frac + 2) % 3) + 2;
291 let off = EXCITATION_OFFSET + sf * 48 + (if pitch_frac <= 0 { 1 } else { 0 });
292 for i in 0..48 {
293 let mut sum: f32 = 0.0;
294 let estart = off + i - self.pitch_int;
295 for j in 0..10 {
296 let idx0 = ((j * 6) as i32) + ffrac;
297 let idx1 = ((j * 6) as i32) + 6 - ffrac;
298 sum += self.excitation[estart + j] * SIPRO_SINC_LBR[idx0 as usize];
299 sum += self.excitation[estart - j - 1] * SIPRO_SINC_LBR[idx1 as usize];
300 }
1a151e53 301 self.excitation[EXCITATION_OFFSET + sf * 48 + i] = sum;
f4bb5ccb
KS
302 }
303 }
304 fn unpack_pulses_16k(&mut self, sf: usize) {
305 self.npulses = 10;
306 for i in 0..5 {
307 let off1 = (self.fc_index[sf][i * 2 + 0] & 0xF) * 5 + (i as i16);
308 let off2 = (self.fc_index[sf][i * 2 + 1] & 0xF) * 5 + (i as i16);
309 let sign = if (self.fc_index[sf][i * 2 + 1] & 0x10) != 0 { -1 } else { 1 };
310 self.pulse_data[i * 4 + 0] = off1;
311 self.pulse_data[i * 4 + 1] = if off1 < off2 { -sign } else { sign };
312 self.pulse_data[i * 4 + 2] = off2;
313 self.pulse_data[i * 4 + 3] = sign;
314 }
315 self.fix_vec = [0.0; 80];
316 let pitch_frac = SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]].min(1.0);
317 for i in 0..10 {
318 let mut scale = self.pulse_data[i * 2 + 1] as f32;
319 let off = self.pulse_data[i * 2 + 0] as usize;
320 for j in (off..80).step_by(self.prev_pitch) {
321 self.fix_vec[j] += scale;
322 scale *= pitch_frac;
323 }
324 }
325 }
326 fn unpack_pulses_8_5k(&mut self, sf: usize) {
327 self.npulses = 6;
328 for i in 0..3 {
329 self.pulse_data[i * 4 + 0] = 3 * ((self.fc_index[sf][i] >> 4) & 0xF) + (i as i16);
330 self.pulse_data[i * 4 + 2] = 3 * ((self.fc_index[sf][i] >> 0) & 0xF) + (i as i16);
331 self.pulse_data[i * 4 + 1] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
332 self.pulse_data[i * 4 + 3] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
333 if self.pulse_data[i * 4 + 2] < self.pulse_data[i * 4 + 0] {
334 self.pulse_data[i * 4 + 3] = -self.pulse_data[i * 4 + 3];
335 }
336 }
337 self.unpack_pulses_common();
338 }
339 fn unpack_pulses_6_5k(&mut self, sf: usize) {
340 self.npulses = 3;
341 for i in 0..3 {
342 self.pulse_data[i * 2 + 0] = 3 * (self.fc_index[sf][i] & 0xF) + (i as i16);
343 self.pulse_data[i * 2 + 1] = if (self.fc_index[sf][i] & 0x10) != 0 { -1 } else { 1 };
344 }
345 self.unpack_pulses_common();
346 }
347 fn unpack_pulses_5k(&mut self, sf: usize) {
348 if self.prev_pitch_gain < 0.8 {
349 self.npulses = 3;
350 let mut cw = self.fc_index[sf][0];
351 let off = if (cw & 0x200) != 0 { 2 } else { 0 };
352 for i in 0..3 {
353 self.pulse_data[i * 2 + 0] = (cw & 7) * 6 + 4 - (i as i16) * 2;
354 self.pulse_data[i * 2 + 1] = if ((self.pulse_data[i * 2 + 0] + off) & 3) != 0 { -1 } else { 1 };
355 cw >>= 3;
356 }
357 } else {
358 self.npulses = 2;
359 let off = (self.fc_index[sf][0] >> 8) & 1;
360 self.pulse_data[0] = 3 * ((self.fc_index[sf][0] >> 4) & 0xF) + off;
361 self.pulse_data[1] = if (self.fc_index[sf][0] & 0x200) != 0 { -1 } else { 1 };
362 self.pulse_data[2] = 3 * ((self.fc_index[sf][0] >> 0) & 0xF) + off + 1;
363 self.pulse_data[3] = -self.pulse_data[1];
364 }
365 self.unpack_pulses_common();
366 }
367 fn unpack_pulses_common(&mut self) {
368 for i in 0..48 {
369 self.fix_vec[i] = 0.0;
370 }
371 for i in 0..self.npulses {
372 let off = self.pulse_data[i * 2] as usize;
373 let scale = self.pulse_data[i * 2 + 1] as f32;
374 for j in off..48 {
375 self.fix_vec[j] += scale * self.ir[10 + j - off];
376 }
377 }
378 }
379 fn eval_ir(&mut self, sf: usize) {
380 let mut tmp: [f32; 48 + 1] = [0.0; 48 + 1];
381 let mut filt: [f32; 16] = [0.0; 16];
382 tmp[0] = 1.0;
383 for i in 0..10 {
384 tmp[i + 1] = self.sf_filter[sf][i] * SIPRO_POW_0_55[i];
385 filt[i] = self.sf_filter[sf][i] * SIPRO_POW_0_7[i];
386 }
387 synth_filter(&mut self.ir, 10, &filt, &tmp, 48, 10);
388 for i in self.pitch_int..48 {
389 self.ir[10 + i] += self.mode.pitch_sharp_factor * self.ir[10 + i - self.pitch_int];
390 }
391 }
392 fn update_gain_16k(&mut self, sf: usize) {
393 let mut energy: f64 = 0.0;
394 for i in 0..80 {
c83013a1 395 energy += f64::from(self.fix_vec[i]) * f64::from(self.fix_vec[i]);
f4bb5ccb 396 }
c83013a1 397 let ehist = f64::from(0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) - 71.30899869919435856603;
f4bb5ccb
KS
398 let rms = 8.94427190999915878559 * (10.0f64.ln() / 20.0 * ehist).exp() / (0.01 + energy).sqrt();
399 let gain = SIPRO_GAIN_CB_16K[self.gc_index[sf]] * (rms as f32);
400
401 self.energy_hist[1] = self.energy_hist[0];
402 self.energy_hist[0] = SIPRO_GAIN_DB_CB_16K[self.gc_index[sf]];
403
404 let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 80..][..80];
405 for i in 0..80 {
406 exc[i] = exc[i] * SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]] + self.fix_vec[i] * gain;
407 }
408 }
409 fn update_gain_lbr(&mut self, sf: usize) {
410 let gain0 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][0];
411 let gain1 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][1];
412 self.prev_pitch_gain = gain0;
1a151e53 413
f4bb5ccb
KS
414 self.avg_energy = 0.01;
415 for el in self.fix_vec.iter().take(48) {
416 self.avg_energy += *el * *el;
417 }
418 self.avg_energy /= 48.0;
419
420 let mut sum: f32 = -56.30899869919435856603;
421 for i in 0..4 {
422 sum += self.energy_hist[i] * SIPRO_GAIN_PRED[i];
423 }
424 for i in 0..3 {
425 self.energy_hist[i] = self.energy_hist[i + 1];
426 }
427 self.energy_hist[3] = 20.0 * gain1.log10();
428
c83013a1 429 let gain = (f64::from(gain1) * (f64::from(sum) * (10.0f64).ln() * 0.05).exp() / f64::from(self.avg_energy).sqrt()) as f32;
f4bb5ccb
KS
430 let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 48..][..48];
431 for i in 0..48 {
432 exc[i] = exc[i] * gain0 + self.fix_vec[i] * gain;
433 }
434
435 let pitch_gain = (0.5 * gain0 * gain0).min(0.4);
436 self.gain_mem = (0.7 * self.gain_mem + 0.3 * pitch_gain).min(pitch_gain);
437
438 let gain = gain * self.gain_mem;
439
440 for i in 0..48 {
441 self.fix_vec[i] = exc[i] - gain * self.fix_vec[i];
442 }
443 }
444 fn synth_subframe_16k(&mut self, sf: usize) {
445 synth_filter(&mut self.synth, 16 + sf * 80, &self.sf_filter[sf], &self.excitation[EXCITATION_OFFSET + sf * 80..], 80, 16);
446 }
447 fn synth_subframe_lbr(&mut self, sf: usize) {
448 if self.mode_type == SiproMode::Mode5k {
449 self.postfilter_5k_sf(sf);
450 }
451 synth_filter(&mut self.synth, 10 + sf * 48, &self.sf_filter[sf], &self.fix_vec, 48, 10);
452 }
453 fn postfilter_16k(&mut self) {
454 let mut filt: [f32; 16] = [0.0; 16];
455
456 for i in 0..filt.len() {
457 filt[i] = self.postfilt_16k_filt_prev[i] * SIPRO_POW_0_5[i];
458 }
459
460 let mut tmp: [f32; 64] = [0.0; 64];
461 for i in 0..16 {
462 tmp[i] = self.postfilt_16k_preemph[i];
463 }
464 synth_filter(&mut tmp, 16, &self.postfilt_16k_filt, &self.synth[16..], 30, 16);
465 for i in 0..16 {
466 self.synth[i] = self.postfilt_16k_preemph[i];
467 }
468 let mut tsrc: [f32; 30] = [0.0; 30];
469 tsrc.copy_from_slice(&self.synth[16..][..30]);
470 synth_filter(&mut self.synth, 16, &filt, &tsrc, 30, 16);
471 for i in 0..16 {
472 self.postfilt_16k_buf[30 - 16 + i] = self.synth[30 + i];
473 }
474 synth_filter(&mut self.postfilt_16k_buf, 30, &filt, &self.synth[30 + 16..], 2 * 80 - 30, 16);
475 self.postfilt_16k_filt = filt;
476 for i in 0..16 {
477 self.postfilt_16k_preemph[i] = self.postfilt_16k_buf[2 * 80 - 16 + i];
478 self.postfilt_16k_filt_prev[i] = self.sf_filter[1][i];
479 }
480
481 for i in 0..30 {
482 self.postfilt_16k_buf[i] = tmp[i + 16] + (i as f32) * (self.synth[i + 16] - tmp[i + 16]) / 30.0;
483 }
484 }
485 fn postfilter_5k_sf(&mut self, sf: usize) {
486 let mut d: [f32; 10] = [0.0; 10];
487 let mut n: [f32; 10] = [0.0; 10];
488
489 for i in 0..10 {
490 d[i] = self.sf_filter[sf][i] * SIPRO_POW_0_75[i];
491 n[i] = self.sf_filter[sf][i] * SIPRO_POW_0_5[i];
492 }
493
494 let mut tmp: [f32; 48 + 10] = [0.0; 48 + 10];
495 for i in 0..10 {
496 tmp[i] = self.postfilt_5k_mem1[i];
497 }
498 synth_filter(&mut tmp, 10, &d, &self.fix_vec, 48, 10);
499 for i in 0..10 {
500 self.postfilt_5k_mem1[i] = tmp[i + 48];
501 }
502
503 let tilt = tmp[48 + 10 - 1];
504 for i in (10+1..48+10).rev() {
505 tmp[i] -= 0.4 * tmp[i - 1];
506 }
507 tmp[10] -= 0.4 * self.postfilt_5k_tilt;
508 self.postfilt_5k_tilt = tilt;
509
510 for i in 0..10 {
511 tmp[i] = self.postfilt_5k_mem2[i];
512 }
513 for i in 0..10 {
514 self.postfilt_5k_mem2[i] = tmp[i + 48];
515 }
516
517 for i in 0..48 { // almost but not exactly like synth_filter(fix_vec, 0, -n, tmp, 48, 10)
518 self.fix_vec[i] = tmp[i + 10];
519 for j in 0..10 {
520 self.fix_vec[i] += n[j] * tmp[i + 10 - j - 1];
521 }
522 }
523
524 synth_filter(&mut self.postfilt_5k, 10 + sf * 48, &self.sf_filter[sf],
525 &self.excitation[EXCITATION_OFFSET + sf * 48..], 48, 10);
526 }
527 fn postfilter_5k(&mut self) {
528 for sf in 0..self.mode.subframes {
529 let src = &self.postfilt_5k[10 + sf * 48..][..48];
530 let mut fenergy: f32 = 0.0;
531 for el in src.iter() {
532 fenergy += *el * *el;
533 }
534 let mut senergy: f32 = 0.0;
535 {
536 let src = &self.synth[10 + sf * 48..][..48];
537 for el in src.iter() {
538 senergy += *el * *el;
539 }
540 }
541
542 let gain = if senergy != 0.0 { 0.1 * (fenergy / senergy).sqrt() } else { 0.1 };
543
544 let dst = &mut self.synth[10 + sf * 48..][..48];
545 for el in dst.iter_mut() {
546 self.postfilt_5k_gain *= 0.9;
547 self.postfilt_5k_gain += gain;
548 *el *= self.postfilt_5k_gain;
549 }
550 }
551 for i in 0..10 {
552 self.postfilt_5k[i] = self.postfilt_5k[i + self.mode.subframes * 48];
553 }
554 }
555 fn output_16k(&mut self, dst: &mut [f32]) {
556 for i in 0..16 {
557 self.synth_hist[i] = self.synth[80 * 2 + i];
558 }
559 for i in 0..EXCITATION_OFFSET {
560 self.excitation[i] = self.excitation[80 * 2 + i];
561 }
562 self.postfilter_16k();
563 for i in 0..80 * 2 {
564 dst[i] = self.postfilt_16k_buf[i];
565 }
566 }
567 fn output_lbr(&mut self, dst: &mut [f32]) {
568 let out_size = self.mode.subframe_len * self.mode.subframes;
569 for i in 0..10 {
570 self.synth_hist[i] = self.synth[i + out_size];
571 }
572 if self.mode_type == SiproMode::Mode5k {
573 self.postfilter_5k();
574 }
575 for i in 0..EXCITATION_OFFSET {
576 self.excitation[i] = self.excitation[i + out_size];
577 }
578 for i in 0..out_size {
579 let x = 0.939805806 * self.synth[i + 10] + 1.93307352 * self.iir_state[0] - 0.935891986 * self.iir_state[1];
580 let y = x - 1.99997 * self.iir_state[0] + self.iir_state[1];
581 self.iir_state[1] = self.iir_state[0];
582 self.iir_state[0] = x;
583 dst[i] = y;
584 }
585 }
586}
587
588fn lsp2poly(lsp: &[f32], poly: &mut [f64], order: usize) {
589 poly[0] = 1.0;
c83013a1 590 poly[1] = -2.0 * f64::from(lsp[0]);
f4bb5ccb 591 for i in 1..order {
c83013a1 592 poly[i + 1] = -2.0 * f64::from(lsp[2 * i]) * poly[i] + 2.0 * poly[i - 1];
f4bb5ccb 593 for j in (2..i+1).rev() {
c83013a1 594 poly[j] += -2.0 * f64::from(lsp[2 * i]) * poly[j - 1] + poly[j - 2];
f4bb5ccb 595 }
c83013a1 596 poly[1] += -2.0 * f64::from(lsp[2 * i]);
f4bb5ccb
KS
597 }
598}
599
600fn lsp2lpc_16k(lpc: &mut [f32], lsp: &[f32]) {
601 let mut a: [f64; 10] = [0.0; 10];
602 let mut b: [f64; 10] = [0.0; 10];
603 lsp2poly(&lsp[0..], &mut a, 8);
604 lsp2poly(&lsp[1..], &mut b, 8);
605 for i in 0..8 {
606 let ta = a[8 - i] + a[7 - i];
607 let tb = b[8 - i] - b[7 - i];
608 lpc[7 - i] = ((ta + tb) * 0.5) as f32;
609 lpc[8 + i] = ((ta - tb) * 0.5) as f32;
610 }
611}
612fn lsp2lpc_lbr(lpc: &mut [f32], lsp: &[f32]) {
613 let mut a: [f64; 6] = [0.0; 6];
614 let mut b: [f64; 6] = [0.0; 6];
615 lsp2poly(&lsp[0..], &mut a[0..], 5);
616 lsp2poly(&lsp[1..], &mut b[1..], 4);
617
c83013a1
KS
618 let ascale = f64::from(1.0 + lsp[9]);
619 let bscale = f64::from(1.0 - lsp[9]);
f4bb5ccb
KS
620 for i in 1..5 {
621 let ta = ascale * a[i];
622 let tb = bscale * (b[i + 1] - b[i - 1]);
623 lpc[i - 1] = ((ta + tb) * 0.5) as f32;
624 lpc[9 - i] = ((ta - tb) * 0.5) as f32;
625 }
626 lpc[4] = (ascale * a[5] * 0.5) as f32;
627 lpc[9] = lsp[9];
628}
629
630fn synth_filter(dst: &mut [f32], doff: usize, filt: &[f32], src: &[f32], len: usize, order: usize) {
631 for i in 0..len {
632 dst[doff + i] = src[i];
633 for j in 0..order {
634 dst[doff + i] -= filt[j] * dst[doff + i - j - 1];
635 }
636 }
637}
638
639const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
640
641impl NADecoder for SiproDecoder {
01613464 642 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
f4bb5ccb
KS
643 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
644 let mut found = false;
645 for i in 0..SIPRO_MODES.len() {
646 if SIPRO_MODES[i].block_align == ainfo.get_block_len() {
647 self.mode = &SIPRO_MODES[i];
648 self.mode_type = SIPRO_MODE_FROM_IDX[i];
649 found = true;
650 break;
651 }
652 }
653 validate!(found);
654
655 let order = if self.mode_type.is16k() { 16 } else { 10 };
656 for i in 0..order {
657 self.lsp_hist[i] = (((i + 1) as f32) * PI / ((order + 1) as f32)).cos();
658 }
659 self.energy_hist = [-14.0; 4];
660 self.pitch_lag_prev = 180;
661
662 self.chmap.add_channels(&CHMAP_MONO);
663 self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
664 1,
665 SND_F32P_FORMAT, 0);
c83013a1 666 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
f4bb5ccb
KS
667 Ok(())
668 } else {
669 Err(DecoderError::InvalidData)
670 }
671 }
01613464 672 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
f4bb5ccb
KS
673 let info = pkt.get_stream().get_info();
674 validate!(info.get_properties().is_audio());
675 let pktbuf = pkt.get_buffer();
676 let frm_size = self.mode.block_align;
677 let out_frm_size = self.mode.frames * self.mode.subframes * self.mode.subframe_len;
678 let nframes = pktbuf.len() / frm_size;
679
680 let duration = out_frm_size * nframes;
681
b70cc006 682 let abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
f4bb5ccb 683 let mut adata = abuf.get_abuf_f32().unwrap();
1a967e6b 684 let dst = adata.get_data_mut().unwrap();
f4bb5ccb
KS
685
686 let frame_len = self.mode.subframe_len * self.mode.subframes;
687 for (input, output) in pktbuf.chunks(frm_size).zip(dst.chunks_mut(out_frm_size)) {
688 let mut br = BitReader::new(input, input.len(), BitReaderMode::LE);
689 for dst in output.chunks_mut(frame_len) {
690 self.unpack_frame(&mut br)?;
691 if self.mode_type.is16k() {
692 self.decode_lsf_16k();
693 } else {
694 self.decode_lsf_lbr();
695 }
696 for i in 0..64 {
697 self.ir[i] = 0.0;
698 }
699 for sf in 0..self.mode.subframes {
700 if self.mode_type.is16k() {
701 self.calc_pitch_16k(sf);
702 } else {
703 self.calc_pitch_lbr(sf);
704 self.eval_ir(sf);
705 }
706 match self.mode_type {
707 SiproMode::Mode16k => { self.unpack_pulses_16k(sf); },
708 SiproMode::Mode8_5k => { self.unpack_pulses_8_5k(sf); },
709 SiproMode::Mode6_5k => { self.unpack_pulses_6_5k(sf); },
710 SiproMode::Mode5k => { self.unpack_pulses_5k(sf); },
711 }
712 if self.mode_type.is16k() {
713 self.update_gain_16k(sf);
714 } else {
715 self.update_gain_lbr(sf);
716 }
717 if self.mode_type.is16k() {
718 self.synth_subframe_16k(sf);
719 } else {
720 self.synth_subframe_lbr(sf);
721 }
722 }
723 if self.mode_type.is16k() {
724 self.output_16k(dst);
725 } else {
726 self.output_lbr(dst);
727 }
728 }
729 }
730
731 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
732 frm.set_keyframe(true);
171860fc 733 Ok(frm.into_ref())
f4bb5ccb 734 }
f9be4e75
KS
735 fn flush(&mut self) {
736 }
f4bb5ccb
KS
737}
738
6011e201 739pub fn get_decoder() -> Box<dyn NADecoder> {
f4bb5ccb
KS
740 Box::new(SiproDecoder::new())
741}
742
743#[cfg(test)]
744mod test {
4f6124ac
KS
745 use nihav_core::codecs::RegisteredDecoders;
746 use nihav_core::demuxers::RegisteredDemuxers;
747 use nihav_core::test::dec_video::test_decode_audio;
748 use crate::codecs::generic_register_all_codecs;
749 use nihav_realmedia::demuxers::realmedia_register_all_demuxers;
f4bb5ccb
KS
750 #[test]
751 fn test_sipro() {
4f6124ac
KS
752 let mut dmx_reg = RegisteredDemuxers::new();
753 realmedia_register_all_demuxers(&mut dmx_reg);
754 let mut dec_reg = RegisteredDecoders::new();
755 generic_register_all_codecs(&mut dec_reg);
756
f4bb5ccb 757 let file = "assets/RV/autahi-vox.rm";
4f6124ac 758 test_decode_audio("realmedia", file, Some(5000), "sipro", &dmx_reg, &dec_reg);
f4bb5ccb
KS
759 }
760}
761
762struct SiproModeInfo {
763 block_align: usize,
764 frames: usize,
765 subframes: usize,
766 subframe_len: usize,
767
768 pred: bool,
769 vq_idx_bits: [u8; 5],
770 pitch_delay_bits: [u8; 5],
771 gp_idx_bits: u8,
772 fc_indices: usize,
773 fc_idx_bits: [u8; 10],
774 gc_idx_bits: u8,
775
776 pitch_sharp_factor: f32,
777}
778
779static SIPRO_MODES: [SiproModeInfo; 4] = [
780 SiproModeInfo {
781 block_align: 160/8, frames: 1, subframes: 2, subframe_len: 80,
782 pred: true, vq_idx_bits: [ 7, 8, 7, 7, 7 ],
783 pitch_delay_bits: [ 9, 6, 0, 0, 0 ], gp_idx_bits: 4,
784 fc_indices: 10, fc_idx_bits: [ 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 ],
785 gc_idx_bits: 5, pitch_sharp_factor: 0.0
786 },
787 SiproModeInfo {
788 block_align: 152/8, frames: 1, subframes: 3, subframe_len: 48,
789 pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
790 pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
791 fc_indices: 3, fc_idx_bits: [ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0 ],
792 gc_idx_bits: 7, pitch_sharp_factor: 0.8
793 },
794 SiproModeInfo {
795 block_align: 232/8, frames: 2, subframes: 3, subframe_len: 48,
796 pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
797 pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
798 fc_indices: 3, fc_idx_bits: [ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0 ],
799 gc_idx_bits: 7, pitch_sharp_factor: 0.8
800 },
801 SiproModeInfo {
802 block_align: 296/8, frames: 2, subframes: 5, subframe_len: 48,
803 pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
804 pitch_delay_bits: [ 8, 5, 8, 5, 5 ], gp_idx_bits: 0,
805 fc_indices: 1, fc_idx_bits: [ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
806 gc_idx_bits: 7, pitch_sharp_factor: 0.85
807 },
808];
809
810const SIPRO_LSF_MIN_DIST: f32 = 0.0125 * PI;
811const SIPRO_LSF_MIN_DIST_LAST: f32 = 1.3 * PI;
812
813const SIPRO_LSF_CODEBOOK_LBR: [&[[f32; 2]]; 5] = [
814 SIPRO_LSF_CB0_LBR, SIPRO_LSF_CB1_LBR, SIPRO_LSF_CB2_LBR, SIPRO_LSF_CB3_LBR, SIPRO_LSF_CB4_LBR
815];
816
817const SIPRO_LSF_CB0_LBR: &[[f32; 2]] = &[
818 [ 0.007587, -0.005843 ], [ 0.042163, -0.028048 ], [ -0.017147, -0.060705 ],
819 [ 0.013773, -0.038108 ], [ -0.041563, -0.078571 ], [ -0.076928, -0.119343 ],
820 [ 0.012654, 0.176005 ], [ 0.059737, 0.156869 ], [ 0.171767, 0.231837 ],
821 [ 0.114030, 0.242047 ], [ 0.168977, 0.283101 ], [ 0.146210, 0.397961 ],
822 [ 0.249446, 0.268421 ], [ 0.137074, 0.186724 ], [ -0.057736, -0.135638 ],
823 [ -0.109664, -0.124611 ], [ -0.021234, -0.031174 ], [ -0.013990, -0.091819 ],
824 [ -0.040046, -0.111426 ], [ -0.016830, 0.055361 ], [ 0.057815, 0.071606 ],
825 [ 0.060670, 0.114436 ], [ 0.106695, 0.140838 ], [ 0.093601, 0.092793 ],
826 [ 0.039593, 0.006142 ], [ -0.066589, -0.092463 ], [ -0.102589, -0.171380 ],
827 [ -0.059621, -0.050671 ], [ 0.166131, 0.139773 ], [ 0.213069, 0.190761 ],
828 [ 0.061820, 0.037661 ], [ 0.136471, 0.090823 ], [ -0.019789, 0.013515 ],
829 [ 0.022280, 0.079473 ], [ 0.215281, 0.461959 ], [ 0.206497, 0.340077 ],
830 [ 0.012249, -0.065596 ], [ 0.091345, 0.190871 ], [ 0.019506, 0.037266 ],
831 [ -0.050702, -0.013223 ], [ -0.057334, 0.028943 ], [ 0.291512, 0.371415 ],
832 [ -0.053467, 0.084160 ], [ 0.025372, 0.375310 ], [ 0.269995, 0.566520 ],
833 [ -0.095259, -0.012353 ], [ 0.050479, 0.212893 ], [ 0.101219, 0.049320 ],
834 [ 0.072426, 0.283362 ], [ -0.084116, -0.150542 ], [ -0.031485, 0.144922 ],
835 [ 0.012714, 0.256910 ], [ -0.009528, 0.102768 ], [ -0.039572, 0.204967 ],
836 [ -0.098800, 0.055038 ], [ 0.020719, 0.128387 ], [ -0.045559, -0.178373 ],
837 [ -0.082338, 0.136933 ], [ -0.058270, 0.292806 ], [ 0.084242, 0.505112 ],
838 [ 0.121825, 0.326386 ], [ -0.102658, -0.069341 ], [ 0.071675, 0.004744 ],
839 [ -0.117763, -0.202608 ]
840];
841
842const SIPRO_LSF_CB1_LBR: &[[f32; 2]] = &[
843 [ 0.025412, 0.006095 ], [ -0.069803, 0.010650 ], [ -0.175957, -0.185800 ],
844 [ -0.139298, -0.048013 ], [ -0.156150, -0.129688 ], [ -0.160523, 0.068022 ],
845 [ 0.199683, 0.259982 ], [ 0.258038, 0.236147 ], [ 0.367089, 0.304716 ],
846 [ 0.251764, 0.305853 ], [ 0.394314, 0.382153 ], [ 0.448579, 0.337438 ],
847 [ 0.323286, 0.425563 ], [ 0.015369, 0.123820 ], [ -0.026770, 0.083881 ],
848 [ -0.112161, -0.097993 ], [ -0.221847, -0.161311 ], [ -0.050014, -0.092862 ],
849 [ -0.214960, -0.398498 ], [ -0.114062, -0.241381 ], [ 0.137950, 0.138852 ],
850 [ 0.031529, 0.065719 ], [ 0.208734, 0.084760 ], [ 0.157862, 0.057535 ],
851 [ 0.124750, 0.011922 ], [ -0.035227, -0.154397 ], [ -0.105523, -0.291427 ],
852 [ -0.073488, -0.201948 ], [ -0.224184, -0.273290 ], [ -0.168019, -0.240297 ],
853 [ -0.271591, -0.384682 ], [ -0.124784, 0.014253 ], [ 0.004210, -0.110418 ],
854 [ 0.074270, -0.014272 ], [ 0.053058, -0.068672 ], [ -0.090098, -0.145019 ],
855 [ 0.303214, 0.210323 ], [ 0.413443, 0.272002 ], [ 0.356904, 0.230646 ],
856 [ -0.035186, -0.028579 ], [ -0.117558, 0.115105 ], [ -0.159225, 0.218385 ],
857 [ -0.230178, 0.172901 ], [ -0.216148, -0.110195 ], [ 0.309444, 0.101508 ],
858 [ 0.250489, 0.118338 ], [ 0.293324, 0.151205 ], [ -0.023634, 0.033084 ],
859 [ 0.076708, 0.114024 ], [ 0.123119, 0.087704 ], [ -0.060265, 0.126543 ],
860 [ -0.223766, -0.021903 ], [ -0.241987, -0.328089 ], [ 0.205598, 0.147925 ],
861 [ -0.087010, 0.064601 ], [ -0.287892, -0.286099 ], [ -0.179451, -0.350781 ],
862 [ -0.219572, 0.043816 ], [ -0.217263, 0.245550 ], [ -0.286743, -0.180981 ],
863 [ 0.172659, 0.112620 ], [ -0.105422, 0.176856 ], [ 0.006176, -0.051491 ],
864 [ 0.099802, 0.176322 ], [ -0.186620, -0.068980 ], [ 0.164689, 0.185018 ],
865 [ 0.519877, 0.376111 ], [ 0.521941, 0.533731 ], [ 0.473375, 0.439534 ],
866 [ 0.214235, 0.202476 ], [ 0.579215, 0.466969 ], [ 0.310414, 0.271057 ],
867 [ 0.257450, 0.058939 ], [ 0.023936, -0.169464 ], [ -0.268817, -0.064531 ],
868 [ -0.174182, -0.000198 ], [ -0.268405, -0.234529 ], [ -0.296522, 0.247140 ],
869 [ 0.115950, -0.072194 ], [ -0.303666, 0.149084 ], [ -0.347762, -0.011002 ],
870 [ -0.223829, -0.214137 ], [ -0.278958, -0.457975 ], [ 0.135500, 0.238466 ],
871 [ 0.312730, 0.342760 ], [ 0.071754, -0.125912 ], [ 0.485938, 0.260429 ],
872 [ 0.037536, 0.179771 ], [ 0.391493, 0.156938 ], [ 0.397320, 0.484446 ],
873 [ -0.308630, -0.342418 ], [ -0.269599, -0.128453 ], [ -0.086683, -0.043863 ],
874 [ 0.421115, 0.213521 ], [ 0.082417, 0.049006 ], [ -0.087873, 0.238126 ],
875 [ 0.338899, 0.166131 ], [ -0.166988, 0.147105 ], [ -0.167214, -0.294075 ],
876 [ 0.588706, 0.328303 ], [ 0.207270, 0.017671 ], [ -0.141658, 0.291147 ],
877 [ -0.140850, 0.374321 ], [ 0.028180, 0.322510 ], [ -0.229858, 0.328036 ],
878 [ -0.060743, -0.260916 ], [ -0.011131, 0.246442 ], [ -0.058151, 0.310760 ],
879 [ -0.127536, -0.186432 ], [ -0.128523, -0.334884 ], [ -0.283899, 0.077729 ],
880 [ -0.031595, 0.181015 ], [ -0.329330, -0.108630 ], [ -0.215739, 0.107458 ],
881 [ 0.175734, 0.327134 ], [ 0.255801, 0.176077 ], [ 0.228265, 0.396859 ],
882 [ -0.370909, -0.185081 ], [ -0.355138, -0.300405 ], [ 0.061669, 0.242616 ],
883 [ 0.104489, 0.307995 ], [ -0.320021, -0.234002 ], [ 0.077349, 0.416286 ],
884 [ -0.339471, -0.407609 ], [ -0.019384, -0.215111 ], [ 0.168229, -0.032453 ],
885 [ -0.040140, 0.399658 ], [ -0.275141, 0.008218 ]
886];
887
888const SIPRO_LSF_CB2_LBR: &[[f32; 2]] = &[
889 [ 0.024608, 0.006198 ], [ -0.216616, -0.398169 ], [ -0.089601, -0.201370 ],
890 [ -0.121878, -0.305281 ], [ 0.037913, 0.059320 ], [ 0.245126, 0.244089 ],
891 [ 0.266853, 0.182476 ], [ 0.319362, 0.203481 ], [ 0.349945, 0.252644 ],
892 [ 0.393849, 0.279272 ], [ 0.445707, 0.258063 ], [ 0.387321, 0.200855 ],
893 [ -0.038818, 0.129603 ], [ -0.009510, 0.076441 ], [ -0.023892, -0.028199 ],
894 [ -0.117134, -0.145990 ], [ -0.186585, -0.052886 ], [ -0.034250, -0.084547 ],
895 [ -0.087443, -0.095426 ], [ -0.453322, -0.174493 ], [ -0.363975, -0.148186 ],
896 [ -0.334413, -0.202479 ], [ -0.221313, -0.181320 ], [ -0.131146, -0.050611 ],
897 [ -0.104706, 0.115139 ], [ 0.192765, 0.275417 ], [ 0.014184, 0.194251 ],
898 [ 0.154215, 0.226949 ], [ 0.084031, 0.221759 ], [ 0.189438, 0.164566 ],
899 [ 0.130737, 0.170962 ], [ -0.066815, 0.062954 ], [ -0.177176, -0.145167 ],
900 [ -0.247608, -0.129767 ], [ -0.187886, -0.293720 ], [ -0.244036, -0.344655 ],
901 [ -0.203063, -0.234947 ], [ -0.292715, -0.158421 ], [ 0.064990, -0.028164 ],
902 [ 0.147664, 0.085995 ], [ 0.107977, 0.002253 ], [ 0.071286, 0.027533 ],
903 [ 0.021017, -0.049807 ], [ -0.272056, -0.217857 ], [ -0.065596, 0.008375 ],
904 [ -0.150818, -0.195514 ], [ -0.012767, -0.150787 ], [ 0.238541, 0.136606 ],
905 [ 0.291741, 0.114024 ], [ 0.202677, 0.103701 ], [ 0.140985, 0.037759 ],
906 [ -0.257347, -0.442383 ], [ -0.320666, -0.319742 ], [ -0.488725, -0.603660 ],
907 [ -0.319170, -0.469806 ], [ 0.014970, -0.101074 ], [ 0.102209, 0.066790 ],
908 [ -0.076202, -0.044884 ], [ 0.073868, 0.152565 ], [ 0.070755, -0.091358 ],
909 [ -0.016751, 0.027216 ], [ 0.071201, 0.096981 ], [ -0.060975, -0.145638 ],
910 [ 0.114156, 0.117587 ], [ -0.284757, -0.029101 ], [ -0.253005, -0.073645 ],
911 [ -0.204028, -0.098492 ], [ -0.114508, 0.001219 ], [ -0.225284, -0.011998 ],
912 [ -0.235670, 0.084330 ], [ 0.161921, 0.128334 ], [ 0.025717, 0.119456 ],
913 [ -0.255292, -0.281471 ], [ -0.392803, -0.095809 ], [ 0.039229, -0.152110 ],
914 [ -0.310905, -0.099233 ], [ -0.268773, 0.032308 ], [ -0.340150, 0.013129 ],
915 [ -0.344890, -0.045157 ], [ -0.188423, 0.265603 ], [ -0.168235, -0.000936 ],
916 [ 0.000462, 0.297000 ], [ 0.263674, 0.371214 ], [ -0.146797, -0.098225 ],
917 [ -0.386557, -0.282426 ], [ -0.070940, -0.255550 ], [ 0.293258, 0.252785 ],
918 [ 0.408332, 0.387751 ], [ -0.381914, -0.358918 ], [ -0.463621, -0.315560 ],
919 [ -0.323681, -0.258465 ], [ 0.250055, 0.071195 ], [ -0.405256, -0.429754 ],
920 [ -0.135748, -0.251274 ], [ 0.186827, 0.060177 ], [ 0.116742, -0.053526 ],
921 [ -0.403321, -0.220339 ], [ -0.414144, -0.021108 ], [ -0.416877, 0.050184 ],
922 [ -0.470083, -0.079564 ], [ -0.315554, 0.219217 ], [ -0.273183, 0.138437 ],
923 [ 0.253231, 0.306374 ], [ 0.177802, 0.346298 ], [ 0.210358, 0.207697 ],
924 [ -0.323480, 0.077519 ], [ -0.193136, 0.048170 ], [ 0.114492, 0.292778 ],
925 [ -0.130766, 0.056677 ], [ -0.171572, -0.349267 ], [ -0.370076, -0.536392 ],
926 [ -0.311109, -0.389953 ], [ 0.334928, 0.367664 ], [ 0.351246, 0.438664 ],
927 [ 0.518803, 0.331253 ], [ 0.437061, 0.327257 ], [ 0.318906, 0.307389 ],
928 [ -0.025972, -0.206758 ], [ 0.373278, 0.325438 ], [ 0.473488, 0.389441 ],
929 [ 0.478553, 0.477990 ], [ 0.332783, 0.153825 ], [ 0.212098, 0.452336 ],
930 [ 0.161522, -0.011212 ], [ 0.209368, 0.020687 ], [ -0.086262, 0.204493 ],
931 [ -0.388643, 0.133640 ], [ -0.177016, 0.134404 ]
932];
933
934const SIPRO_LSF_CB3_LBR: &[[f32; 2]] = &[
935 [ -0.003594, -0.022447 ], [ 0.070651, 0.028334 ], [ -0.290374, -0.018347 ],
936 [ -0.224495, -0.370312 ], [ -0.269555, -0.131227 ], [ -0.122714, -0.267733 ],
937 [ 0.173325, 0.138698 ], [ 0.161946, 0.020687 ], [ 0.111706, 0.022510 ],
938 [ 0.097638, 0.056049 ], [ 0.139754, 0.059920 ], [ 0.056549, -0.050586 ],
939 [ 0.036301, 0.021501 ], [ -0.066347, 0.012324 ], [ -0.066972, 0.096136 ],
940 [ -0.120062, -0.084201 ], [ 0.011225, 0.047425 ], [ -0.012846, -0.067390 ],
941 [ -0.116201, 0.122874 ], [ -0.027819, 0.035453 ], [ -0.024743, 0.072835 ],
942 [ -0.034061, -0.001310 ], [ 0.077469, 0.081609 ], [ 0.128347, 0.139584 ],
943 [ 0.183416, 0.086563 ], [ -0.155839, -0.053775 ], [ -0.190403, -0.018639 ],
944 [ -0.202548, -0.062841 ], [ -0.373733, -0.275094 ], [ -0.394260, -0.186513 ],
945 [ -0.465700, -0.220031 ], [ 0.064400, -0.095825 ], [ -0.262053, -0.199837 ],
946 [ -0.167233, -0.094402 ], [ 0.048600, 0.057567 ], [ -0.007122, 0.168506 ],
947 [ 0.050938, 0.156451 ], [ -0.060828, 0.147083 ], [ -0.171889, 0.195822 ],
948 [ -0.218934, 0.138431 ], [ -0.270532, 0.195775 ], [ -0.405818, 0.075643 ],
949 [ -0.440187, 0.193387 ], [ -0.484968, 0.157607 ], [ -0.480560, 0.067230 ],
950 [ -0.436757, -0.111847 ], [ -0.040731, -0.040363 ], [ -0.202319, -0.170457 ],
951 [ -0.158515, -0.134551 ], [ -0.356709, -0.378549 ], [ -0.268820, -0.289831 ],
952 [ -0.188486, -0.289306 ], [ -0.148139, -0.177616 ], [ -0.071591, -0.191128 ],
953 [ -0.052270, -0.150589 ], [ -0.020543, -0.116220 ], [ 0.039584, -0.012592 ],
954 [ -0.268226, 0.042704 ], [ -0.209755, 0.069423 ], [ -0.168964, 0.124504 ],
955 [ -0.363240, 0.188266 ], [ -0.524935, -0.025010 ], [ -0.105894, -0.002699 ],
956 [ -0.251830, -0.062018 ], [ -0.310480, -0.082325 ], [ 0.014652, 0.083127 ],
957 [ -0.136512, 0.033116 ], [ -0.073755, -0.025236 ], [ 0.110766, 0.095954 ],
958 [ 0.002878, 0.011838 ], [ -0.074977, -0.244586 ], [ -0.047023, -0.081339 ],
959 [ -0.183249, 0.029525 ], [ 0.263435, 0.206934 ], [ -0.156721, -0.229993 ],
960 [ -0.112224, -0.208941 ], [ -0.116534, -0.123191 ], [ -0.073988, -0.111668 ],
961 [ 0.029484, -0.137573 ], [ -0.009802, -0.161685 ], [ -0.023273, 0.114043 ],
962 [ -0.332651, 0.049072 ], [ -0.394009, 0.018608 ], [ -0.433543, -0.035318 ],
963 [ -0.368459, -0.108024 ], [ -0.350215, -0.037617 ], [ -0.321140, -0.178537 ],
964 [ 0.020307, -0.048487 ], [ -0.210512, -0.232274 ], [ -0.082140, -0.065443 ],
965 [ 0.081961, -0.009340 ], [ 0.146794, 0.101973 ], [ 0.213999, 0.124687 ],
966 [ 0.100217, -0.054095 ], [ -0.114411, -0.041403 ], [ -0.097631, 0.037061 ],
967 [ -0.099651, -0.157978 ], [ -0.215790, -0.116550 ], [ -0.107100, 0.076300 ],
968 [ 0.084653, 0.126088 ], [ 0.246439, 0.091442 ], [ 0.160077, 0.188536 ],
969 [ 0.273900, 0.279190 ], [ 0.320417, 0.232550 ], [ 0.132710, -0.018988 ],
970 [ 0.018950, -0.091681 ], [ -0.032073, -0.202906 ], [ 0.212789, 0.178188 ],
971 [ 0.208580, 0.239726 ], [ 0.049420, 0.099840 ], [ -0.145695, -0.010619 ],
972 [ -0.132525, -0.322660 ], [ 0.019666, 0.126603 ], [ 0.260809, 0.147727 ],
973 [ -0.232795, -0.001090 ], [ -0.049826, 0.225987 ], [ -0.154774, 0.076614 ],
974 [ 0.045032, 0.221397 ], [ 0.321014, 0.161632 ], [ -0.062379, 0.053586 ],
975 [ 0.132252, 0.246675 ], [ 0.392627, 0.271905 ], [ -0.264585, 0.102344 ],
976 [ -0.327200, 0.121624 ], [ -0.399642, 0.124445 ], [ -0.108335, 0.179171 ],
977 [ 0.100374, 0.182731 ], [ 0.203852, 0.049505 ]
978];
979
980const SIPRO_LSF_CB4_LBR: &[[f32; 2]] = &[
981 [ -0.047705, 0.008002 ], [ 0.011332, 0.065028 ], [ -0.021796, -0.034777 ],
982 [ -0.147394, -0.001241 ], [ -0.001577, 0.020599 ], [ -0.083827, -0.028975 ],
983 [ -0.177707, 0.066046 ], [ -0.043241, -0.165144 ], [ 0.053322, 0.096519 ],
984 [ -0.097688, 0.106484 ], [ -0.023392, 0.111234 ], [ -0.146747, -0.159360 ],
985 [ 0.027241, -0.011806 ], [ -0.043156, 0.057667 ], [ 0.019516, -0.062116 ],
986 [ 0.025990, 0.162533 ], [ 0.091888, 0.009720 ], [ -0.098511, 0.036414 ],
987 [ 0.013722, -0.116512 ], [ 0.054833, -0.180975 ], [ 0.119497, 0.128774 ],
988 [ 0.118378, -0.125997 ], [ 0.065882, -0.030932 ], [ 0.120581, -0.039964 ],
989 [ -0.050561, -0.088577 ], [ 0.050134, 0.033194 ], [ -0.129654, -0.075112 ],
990 [ -0.225334, -0.040234 ], [ 0.070629, -0.084455 ], [ 0.095508, 0.063548 ],
991 [ 0.150514, 0.034366 ], [ 0.186092, -0.069272 ]
992];
993
994const SIPRO_MEAN_LSF_LBR: [f32; 10] = [
995 0.297151, 0.452308, 0.765443, 1.134803, 1.421125,
996 1.773822, 2.049173, 2.375914, 2.585097, 0.075756
997];
998
999const SIPRO_LSF_CODEBOOK_16K: [&[[f32; 3]]; 4] = [
1000 SIPRO_LSF_CB0_16K, SIPRO_LSF_CB1_16K, SIPRO_LSF_CB2_16K, SIPRO_LSF_CB3_16K
1001];
1002
1003const SIPRO_LSF_CB0_16K: &[[f32; 3]] = &[
1004 [ -0.089990, -0.172485, -0.203391 ], [ -0.094710, -0.178687, -0.134483 ],
1005 [ -0.056398, -0.131952, -0.154500 ], [ -0.051362, -0.128138, -0.198549 ],
1006 [ -0.061700, -0.142830, -0.251623 ], [ -0.041512, -0.115637, -0.229420 ],
1007 [ -0.036544, -0.107512, -0.173125 ], [ -0.024158, -0.088450, -0.204144 ],
1008 [ -0.038690, -0.103368, -0.132674 ], [ -0.056954, -0.128472, -0.104669 ],
1009 [ -0.020963, -0.076785, -0.163199 ], [ -0.012952, -0.077249, -0.128385 ],
1010 [ -0.032787, -0.097044, -0.093967 ], [ -0.035214, -0.053838, -0.111940 ],
1011 [ -0.013850, -0.036926, -0.139328 ], [ -0.004956, -0.065092, -0.087709 ],
1012 [ -0.065354, -0.065595, -0.079064 ], [ -0.023627, -0.081457, -0.054195 ],
1013 [ -0.027335, -0.035244, -0.068034 ], [ 0.016555, -0.047075, -0.128286 ],
1014 [ 0.021066, -0.037252, -0.092041 ], [ 0.014681, -0.043044, -0.057739 ],
1015 [ -0.008493, -0.008143, -0.102486 ], [ -0.002303, -0.061540, -0.022952 ],
1016 [ -0.006061, -0.014278, -0.033652 ], [ -0.005276, 0.011246, -0.062762 ],
1017 [ 0.043411, -0.006303, -0.063730 ], [ 0.035885, -0.010052, -0.115290 ],
1018 [ 0.030628, -0.031538, -0.017807 ], [ 0.022345, 0.028210, -0.032335 ],
1019 [ 0.026535, 0.027536, -0.091150 ], [ -0.003365, -0.008077, 0.015687 ],
1020 [ -0.026013, 0.017493, -0.010355 ], [ 0.059069, 0.010634, -0.007530 ],
1021 [ 0.044038, -0.019424, 0.030453 ], [ -0.036065, -0.034215, -0.007758 ],
1022 [ 0.022486, 0.042543, 0.027870 ], [ -0.049985, -0.016085, 0.021768 ],
1023 [ -0.021715, 0.021168, 0.052076 ], [ -0.004243, -0.061228, 0.027640 ],
1024 [ -0.033950, -0.017287, 0.064656 ], [ 0.016151, 0.000727, 0.062757 ],
1025 [ -0.063456, -0.043152, 0.056707 ], [ -0.067715, 0.006126, 0.058178 ],
1026 [ -0.038931, 0.051673, 0.030636 ], [ -0.073017, -0.074716, 0.026387 ],
1027 [ -0.039893, -0.104629, 0.039616 ], [ -0.073179, -0.074601, 0.082069 ],
1028 [ -0.066154, -0.027180, 0.099439 ], [ -0.075167, -0.121149, 0.071938 ],
1029 [ -0.030382, -0.092582, 0.091067 ], [ -0.084519, -0.137542, 0.023626 ],
1030 [ -0.060956, -0.121259, -0.015264 ], [ -0.030069, -0.093823, -0.008692 ],
1031 [ -0.063564, -0.065225, -0.025820 ], [ -0.052074, -0.117595, -0.059689 ],
1032 [ -0.091652, -0.165173, -0.045573 ], [ -0.070167, -0.121342, 0.131707 ],
1033 [ -0.061024, -0.005833, -0.051035 ], [ 0.007837, -0.051816, 0.074575 ],
1034 [ -0.070643, -0.053927, 0.149498 ], [ -0.014358, -0.066681, 0.139708 ],
1035 [ -0.058186, 0.029576, 0.092923 ], [ -0.023371, 0.007058, 0.112484 ],
1036 [ -0.057969, 0.022786, 0.148420 ], [ 0.029439, -0.017673, 0.121423 ],
1037 [ -0.015811, 0.056785, 0.091594 ], [ 0.004347, 0.056680, 0.137848 ],
1038 [ -0.004464, 0.002342, 0.184013 ], [ 0.029660, 0.046870, 0.082654 ],
1039 [ 0.059408, 0.001016, 0.086063 ], [ 0.055263, 0.027574, 0.155037 ],
1040 [ 0.062166, 0.064323, 0.117371 ], [ 0.022967, 0.100050, 0.077227 ],
1041 [ 0.041795, 0.096343, 0.170421 ], [ 0.053189, 0.122931, 0.118549 ],
1042 [ 0.094247, 0.094448, 0.078395 ], [ 0.082407, 0.033408, 0.041085 ],
1043 [ 0.096820, 0.115960, 0.149433 ], [ 0.067804, 0.121849, 0.025336 ],
1044 [ -0.008421, 0.104316, 0.032314 ], [ 0.031013, 0.073218, -0.004899 ],
1045 [ 0.085079, 0.060323, -0.009687 ], [ 0.028174, 0.092766, -0.055590 ],
1046 [ 0.070133, 0.039160, -0.061035 ], [ -0.039211, 0.072517, -0.028756 ],
1047 [ 0.129686, 0.100233, -0.046998 ], [ 0.154189, 0.107616, 0.022791 ],
1048 [ -0.049331, 0.094184, 0.087984 ], [ -0.013179, 0.126552, 0.125099 ],
1049 [ -0.058716, 0.098524, 0.150886 ], [ -0.022753, 0.080011, 0.191127 ],
1050 [ 0.013451, 0.164593, 0.153768 ], [ 0.074818, 0.181214, 0.108211 ],
1051 [ 0.091323, 0.169249, 0.168460 ], [ 0.033885, 0.155516, 0.213745 ],
1052 [ -0.032128, 0.227238, 0.135815 ], [ -0.059176, 0.168980, 0.229110 ],
1053 [ 0.033917, 0.229753, 0.222264 ], [ 0.082702, 0.116370, 0.224697 ],
1054 [ 0.127737, 0.186658, 0.212783 ], [ 0.047528, 0.063920, 0.216856 ],
1055 [ -0.002446, 0.114174, 0.263289 ], [ -0.077783, 0.082523, 0.249697 ],
1056 [ 0.010023, 0.024267, 0.256874 ], [ 0.053190, 0.111422, 0.310407 ],
1057 [ -0.078804, 0.004444, 0.224078 ], [ -0.055253, -0.059180, 0.217892 ],
1058 [ -0.065371, 0.008124, 0.333405 ], [ -0.076188, -0.098767, 0.286983 ],
1059 [ -0.071911, -0.115804, 0.198031 ], [ -0.062473, 0.183639, 0.370162 ],
1060 [ -0.042666, 0.255210, 0.262720 ], [ 0.011999, 0.217530, 0.318291 ],
1061 [ -0.042144, 0.322087, 0.326387 ], [ 0.090663, 0.205835, 0.294784 ],
1062 [ 0.058218, 0.293649, 0.277927 ], [ 0.157506, 0.282870, 0.294610 ],
1063 [ 0.118248, 0.261007, 0.148614 ], [ 0.065261, 0.332362, 0.411912 ],
1064 [ 0.141269, 0.451850, 0.315726 ], [ 0.001706, 0.456301, 0.357590 ],
1065 [ -0.052947, 0.356559, 0.456944 ], [ 0.247707, 0.263837, 0.152591 ],
1066 [ 0.306847, 0.417373, 0.258553 ], [ 0.166347, 0.149222, 0.118973 ],
1067 [ 0.379709, 0.292172, 0.139875 ], [ 0.010171, -0.055170, -0.174523 ]
1068];
1069
1070const SIPRO_LSF_CB1_16K: &[[f32; 3]] = &[
1071 [ -0.213011, -0.293385, -0.330597 ], [ -0.212582, -0.240992, -0.338239 ],
1072 [ -0.223373, -0.306214, -0.277192 ], [ -0.231138, -0.287729, -0.229412 ],
1073 [ -0.238466, -0.228571, -0.260954 ], [ -0.140931, -0.247018, -0.258566 ],
1074 [ -0.136239, -0.249669, -0.350143 ], [ -0.149738, -0.192970, -0.281475 ],
1075 [ -0.167058, -0.261052, -0.196301 ], [ -0.177049, -0.201324, -0.207897 ],
1076 [ -0.116915, -0.200629, -0.212526 ], [ -0.162247, -0.143805, -0.245093 ],
1077 [ -0.082042, -0.191842, -0.266338 ], [ -0.098846, -0.208511, -0.320481 ],
1078 [ -0.113510, -0.152470, -0.222474 ], [ -0.066197, -0.179112, -0.207813 ],
1079 [ -0.129490, -0.169320, -0.155238 ], [ -0.078843, -0.190292, -0.155172 ],
1080 [ -0.087790, -0.147729, -0.169351 ], [ -0.141037, -0.127207, -0.177910 ],
1081 [ -0.126525, -0.223961, -0.153639 ], [ -0.101464, -0.189953, -0.114559 ],
1082 [ -0.102450, -0.106303, -0.151171 ], [ -0.103208, -0.144457, -0.105378 ],
1083 [ -0.170794, -0.140525, -0.136428 ], [ -0.168641, -0.203064, -0.135368 ],
1084 [ -0.138193, -0.116042, -0.111905 ], [ -0.145085, -0.168581, -0.092613 ],
1085 [ -0.126379, -0.220431, -0.091327 ], [ -0.212934, -0.184797, -0.101632 ],
1086 [ -0.193711, -0.140556, -0.078304 ], [ -0.173674, -0.197276, -0.060140 ],
1087 [ -0.197897, -0.241907, -0.091997 ], [ -0.156037, -0.258519, -0.111628 ],
1088 [ -0.241964, -0.191124, -0.063140 ], [ -0.261340, -0.240847, -0.103132 ],
1089 [ -0.221621, -0.242972, -0.041255 ], [ -0.224166, -0.232742, -0.161568 ],
1090 [ -0.203591, -0.294470, -0.126035 ], [ -0.209540, -0.303149, -0.053170 ],
1091 [ -0.253859, -0.295066, -0.156050 ], [ -0.278143, -0.331105, -0.085237 ],
1092 [ -0.300273, -0.198750, -0.094834 ], [ -0.260477, -0.169713, -0.132476 ],
1093 [ -0.211889, -0.172454, -0.164281 ], [ -0.228370, -0.122149, -0.124178 ],
1094 [ -0.254629, -0.135668, -0.081692 ], [ -0.263813, -0.154928, -0.213596 ],
1095 [ -0.308224, -0.106877, -0.084404 ], [ -0.242644, -0.082862, -0.085835 ],
1096 [ -0.252084, -0.064888, -0.146498 ], [ -0.198162, -0.105721, -0.188887 ],
1097 [ -0.189238, -0.088028, -0.109736 ], [ -0.197598, -0.099831, -0.044030 ],
1098 [ -0.269017, -0.105991, -0.021513 ], [ -0.231349, -0.058825, -0.041407 ],
1099 [ -0.225589, -0.027501, -0.087160 ], [ -0.160347, -0.058341, -0.079789 ],
1100 [ -0.158729, -0.108951, -0.067262 ], [ -0.170483, -0.053023, -0.017561 ],
1101 [ -0.175207, -0.013649, -0.049513 ], [ -0.156004, -0.108378, -0.004052 ],
1102 [ -0.219958, -0.082362, 0.014950 ], [ -0.217785, -0.012981, -0.009410 ],
1103 [ -0.123290, -0.040849, -0.040910 ], [ -0.119861, -0.095078, -0.060246 ],
1104 [ -0.117537, -0.065479, 0.002968 ], [ -0.103231, -0.113298, -0.023282 ],
1105 [ -0.136365, -0.149524, -0.051387 ], [ -0.119332, -0.164400, -0.009103 ],
1106 [ -0.104522, -0.060948, -0.083056 ], [ -0.071461, -0.070787, -0.037347 ],
1107 [ -0.081116, -0.149015, -0.056740 ], [ -0.069561, -0.108099, -0.069167 ],
1108 [ -0.055624, -0.117369, -0.025091 ], [ -0.091941, -0.190091, -0.060020 ],
1109 [ -0.072003, -0.168433, -0.006540 ], [ -0.033305, -0.154427, -0.054608 ],
1110 [ -0.062988, -0.127093, -0.108307 ], [ -0.056690, -0.170813, -0.102834 ],
1111 [ -0.018273, -0.127863, -0.094998 ], [ -0.056239, -0.123678, -0.146262 ],
1112 [ -0.023442, -0.154617, -0.137417 ], [ -0.051903, -0.078379, -0.093395 ],
1113 [ -0.014599, -0.104412, -0.135959 ], [ -0.051582, -0.081280, -0.140643 ],
1114 [ -0.092727, -0.091930, -0.107816 ], [ -0.024814, -0.140993, -0.183243 ],
1115 [ -0.064307, -0.113024, -0.194788 ], [ -0.000118, -0.098858, -0.195336 ],
1116 [ -0.028090, -0.048258, -0.164101 ], [ -0.093414, -0.055969, -0.172743 ],
1117 [ -0.114445, -0.104336, -0.215204 ], [ -0.048518, -0.132063, -0.242991 ],
1118 [ -0.159620, -0.060240, -0.178592 ], [ -0.135728, -0.067473, -0.131876 ],
1119 [ -0.078464, -0.038040, -0.125105 ], [ -0.011061, -0.064011, -0.102496 ],
1120 [ -0.033887, -0.026485, -0.109493 ], [ -0.129128, -0.014216, -0.111329 ],
1121 [ -0.190687, -0.030660, -0.135825 ], [ -0.082037, 0.010997, -0.100167 ],
1122 [ -0.183403, 0.001651, -0.098962 ], [ -0.074775, -0.030335, -0.062217 ],
1123 [ -0.031759, -0.050551, -0.059420 ], [ -0.051439, 0.010827, -0.052148 ],
1124 [ -0.126744, 0.008689, -0.047785 ], [ -0.145916, 0.042019, -0.077431 ],
1125 [ -0.093552, 0.054143, -0.060473 ], [ -0.090660, 0.012868, -0.018195 ],
1126 [ -0.079783, -0.033071, 0.001482 ], [ -0.033010, -0.022331, -0.014506 ],
1127 [ -0.004798, -0.017339, -0.060120 ], [ -0.025021, 0.026390, -0.003263 ],
1128 [ -0.001437, 0.025994, -0.040892 ], [ -0.074821, 0.019005, 0.027549 ],
1129 [ -0.030811, -0.012114, 0.034284 ], [ 0.006785, 0.004618, 0.018717 ],
1130 [ 0.013392, -0.032597, -0.023731 ], [ 0.035994, 0.005963, -0.011757 ],
1131 [ 0.008071, -0.045750, 0.024889 ], [ 0.013055, 0.017040, 0.054121 ],
1132 [ -0.012989, 0.044864, 0.036327 ], [ 0.025054, 0.047137, 0.009974 ],
1133 [ 0.053801, 0.024178, 0.031774 ], [ 0.056442, -0.030647, 0.021291 ],
1134 [ 0.032247, 0.052680, 0.049886 ], [ 0.035369, 0.090207, 0.031394 ],
1135 [ 0.064720, 0.070390, 0.040938 ], [ 0.022112, 0.054834, 0.091059 ],
1136 [ 0.041765, 0.086248, 0.070196 ], [ 0.070645, 0.060852, 0.078825 ],
1137 [ 0.058506, 0.016920, 0.081612 ], [ 0.000009, 0.086500, 0.059849 ],
1138 [ 0.071253, 0.107392, 0.059046 ], [ 0.094702, 0.096160, 0.090982 ],
1139 [ 0.047639, 0.110877, 0.111227 ], [ 0.122444, 0.090909, 0.057396 ],
1140 [ 0.101916, 0.052299, 0.029909 ], [ 0.076560, 0.086094, -0.007252 ],
1141 [ 0.123411, 0.030769, 0.082749 ], [ 0.135579, 0.103022, 0.009540 ],
1142 [ 0.120576, 0.065284, -0.024095 ], [ 0.077483, 0.028526, -0.012369 ],
1143 [ 0.128747, 0.017901, -0.003874 ], [ 0.158254, 0.046962, 0.029577 ],
1144 [ 0.102287, -0.002211, 0.037329 ], [ 0.089654, -0.021372, -0.006857 ],
1145 [ 0.137917, 0.027228, -0.053223 ], [ 0.098728, -0.012192, -0.048518 ],
1146 [ 0.083974, 0.036153, -0.062266 ], [ 0.048230, -0.010241, -0.052293 ],
1147 [ 0.110135, 0.007715, -0.095233 ], [ 0.068294, -0.014317, -0.104029 ],
1148 [ 0.063909, -0.056416, -0.063023 ], [ 0.059133, -0.044675, -0.023780 ],
1149 [ 0.030748, 0.021845, -0.086332 ], [ 0.023994, -0.045574, -0.076232 ],
1150 [ 0.052147, -0.059825, -0.109667 ], [ 0.013087, -0.020420, -0.121945 ],
1151 [ 0.018163, -0.096765, -0.088758 ], [ 0.020196, -0.076470, -0.048112 ],
1152 [ 0.020282, -0.084204, -0.135535 ], [ 0.040076, -0.053464, -0.161949 ],
1153 [ -0.017796, -0.103070, -0.059559 ], [ -0.016484, -0.070138, -0.016866 ],
1154 [ 0.004849, -0.112481, -0.017731 ], [ 0.040160, -0.073873, -0.005327 ],
1155 [ 0.002202, -0.094723, 0.045366 ], [ -0.056918, -0.081578, 0.017875 ],
1156 [ -0.031099, -0.141708, 0.009186 ], [ -0.102802, -0.122675, 0.030060 ],
1157 [ -0.061717, -0.145116, 0.076680 ], [ -0.073607, -0.050464, 0.072853 ],
1158 [ -0.117403, -0.194921, 0.040101 ], [ -0.185236, -0.133620, 0.045939 ],
1159 [ -0.160174, -0.057226, 0.056641 ], [ -0.178489, -0.173435, -0.007806 ],
1160 [ -0.199916, -0.204866, 0.047342 ], [ -0.152337, -0.249651, 0.034656 ],
1161 [ -0.185637, -0.230942, -0.002072 ], [ -0.122548, -0.215209, -0.024552 ],
1162 [ -0.249578, -0.209714, 0.009470 ], [ -0.160108, -0.257702, -0.040992 ],
1163 [ -0.216694, -0.289353, 0.027182 ], [ -0.226390, -0.147844, -0.022742 ],
1164 [ -0.288737, -0.272150, -0.013948 ], [ -0.262554, -0.237035, 0.072473 ],
1165 [ -0.306267, -0.188335, -0.032894 ], [ -0.259666, -0.345816, 0.024138 ],
1166 [ -0.271093, -0.137143, 0.040404 ], [ -0.201317, -0.286782, 0.107615 ],
1167 [ -0.235725, -0.163396, 0.113844 ], [ -0.159988, -0.209788, 0.112140 ],
1168 [ -0.262985, -0.056741, 0.093506 ], [ -0.277226, -0.037306, 0.016008 ],
1169 [ -0.293486, -0.040422, -0.062018 ], [ -0.214921, 0.022900, 0.055295 ],
1170 [ -0.253889, 0.058575, -0.000151 ], [ -0.246689, 0.024242, -0.058488 ],
1171 [ -0.143790, 0.006767, 0.014061 ], [ -0.187077, 0.048882, -0.035625 ],
1172 [ -0.196369, 0.112085, 0.031546 ], [ -0.124264, 0.086197, -0.020800 ],
1173 [ -0.126249, 0.016960, 0.095741 ], [ -0.079816, 0.080398, 0.051038 ],
1174 [ -0.056269, 0.075380, -0.028262 ], [ -0.120493, 0.148495, 0.028430 ],
1175 [ -0.161750, 0.101290, 0.117806 ], [ -0.003247, 0.083393, -0.017061 ],
1176 [ -0.034007, 0.142542, 0.007402 ], [ -0.037618, 0.025871, 0.089496 ],
1177 [ -0.082819, 0.184435, 0.073224 ], [ 0.006448, 0.167015, 0.080548 ],
1178 [ 0.035315, 0.144022, 0.003218 ], [ -0.023459, 0.088147, 0.152604 ],
1179 [ 0.006247, -0.024099, 0.077792 ], [ 0.039894, 0.057586, -0.042455 ],
1180 [ -0.020417, 0.035400, -0.093971 ], [ 0.075465, 0.052063, 0.145582 ],
1181 [ 0.078027, 0.184720, 0.092096 ], [ 0.107295, 0.148380, 0.022264 ],
1182 [ 0.066928, -0.052831, 0.065108 ], [ 0.093295, 0.118157, 0.149815 ],
1183 [ 0.119373, 0.137114, 0.099536 ], [ 0.138653, 0.075509, 0.121545 ],
1184 [ 0.174025, 0.077531, 0.077169 ], [ 0.165839, 0.150080, 0.133423 ],
1185 [ 0.173276, 0.155887, 0.048150 ], [ 0.162910, 0.095898, 0.171896 ],
1186 [ 0.214577, 0.112888, 0.115579 ], [ 0.204755, 0.106392, 0.032337 ],
1187 [ 0.178853, 0.205034, 0.114760 ], [ 0.177401, 0.070504, -0.013778 ],
1188 [ 0.241624, 0.166921, 0.066087 ], [ 0.219595, 0.183553, 0.172332 ],
1189 [ 0.123671, 0.170842, 0.167216 ], [ 0.177104, 0.240197, 0.186359 ],
1190 [ 0.272003, 0.220214, 0.126073 ], [ 0.093748, 0.235843, 0.160998 ],
1191 [ 0.141510, 0.190012, 0.240416 ], [ 0.046878, 0.168984, 0.190412 ],
1192 [ 0.094898, 0.107038, 0.235003 ], [ 0.108592, 0.269536, 0.262528 ],
1193 [ -0.027754, 0.234355, 0.134544 ], [ 0.265127, 0.267540, 0.199041 ],
1194 [ 0.199523, 0.291507, 0.265171 ], [ 0.266177, 0.209339, 0.350369 ],
1195 [ 0.322159, 0.344794, 0.270823 ], [ 0.399957, 0.264065, 0.110387 ],
1196 [ 0.277817, 0.127407, -0.035625 ], [ -0.177038, 0.208155, 0.119077 ],
1197 [ 0.049075, -0.076294, 0.145711 ], [ 0.187246, 0.042865, -0.127097 ],
1198 [ 0.117885, -0.023489, -0.138658 ], [ -0.284256, 0.068153, 0.124259 ]
1199];
1200
1201const SIPRO_LSF_CB2_16K: &[[f32; 3]] = &[
1202 [ -0.223412, -0.236300, -0.188067 ], [ -0.202286, -0.218711, -0.102947 ],
1203 [ -0.251652, -0.161020, -0.125280 ], [ -0.169223, -0.138155, -0.140430 ],
1204 [ -0.176427, -0.146628, -0.222632 ], [ -0.120584, -0.187276, -0.180164 ],
1205 [ -0.195559, -0.074225, -0.169109 ], [ -0.144551, -0.142774, -0.073340 ],
1206 [ -0.111001, -0.111310, -0.130696 ], [ -0.095221, -0.174684, -0.111841 ],
1207 [ -0.112158, -0.103049, -0.195130 ], [ -0.059989, -0.142170, -0.157850 ],
1208 [ -0.127598, -0.051759, -0.153109 ], [ -0.063753, -0.067898, -0.164117 ],
1209 [ -0.141753, -0.068274, -0.091999 ], [ -0.060482, -0.101054, -0.099475 ],
1210 [ -0.104699, -0.104456, -0.066496 ], [ -0.073649, -0.052614, -0.091612 ],
1211 [ -0.088268, -0.019072, -0.129956 ], [ -0.018837, -0.104115, -0.127837 ],
1212 [ -0.021630, -0.033055, -0.129868 ], [ -0.083768, -0.047549, -0.041407 ],
1213 [ -0.055892, -0.108526, -0.043200 ], [ -0.027816, -0.062499, -0.048190 ],
1214 [ -0.002248, -0.110428, -0.062868 ], [ 0.001270, -0.033245, -0.072404 ],
1215 [ -0.042747, -0.013835, -0.033829 ], [ -0.037615, -0.147833, -0.083912 ],
1216 [ -0.045023, 0.006011, -0.092182 ], [ -0.050411, -0.081832, 0.005787 ],
1217 [ 0.000357, -0.104282, -0.009428 ], [ -0.003893, -0.047892, -0.001506 ],
1218 [ -0.040077, -0.147110, -0.009065 ], [ -0.060858, -0.030972, 0.012999 ],
1219 [ -0.014674, 0.001370, 0.005554 ], [ -0.101362, -0.126061, -0.001898 ],
1220 [ -0.102519, -0.000390, -0.015721 ], [ -0.132687, -0.069608, -0.019928 ],
1221 [ -0.102227, -0.076131, 0.043306 ], [ -0.055193, 0.027001, 0.011857 ],
1222 [ -0.156427, -0.016629, 0.017480 ], [ -0.078736, 0.002809, 0.057979 ],
1223 [ -0.157789, -0.016693, -0.055073 ], [ -0.179397, -0.095520, 0.022065 ],
1224 [ -0.110219, 0.010408, -0.081927 ], [ -0.125392, 0.049111, 0.044595 ],
1225 [ -0.112528, 0.063173, -0.024954 ], [ -0.185525, 0.053093, -0.032102 ],
1226 [ -0.176887, -0.019379, -0.115125 ], [ -0.249706, -0.017664, -0.059188 ],
1227 [ -0.200243, -0.103311, -0.066846 ], [ -0.055404, 0.045106, -0.046991 ],
1228 [ -0.000544, 0.022690, -0.044831 ], [ 0.022298, -0.016367, -0.022509 ],
1229 [ 0.028278, 0.017585, -0.100612 ], [ 0.061781, -0.020826, -0.068190 ],
1230 [ 0.029157, -0.074477, -0.098898 ], [ 0.043073, -0.067234, -0.032293 ],
1231 [ 0.060157, 0.034636, -0.034885 ], [ 0.071153, -0.013881, -0.009036 ],
1232 [ 0.054196, -0.029989, -0.131139 ], [ 0.030193, 0.024976, 0.009861 ],
1233 [ 0.055943, -0.045304, 0.031927 ], [ 0.033217, -0.002418, 0.038165 ],
1234 [ 0.063814, 0.045625, 0.025309 ], [ 0.033689, 0.038819, 0.049700 ],
1235 [ 0.073582, 0.028527, 0.060200 ], [ -0.007957, 0.022531, 0.043687 ],
1236 [ -0.000984, 0.054518, 0.018742 ], [ 0.057004, 0.060916, 0.060573 ],
1237 [ 0.009883, 0.015238, 0.080211 ], [ 0.022742, 0.070832, 0.068855 ],
1238 [ 0.053001, 0.029790, 0.091446 ], [ -0.042447, 0.060379, 0.061462 ],
1239 [ 0.076826, 0.062468, 0.089653 ], [ 0.039065, 0.069768, 0.119128 ],
1240 [ 0.064145, 0.095353, 0.071621 ], [ 0.094411, 0.069527, 0.054197 ],
1241 [ 0.042812, 0.093060, 0.027980 ], [ 0.094791, 0.099189, 0.101112 ],
1242 [ 0.117611, 0.048601, 0.093111 ], [ 0.119951, 0.122758, 0.051546 ],
1243 [ 0.103558, 0.085245, -0.010700 ], [ 0.150126, 0.059766, 0.020280 ],
1244 [ 0.108066, 0.017170, 0.008606 ], [ 0.108422, 0.023253, -0.063942 ],
1245 [ 0.019652, 0.072284, -0.030331 ], [ 0.192719, 0.075624, 0.071156 ],
1246 [ 0.221140, 0.069191, -0.035085 ], [ 0.188367, 0.126200, 0.035225 ],
1247 [ 0.185760, 0.043537, -0.101714 ], [ -0.042518, 0.099646, 0.003244 ],
1248 [ -0.015308, -0.027521, 0.046006 ], [ 0.034086, -0.045777, 0.095989 ],
1249 [ 0.007174, -0.093358, 0.046459 ], [ -0.051248, -0.062095, 0.083161 ],
1250 [ -0.045626, -0.133301, 0.052997 ], [ -0.037840, 0.024042, 0.131097 ],
1251 [ -0.020217, -0.115942, 0.126170 ], [ -0.134550, -0.036291, 0.111322 ],
1252 [ -0.110576, -0.160024, 0.091841 ], [ -0.093308, -0.184958, 0.013939 ],
1253 [ -0.082735, -0.167417, -0.051725 ], [ -0.169934, -0.173003, -0.007155 ],
1254 [ -0.128244, -0.213123, -0.053337 ], [ -0.079852, -0.154116, -0.246546 ],
1255 [ -0.032242, -0.108756, -0.204133 ], [ -0.140117, -0.199495, -0.284505 ],
1256 [ 0.010842, -0.074979, -0.166333 ], [ -0.093313, 0.145006, 0.034110 ],
1257 [ -0.039236, 0.113213, 0.111053 ], [ 0.040613, -0.031783, 0.174058 ],
1258 [ -0.164232, 0.131421, 0.149842 ], [ 0.026893, 0.107281, 0.179297 ],
1259 [ 0.047086, 0.158606, 0.103267 ], [ -0.070567, 0.210459, 0.134734 ],
1260 [ 0.094392, 0.137050, 0.166892 ], [ 0.086039, 0.063657, 0.168825 ],
1261 [ 0.159371, 0.120897, 0.154357 ], [ 0.147101, 0.160684, 0.114882 ],
1262 [ 0.120158, 0.199650, 0.180948 ], [ 0.191417, 0.174500, 0.170734 ],
1263 [ 0.159153, 0.142165, 0.233347 ], [ 0.232002, 0.150181, 0.102736 ],
1264 [ 0.188299, 0.221738, 0.228748 ], [ 0.256786, 0.209685, 0.161534 ],
1265 [ 0.257861, 0.247793, 0.250516 ], [ -0.164461, -0.000143, 0.232461 ]
1266];
1267
1268const SIPRO_LSF_CB3_16K: &[[f32; 3]] = &[
1269 [ -0.193369, -0.304643, -0.253777 ], [ -0.164125, -0.277786, -0.153116 ],
1270 [ -0.135681, -0.209120, -0.211724 ], [ -0.121822, -0.215734, -0.292207 ],
1271 [ -0.198781, -0.161674, -0.242538 ], [ -0.164147, -0.180570, -0.138070 ],
1272 [ -0.095915, -0.198695, -0.154309 ], [ -0.248386, -0.234462, -0.136984 ],
1273 [ -0.164968, -0.108318, -0.175635 ], [ -0.124171, -0.111809, -0.224402 ],
1274 [ -0.067398, -0.157017, -0.195759 ], [ -0.090132, -0.119174, -0.165253 ],
1275 [ -0.099460, -0.146895, -0.106799 ], [ -0.141493, -0.108103, -0.108880 ],
1276 [ -0.085088, -0.098340, -0.109953 ], [ -0.105526, -0.054463, -0.154315 ],
1277 [ -0.040480, -0.144285, -0.124042 ], [ -0.040969, -0.084039, -0.142880 ],
1278 [ -0.049082, -0.118553, -0.066686 ], [ -0.096336, -0.087515, -0.055741 ],
1279 [ -0.058605, -0.059327, -0.089275 ], [ -0.121842, -0.058681, -0.086949 ],
1280 [ -0.053792, -0.022025, -0.124451 ], [ -0.036744, -0.068891, -0.045865 ],
1281 [ 0.003900, -0.098237, -0.091158 ], [ -0.001664, -0.045089, -0.081353 ],
1282 [ -0.072829, -0.034087, -0.038416 ], [ -0.100822, -0.007330, -0.088715 ],
1283 [ -0.035911, -0.005864, -0.062577 ], [ -0.020205, -0.026547, -0.019634 ],
1284 [ 0.004291, -0.041290, -0.138181 ], [ 0.023404, -0.010932, -0.044904 ],
1285 [ 0.013557, 0.014823, -0.092943 ], [ 0.059673, -0.031024, -0.095739 ],
1286 [ 0.021130, -0.080607, -0.034594 ], [ 0.024655, -0.035564, 0.003243 ],
1287 [ 0.017106, 0.006952, -0.000308 ], [ 0.075208, -0.030910, -0.031181 ],
1288 [ 0.024965, 0.048632, -0.039448 ], [ 0.057028, 0.021547, -0.009418 ],
1289 [ -0.018577, 0.023697, -0.009759 ], [ 0.024077, 0.033053, 0.024324 ],
1290 [ 0.037052, -0.003436, 0.044530 ], [ -0.012871, -0.007179, 0.031795 ],
1291 [ 0.077877, 0.021547, 0.023131 ], [ 0.053365, 0.052078, 0.029433 ],
1292 [ 0.011429, 0.070426, 0.028734 ], [ -0.001827, 0.033115, 0.061505 ],
1293 [ -0.044870, 0.038568, 0.026239 ], [ 0.061633, 0.034799, 0.059784 ],
1294 [ 0.034261, 0.060342, 0.065185 ], [ 0.058981, 0.082481, 0.047252 ],
1295 [ 0.090008, 0.065942, 0.044470 ], [ 0.066961, 0.073728, -0.000428 ],
1296 [ 0.074763, 0.060293, 0.085632 ], [ 0.066366, 0.103375, 0.079642 ],
1297 [ 0.122297, 0.036558, 0.058745 ], [ 0.111042, 0.092093, 0.085412 ],
1298 [ 0.099243, 0.115476, 0.039254 ], [ 0.019973, 0.122844, 0.050255 ],
1299 [ 0.159571, 0.098965, 0.051740 ], [ 0.137624, 0.072405, -0.006922 ],
1300 [ 0.130240, 0.146091, 0.089698 ], [ 0.138335, 0.092968, 0.136193 ],
1301 [ 0.066031, 0.149304, 0.125476 ], [ 0.202749, 0.145751, 0.077122 ],
1302 [ 0.002224, 0.082811, 0.131200 ], [ 0.124476, 0.178073, 0.162336 ],
1303 [ 0.174722, 0.190298, 0.127106 ], [ 0.202193, 0.153569, 0.163840 ],
1304 [ 0.242604, 0.197796, 0.136929 ], [ 0.185809, 0.229348, 0.193353 ],
1305 [ -0.058814, 0.195178, 0.141821 ], [ 0.253646, 0.247175, 0.205766 ],
1306 [ 0.061433, -0.025542, 0.119311 ], [ -0.057816, 0.082445, 0.073243 ],
1307 [ -0.069239, 0.148678, 0.031146 ], [ -0.030217, -0.008503, 0.106194 ],
1308 [ -0.026708, 0.087469, -0.009589 ], [ -0.090418, 0.000265, 0.056807 ],
1309 [ -0.050607, -0.019383, 0.010494 ], [ -0.079397, 0.008233, -0.011469 ],
1310 [ -0.072634, -0.061165, 0.046917 ], [ -0.075741, -0.072343, -0.007557 ],
1311 [ -0.025162, -0.073363, 0.005173 ], [ -0.123371, -0.041257, -0.008375 ],
1312 [ -0.139904, 0.018285, 0.009920 ], [ -0.143421, -0.104238, 0.033457 ],
1313 [ -0.100923, -0.134400, -0.023257 ], [ -0.157791, -0.095042, -0.036959 ],
1314 [ -0.219890, -0.078637, 0.001815 ], [ -0.183607, -0.023053, -0.043678 ],
1315 [ -0.145303, -0.158923, -0.059045 ], [ -0.197615, -0.165199, 0.028099 ],
1316 [ -0.225131, -0.167756, -0.056401 ], [ -0.216572, -0.104751, -0.102964 ],
1317 [ -0.171336, -0.241967, -0.063404 ], [ -0.134035, -0.205614, 0.011831 ],
1318 [ -0.297116, -0.211173, -0.015352 ], [ -0.086464, -0.200592, -0.070454 ],
1319 [ -0.217777, -0.278403, 0.030398 ], [ -0.236248, -0.323694, -0.087588 ],
1320 [ -0.222074, -0.210785, 0.106210 ], [ -0.283400, -0.097077, 0.041303 ],
1321 [ -0.078417, -0.154464, 0.062956 ], [ -0.214417, -0.100695, 0.121909 ],
1322 [ -0.178576, -0.028847, 0.061042 ], [ -0.037999, -0.144233, -0.010546 ],
1323 [ -0.086695, -0.070996, 0.125282 ], [ 0.010788, -0.085006, 0.058527 ],
1324 [ -0.154015, 0.066560, 0.071038 ], [ -0.143503, 0.033260, 0.154393 ],
1325 [ -0.134069, 0.032420, -0.056293 ], [ -0.110851, 0.086908, 0.003920 ],
1326 [ -0.057254, 0.047674, -0.055571 ], [ -0.214206, 0.068784, -0.004735 ],
1327 [ -0.257264, 0.050468, 0.081702 ], [ -0.291834, 0.004120, -0.022366 ],
1328 [ -0.173309, -0.029081, -0.115901 ], [ -0.207622, 0.168664, 0.136030 ],
1329 [ 0.090541, 0.032754, -0.057330 ], [ 0.140219, -0.000735, -0.015633 ],
1330 [ 0.136697, -0.017163, -0.100909 ], [ 0.029838, -0.089515, -0.147130 ],
1331 [ -0.055367, -0.072683, -0.214015 ], [ 0.048680, -0.057633, -0.212429 ],
1332 [ -0.013134, -0.113898, -0.196403 ], [ -0.071702, -0.159408, -0.254895 ]
1333];
1334
1335const SIPRO_LSF_CB4_16K: [[f32; 4]; 128] = [
1336 [ -0.201277, -0.278679, -0.173262, -0.198580 ],
1337 [ -0.214667, -0.151922, -0.117551, -0.192713 ],
1338 [ -0.160962, -0.207728, -0.124750, -0.129749 ],
1339 [ -0.131043, -0.137818, -0.155281, -0.166308 ],
1340 [ -0.179134, -0.169602, -0.165223, -0.066293 ],
1341 [ -0.136474, -0.177035, -0.250127, -0.134370 ],
1342 [ -0.066970, -0.146274, -0.170638, -0.134436 ],
1343 [ -0.083288, -0.165860, -0.103437, -0.140361 ],
1344 [ -0.130474, -0.119317, -0.124393, -0.086408 ],
1345 [ -0.127609, -0.134415, -0.073592, -0.116103 ],
1346 [ -0.113027, -0.091756, -0.107786, -0.131935 ],
1347 [ -0.125530, -0.182152, -0.093796, -0.045088 ],
1348 [ -0.077122, -0.138052, -0.166271, -0.038886 ],
1349 [ -0.073027, -0.106845, -0.067073, -0.113910 ],
1350 [ -0.049146, -0.107019, -0.112531, -0.063388 ],
1351 [ -0.101539, -0.119586, -0.050297, -0.040670 ],
1352 [ -0.107784, -0.066913, -0.080993, -0.052352 ],
1353 [ -0.152155, -0.103010, -0.090461, -0.015526 ],
1354 [ -0.153087, -0.087656, -0.029889, -0.037367 ],
1355 [ -0.215281, -0.138062, -0.089162, -0.050839 ],
1356 [ -0.053350, -0.060169, -0.063459, -0.024499 ],
1357 [ -0.051674, -0.076355, -0.033733, -0.077211 ],
1358 [ -0.045047, -0.107006, -0.020880, -0.024525 ],
1359 [ -0.083003, -0.063672, -0.013243, -0.028324 ],
1360 [ -0.104104, -0.075450, -0.032746, 0.024480 ],
1361 [ -0.085695, -0.019502, -0.045121, -0.025016 ],
1362 [ -0.123120, -0.030844, -0.003533, -0.016224 ],
1363 [ -0.025568, -0.049172, -0.003911, -0.027522 ],
1364 [ -0.039029, -0.019857, -0.043211, -0.058087 ],
1365 [ -0.040122, -0.023067, -0.001356, 0.008607 ],
1366 [ -0.063351, -0.001776, 0.016015, -0.027088 ],
1367 [ -0.068110, -0.038838, 0.042525, 0.001076 ],
1368 [ -0.043623, -0.020736, -0.047862, 0.037710 ],
1369 [ -0.041052, 0.021954, -0.025660, 0.000758 ],
1370 [ -0.013035, 0.002583, -0.008233, -0.037300 ],
1371 [ -0.005523, -0.014670, 0.019651, -0.012667 ],
1372 [ -0.004409, -0.014437, -0.059412, -0.019701 ],
1373 [ 0.024946, -0.011663, -0.014351, -0.028762 ],
1374 [ 0.012660, 0.018489, -0.010205, 0.012695 ],
1375 [ -0.004423, 0.017827, 0.040544, 0.003629 ],
1376 [ 0.020684, 0.026743, 0.007752, -0.025595 ],
1377 [ 0.032071, 0.000043, 0.026188, -0.006444 ],
1378 [ 0.058793, 0.015820, -0.001119, -0.017415 ],
1379 [ 0.020156, -0.047590, 0.004227, 0.008670 ],
1380 [ 0.054770, 0.032135, 0.029770, -0.009767 ],
1381 [ 0.030884, 0.047757, 0.033068, 0.006866 ],
1382 [ 0.062039, 0.011646, 0.056037, 0.016859 ],
1383 [ 0.013798, -0.028196, 0.060710, 0.014299 ],
1384 [ 0.100043, 0.041445, 0.023379, -0.014889 ],
1385 [ 0.062728, -0.042821, 0.002180, -0.055380 ],
1386 [ 0.061663, 0.018767, -0.015571, -0.074095 ],
1387 [ 0.062980, 0.080497, 0.011808, -0.031787 ],
1388 [ 0.084964, 0.043100, -0.025877, 0.020309 ],
1389 [ 0.014707, 0.035421, -0.041440, -0.053373 ],
1390 [ 0.081268, 0.005791, -0.066290, -0.039825 ],
1391 [ 0.017691, -0.020401, -0.040513, -0.083960 ],
1392 [ 0.120874, 0.055753, -0.025988, -0.059552 ],
1393 [ 0.079912, 0.007894, -0.085380, -0.114587 ],
1394 [ 0.036856, -0.039331, -0.104237, -0.069116 ],
1395 [ 0.008526, -0.064273, -0.048312, -0.038595 ],
1396 [ 0.033461, -0.028956, -0.066505, 0.038722 ],
1397 [ -0.042064, -0.043989, -0.100653, -0.071550 ],
1398 [ -0.015342, -0.064850, -0.065675, -0.122769 ],
1399 [ -0.006581, -0.004919, -0.113564, -0.145753 ],
1400 [ 0.008273, -0.070702, -0.164998, -0.095541 ],
1401 [ -0.001698, -0.063744, -0.129971, -0.011162 ],
1402 [ -0.048471, -0.087500, -0.111006, -0.161823 ],
1403 [ -0.032193, -0.091955, -0.080642, 0.012288 ],
1404 [ -0.095873, -0.015986, -0.072722, -0.101745 ],
1405 [ -0.079477, -0.082060, -0.203008, -0.100297 ],
1406 [ -0.023883, -0.064022, -0.168341, -0.211739 ],
1407 [ -0.070530, -0.103547, -0.123858, 0.055049 ],
1408 [ -0.033503, -0.076812, -0.016287, 0.044159 ],
1409 [ -0.088427, -0.161682, -0.058579, 0.013873 ],
1410 [ -0.083068, -0.168222, -0.016773, -0.080209 ],
1411 [ -0.080548, -0.139090, 0.030544, 0.007171 ],
1412 [ -0.117482, -0.083718, 0.027074, -0.003674 ],
1413 [ -0.163085, -0.156856, -0.012618, -0.022329 ],
1414 [ -0.176540, -0.113042, -0.020148, 0.051770 ],
1415 [ -0.153891, -0.199293, -0.043244, 0.028331 ],
1416 [ -0.107822, -0.150615, 0.016430, 0.092919 ],
1417 [ -0.137676, -0.183224, 0.066026, 0.029343 ],
1418 [ -0.191106, -0.099250, 0.045370, 0.004084 ],
1419 [ -0.237042, -0.130815, -0.022543, -0.029428 ],
1420 [ -0.201014, -0.053591, -0.007305, -0.033547 ],
1421 [ -0.249286, -0.228408, 0.005002, 0.007146 ],
1422 [ -0.206509, -0.211998, -0.061352, -0.047233 ],
1423 [ -0.255702, -0.135114, 0.076375, 0.036630 ],
1424 [ -0.296271, -0.073946, -0.007273, -0.019601 ],
1425 [ -0.302917, -0.175111, -0.070024, -0.043905 ],
1426 [ -0.239275, -0.043962, -0.084982, -0.067446 ],
1427 [ -0.254583, -0.294720, -0.088762, -0.070451 ],
1428 [ -0.205583, -0.238996, -0.124753, 0.033076 ],
1429 [ -0.205583, -0.215882, -0.028472, 0.118679 ],
1430 [ -0.153640, -0.204464, -0.039654, -0.134441 ],
1431 [ -0.145929, -0.191970, -0.175308, 0.021366 ],
1432 [ -0.149348, -0.212569, -0.118324, 0.103812 ],
1433 [ -0.166397, -0.220581, -0.265260, -0.029113 ],
1434 [ -0.164171, -0.231262, -0.258828, 0.061427 ],
1435 [ -0.200198, -0.263453, -0.212016, 0.115359 ],
1436 [ -0.130088, -0.212168, -0.202368, 0.118563 ],
1437 [ -0.206387, -0.078075, -0.227856, -0.111165 ],
1438 [ -0.129605, -0.176848, -0.241584, -0.259900 ],
1439 [ -0.176826, -0.045901, -0.141712, -0.209345 ],
1440 [ -0.351173, -0.031097, -0.133935, -0.182412 ],
1441 [ -0.164232, 0.027006, -0.014039, -0.053567 ],
1442 [ -0.171037, -0.025924, 0.030972, 0.017329 ],
1443 [ -0.080862, -0.021577, 0.007652, 0.063968 ],
1444 [ -0.061788, 0.042024, -0.018783, -0.057979 ],
1445 [ -0.110311, 0.054760, 0.031446, -0.006710 ],
1446 [ -0.136637, 0.022171, 0.084991, 0.028039 ],
1447 [ -0.254471, -0.004376, 0.078034, 0.033649 ],
1448 [ -0.234464, 0.088157, 0.040999, 0.002639 ],
1449 [ -0.037095, 0.059443, 0.072180, 0.015027 ],
1450 [ -0.046841, -0.004813, 0.088266, 0.038786 ],
1451 [ -0.086782, 0.120100, 0.082655, 0.020271 ],
1452 [ -0.118361, -0.069242, 0.094867, 0.039200 ],
1453 [ -0.023342, -0.084303, 0.052684, 0.017093 ],
1454 [ -0.014194, 0.001012, 0.011946, 0.074125 ],
1455 [ -0.015342, 0.076396, 0.022365, -0.028001 ],
1456 [ 0.027706, 0.037047, 0.107573, 0.060815 ],
1457 [ 0.030615, 0.040664, 0.010467, 0.074289 ],
1458 [ 0.038646, 0.115584, 0.069627, 0.007642 ],
1459 [ 0.096463, 0.069818, 0.062494, 0.015413 ],
1460 [ 0.054834, 0.065232, 0.054286, 0.110088 ],
1461 [ 0.152312, 0.092371, 0.026420, -0.013184 ],
1462 [ 0.144264, 0.123438, 0.080131, 0.023233 ],
1463 [ 0.124405, 0.009943, -0.148477, -0.205184 ]
1464];
1465
1466const SIPRO_MEAN_LSF_16K: [f32; 16] = [
1467 0.131554, 0.246615, 0.435896, 0.644419,
1468 0.827810, 1.017876, 1.198910, 1.379159,
1469 1.562157, 1.736908, 1.940719, 2.131963,
1470 2.347162, 2.521521, 2.717870, 2.847068
1471];
1472
1473const SIPRO_POW_0_5: [f32; 16] = [
1474 0.5,
1475 0.25,
1476 0.125,
1477 0.0625,
1478 0.03125,
1479 0.015625,
1480 0.0078125,
1481 0.00390625,
1482 0.001953125,
1483 0.0009765625,
1484 0.00048828125,
1485 0.000244140625,
1486 0.0001220703125,
1487 0.00006103515625,
1488 0.000030517578125,
1489 0.0000152587890625
1490];
1491const SIPRO_POW_0_55: [f32; 10] = [
1492 0.550000, 0.302500, 0.166375, 0.091506, 0.050328,
1493 0.027681, 0.015224, 0.008373, 0.004605, 0.002533
1494];
1495const SIPRO_POW_0_7: [f32; 10] = [
1496 0.700000, 0.490000, 0.343000, 0.240100, 0.168070,
1497 0.117649, 0.082354, 0.057648, 0.040354, 0.028248
1498];
1499const SIPRO_POW_0_75: [f32; 10] = [
1500 0.750000, 0.562500, 0.421875, 0.316406, 0.237305,
1501 0.177979, 0.133484, 0.100113, 0.075085, 0.056314
1502];
1503
1504const SIPRO_GAIN_CB_16K: [f32; 32] = [
1505 0.07499, 0.10593, 0.14125, 0.18836,
1506 0.23714, 0.28184, 0.32734, 0.37584,
1507 0.42170, 0.47315, 0.53088, 0.59566,
1508 0.66834, 0.74989, 0.84140, 0.94406,
1509 1.05925, 1.18850, 1.33352, 1.49624,
1510 1.67880, 1.88365, 2.11349, 2.37137,
1511 2.66073, 3.05492, 3.54813, 4.21697,
1512 5.30884, 7.07946, 9.44061, 13.33521,
1513];
1514const SIPRO_GAIN_CB_LBR: [[f32; 2]; 128] = [
1515 [ 0.035230, 0.161540 ], [ 0.049223, 0.448359 ], [ 0.057443, 0.809043 ],
1516 [ 0.072434, 1.760306 ], [ 0.111491, 0.566418 ], [ 0.112820, 1.098524 ],
1517 [ 0.143493, 0.726856 ], [ 0.144840, 0.347800 ], [ 0.180341, 1.050010 ],
1518 [ 0.188171, 2.197256 ], [ 0.189771, 0.256947 ], [ 0.198260, 0.484678 ],
1519 [ 0.210622, 0.755825 ], [ 0.220694, 0.590788 ], [ 0.237062, 1.322214 ],
1520 [ 0.255175, 0.338710 ], [ 0.298980, 0.919051 ], [ 0.314627, 0.520961 ],
1521 [ 0.337106, 1.469863 ], [ 0.341422, 2.804546 ], [ 0.363257, 0.736222 ],
1522 [ 0.363881, 0.367640 ], [ 0.369850, 1.937934 ], [ 0.370136, 1.075201 ],
1523 [ 0.397152, 0.549410 ], [ 0.426557, 0.876015 ], [ 0.450686, 0.215588 ],
1524 [ 0.468116, 0.671848 ], [ 0.470495, 1.242034 ], [ 0.474180, 1.739845 ],
1525 [ 0.484875, 0.490564 ], [ 0.498917, 0.971238 ], [ 0.530996, 0.785765 ],
1526 [ 0.539768, 2.130689 ], [ 0.546021, 0.589544 ], [ 0.546632, 3.050846 ],
1527 [ 0.552336, 0.389775 ], [ 0.556302, 1.400103 ], [ 0.559688, 1.105421 ],
1528 [ 0.574140, 0.667513 ], [ 0.595547, 0.828943 ], [ 0.597771, 0.496929 ],
1529 [ 0.617079, 1.863075 ], [ 0.619657, 1.221713 ], [ 0.621172, 0.950275 ],
1530 [ 0.628426, 0.630766 ], [ 0.628689, 4.242164 ], [ 0.640899, 1.529846 ],
1531 [ 0.645813, 0.331127 ], [ 0.653056, 0.748168 ], [ 0.662909, 1.077438 ],
1532 [ 0.669505, 2.631114 ], [ 0.681570, 1.839298 ], [ 0.687844, 0.903400 ],
1533 [ 0.688660, 1.270830 ], [ 0.695070, 0.578227 ], [ 0.697926, 0.428440 ],
1534 [ 0.715454, 0.812355 ], [ 0.729981, 1.539357 ], [ 0.737434, 1.106765 ],
1535 [ 0.740241, 2.033374 ], [ 0.740871, 0.568460 ], [ 0.752689, 0.698461 ],
1536 [ 0.756587, 0.893078 ], [ 0.767797, 0.499246 ], [ 0.768516, 3.712434 ],
1537 [ 0.773153, 1.332360 ], [ 0.786125, 1.042996 ], [ 0.788792, 0.238388 ],
1538 [ 0.790861, 2.273229 ], [ 0.795338, 1.582767 ], [ 0.809621, 0.595501 ],
1539 [ 0.821032, 0.756460 ], [ 0.824590, 0.922925 ], [ 0.826019, 1.186793 ],
1540 [ 0.827426, 1.885076 ], [ 0.830080, 6.088666 ], [ 0.837028, 2.819993 ],
1541 [ 0.845561, 1.490623 ], [ 0.848323, 0.410436 ], [ 0.856522, 0.729725 ],
1542 [ 0.862636, 0.966880 ], [ 0.874561, 1.681660 ], [ 0.874751, 1.177630 ],
1543 [ 0.879289, 2.301300 ], [ 0.886671, 0.613068 ], [ 0.896729, 0.781097 ],
1544 [ 0.904777, 3.484111 ], [ 0.906098, 1.330892 ], [ 0.919182, 1.877203 ],
1545 [ 0.919901, 0.569511 ], [ 0.921772, 1.034126 ], [ 0.922439, 0.376000 ],
1546 [ 0.934221, 1.485214 ], [ 0.938842, 0.869135 ], [ 0.939166, 2.378294 ],
1547 [ 0.958933, 1.122722 ], [ 0.959042, 0.694098 ], [ 0.960995, 1.743430 ],
1548 [ 0.970763, 2.884897 ], [ 0.982881, 0.814506 ], [ 0.990141, 1.330022 ],
1549 [ 0.996447, 1.823381 ], [ 1.000013, 0.967498 ], [ 1.000743, 0.480597 ],
1550 [ 1.008020, 5.095226 ], [ 1.013883, 2.105435 ], [ 1.026438, 0.691312 ],
1551 [ 1.027361, 1.558169 ], [ 1.030123, 3.586526 ], [ 1.033916, 1.118036 ],
1552 [ 1.039315, 2.543360 ], [ 1.068596, 0.836380 ], [ 1.081023, 1.318768 ],
1553 [ 1.093150, 2.267843 ], [ 1.095607, 1.712383 ], [ 1.102816, 1.037334 ],
1554 [ 1.103231, 3.536292 ], [ 1.107320, 0.508615 ], [ 1.150000, 7.999000 ],
1555 [ 1.156731, 1.236772 ], [ 1.168428, 2.268084 ], [ 1.184130, 0.775839 ],
1556 [ 1.210609, 1.511840 ], [ 1.220663, 4.365683 ], [ 1.224016, 0.983179 ],
1557 [ 1.252236, 2.778535 ], [ 1.301176, 1.923126 ]
1558];
1559const SIPRO_GAIN_PRED: [f32; 4] = [ 0.200, 0.334, 0.504, 0.691 ];
1560
1561const SIPRO_GAIN_PITCH_CB_16K: [f32; 16] = [
1562 0.00, 0.2, 0.40, 0.5, 0.60, 0.7, 0.75, 0.8,
1563 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2,
1564];
1565const SIPRO_GAIN_DB_CB_16K: [f32; 32] = [
1566 -22.5, -19.5, -17.0, -14.5,
1567 -12.5, -11.0, -9.7, -8.5,
1568 -7.5, -6.5, -5.5, -4.5,
1569 -3.5, -2.5, -1.5, -0.5,
1570 0.5, 1.5, 2.5, 3.5,
1571 4.5, 5.5, 6.5, 7.5,
1572 8.5, 9.7, 11.0, 12.5,
1573 14.5, 17.0, 19.5, 22.5,
1574];
1575
1576const SIPRO_SINC_16K: [f32; 31] = [
1577 0.874475, 0.755101, 0.455962, 0.118807, -0.114223, -0.176778,
1578 -0.101923, 0.015553, 0.086555, 0.078193, 0.018660, -0.037513,
1579 -0.052733, -0.027459, 0.009967, 0.030278, 0.024050, 0.003055,
1580 -0.013862, -0.016162, -0.006725, 0.004212, 0.008634, 0.005721,
1581 -0.000000, -0.003710, -0.003690, -0.001228, 0.001409, 0.002610,
1582 0.0
1583];
1584const SIPRO_SINC_LBR: [f32; 61] = [
1585 0.89852900, 0.86505100, 0.76925700, 0.62405400, 0.44863900, 0.265289000,
1586 0.09591670, -0.04125980, -0.13433800, -0.17898600, -0.17852800, -0.142609000,
1587 -0.08493040, -0.02050780, 0.03695680, 0.07739260, 0.09552000, 0.091278100,
1588 0.06893920, 0.03570560, 0.0 , -0.03054810, -0.05041500, -0.057006800,
1589 -0.05084230, -0.03500370, -0.01416020, 0.00665283, 0.02307130, 0.032348600,
1590 0.03353880, 0.02758790, 0.01678470, 0.00411987, -0.00747681, -0.015686000,
1591 -0.01934810, -0.01837160, -0.01376340, -0.00704956, 0.0 , 0.005828860,
1592 0.00939941, 0.01037600, 0.00903320, 0.00604248, 0.00238037, -0.001098630,
1593 -0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834,
1594 0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.001159670,
1595 0.0
1596];