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