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