Skip to content

Commit b870e5c

Browse files
committed
refactor: make silk_NLSF2A_find_poly safe
1 parent 868e8f4 commit b870e5c

File tree

2 files changed

+43
-44
lines changed

2 files changed

+43
-44
lines changed

src/silk/NLSF2A.rs

Lines changed: 31 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,35 @@ use crate::silk::define::MAX_LPC_STABILIZE_ITERATIONS;
33
use crate::silk::table_LSF_cos::silk_LSFCosTab_FIX_Q12;
44
use crate::silk::LPC_fit::silk_LPC_fit;
55
use crate::silk::LPC_inv_pred_gain::silk_LPC_inverse_pred_gain_c;
6+
use crate::silk::SigProc_FIX::{silk_RSHIFT_ROUND64, SILK_MAX_ORDER_LPC};
67

78
pub const QA: i32 = 16;
9+
10+
/// helper function for NLSF2A(..)
11+
///
12+
/// ```text
13+
/// out O intermediate polynomial, QA [dd+1]
14+
/// cLSF I vector of interleaved 2*cos(LSFs), QA [d]
15+
/// dd I polynomial order (= 1/2 * filter order)
16+
/// ```
817
#[inline]
9-
unsafe fn silk_NLSF2A_find_poly(out: *mut i32, cLSF: *const i32, dd: i32) {
10-
let mut k: i32 = 0;
11-
let mut n: i32 = 0;
12-
let mut ftmp: i32 = 0;
13-
*out.offset(0 as isize) = ((1) << 16) as i32;
14-
*out.offset(1 as isize) = -*cLSF.offset(0 as isize);
15-
k = 1;
16-
while k < dd {
17-
ftmp = *cLSF.offset((2 * k) as isize);
18-
*out.offset((k + 1) as isize) = ((*out.offset((k - 1) as isize) as u32) << 1) as i32
19-
- (if 16 == 1 {
20-
(ftmp as i64 * *out.offset(k as isize) as i64 >> 1)
21-
+ (ftmp as i64 * *out.offset(k as isize) as i64 & 1)
22-
} else {
23-
(ftmp as i64 * *out.offset(k as isize) as i64 >> 16 - 1) + 1 >> 1
24-
}) as i32;
25-
n = k;
26-
while n > 1 {
27-
let ref mut fresh0 = *out.offset(n as isize);
28-
*fresh0 += *out.offset((n - 2) as isize)
29-
- (if 16 == 1 {
30-
(ftmp as i64 * *out.offset((n - 1) as isize) as i64 >> 1)
31-
+ (ftmp as i64 * *out.offset((n - 1) as isize) as i64 & 1)
32-
} else {
33-
(ftmp as i64 * *out.offset((n - 1) as isize) as i64 >> 16 - 1) + 1 >> 1
34-
}) as i32;
35-
n -= 1;
18+
fn silk_NLSF2A_find_poly(out: &mut [i32], cLSF: &[i32]) {
19+
let d = cLSF.len();
20+
let dd = d / 2;
21+
assert_eq!(out.len(), dd + 1);
22+
23+
out[0] = 1 << QA;
24+
out[1] = -cLSF[0];
25+
26+
for k in 1..dd {
27+
let ftmp = cLSF[2 * k]; /* QA */
28+
out[k + 1] = out[k - 1] * 2 - silk_RSHIFT_ROUND64(ftmp as i64 * out[k] as i64, QA) as i32;
29+
30+
for n in (2..=k).rev() {
31+
out[n] += out[n - 2] - silk_RSHIFT_ROUND64(ftmp as i64 * out[n - 1] as i64, QA) as i32;
3632
}
37-
let ref mut fresh1 = *out.offset(1 as isize);
38-
*fresh1 -= ftmp;
39-
k += 1;
33+
34+
out[1] -= ftmp;
4035
}
4136
}
4237

@@ -48,16 +43,16 @@ pub unsafe fn silk_NLSF2A(a_Q12: *mut i16, NLSF: *const i16, d: i32, _arch: i32)
4843
let mut k: i32 = 0;
4944
let mut i: i32 = 0;
5045
let mut dd: i32 = 0;
51-
let mut cos_LSF_QA: [i32; 24] = [0; 24];
52-
let mut P: [i32; 13] = [0; 13];
53-
let mut Q: [i32; 13] = [0; 13];
46+
let mut cos_LSF_QA: [i32; SILK_MAX_ORDER_LPC] = [0; 24];
47+
let mut P: [i32; SILK_MAX_ORDER_LPC / 2 + 1] = [0; 13];
48+
let mut Q: [i32; SILK_MAX_ORDER_LPC / 2 + 1] = [0; 13];
5449
let mut Ptmp: i32 = 0;
5550
let mut Qtmp: i32 = 0;
5651
let mut f_int: i32 = 0;
5752
let mut f_frac: i32 = 0;
5853
let mut cos_val: i32 = 0;
5954
let mut delta: i32 = 0;
60-
let mut a32_QA1: [i32; 24] = [0; 24];
55+
let mut a32_QA1: [i32; SILK_MAX_ORDER_LPC] = [0; 24];
6156
assert!(d == 10 || d == 16);
6257
ordering = if d == 16 {
6358
ordering16.as_ptr()
@@ -79,16 +74,8 @@ pub unsafe fn silk_NLSF2A(a_Q12: *mut i16, NLSF: *const i16, d: i32, _arch: i32)
7974
k += 1;
8075
}
8176
dd = d >> 1;
82-
silk_NLSF2A_find_poly(
83-
P.as_mut_ptr(),
84-
&mut *cos_LSF_QA.as_mut_ptr().offset(0 as isize),
85-
dd,
86-
);
87-
silk_NLSF2A_find_poly(
88-
Q.as_mut_ptr(),
89-
&mut *cos_LSF_QA.as_mut_ptr().offset(1 as isize),
90-
dd,
91-
);
77+
silk_NLSF2A_find_poly(&mut P[..dd as usize + 1], &cos_LSF_QA[..d as usize]);
78+
silk_NLSF2A_find_poly(&mut Q[..dd as usize + 1], &cos_LSF_QA[1..][..d as usize]);
9279
k = 0;
9380
while k < dd {
9481
Ptmp = P[(k + 1) as usize] + P[k as usize];

src/silk/SigProc_FIX.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/// max order of the LPC analysis in schur() and k2a()
2+
pub const SILK_MAX_ORDER_LPC: usize = 24;
3+
14
#[inline]
25
pub fn silk_ROR32(a32: i32, rot: i32) -> i32 {
36
let x: u32 = a32 as u32;
@@ -44,6 +47,15 @@ pub fn silk_RSHIFT_ROUND(a: i32, shift: i32) -> i32 {
4447
}
4548
}
4649

50+
#[inline]
51+
pub fn silk_RSHIFT_ROUND64(a: i64, shift: i32) -> i64 {
52+
if shift == 1 {
53+
((a) >> 1) + ((a) & 1)
54+
} else {
55+
(((a) >> ((shift) - 1)) + 1) >> 1
56+
}
57+
}
58+
4759
#[inline]
4860
pub fn silk_SAT16(a: i32) -> i32 {
4961
if a > i16::MAX as i32 {

0 commit comments

Comments
 (0)