Skip to content

Commit 2843504

Browse files
committed
Unroll loop in interpolate
Speed up about 10%
1 parent dc20bdb commit 2843504

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

src/sinc.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,45 @@ impl Converter {
110110

111111
#[inline]
112112
fn interpolate(&self) -> f64 {
113-
let coef = self.pos;
114113
let mut interp = 0.0;
115114
let pos_max = self.filter.len() - 1;
116-
for (i, s) in self.buf.iter().enumerate() {
117-
let index = i as f64 - self.half_order;
118-
let pos = (coef - index).abs() * self.quan;
119-
let pos_n = pos as usize;
120-
if pos_n < pos_max {
121-
let h1 = self.filter[pos_n];
122-
let h2 = self.filter[pos_n + 1];
123-
let h = h1 + (h2 - h1) * (pos - pos_n as f64);
124-
interp += s * h;
115+
let taps = self.buf.len();
116+
let iter_count = taps / 2;
117+
let mut left;
118+
let mut right;
119+
if taps % 2 == 1 {
120+
let pos = self.pos * self.quan;
121+
let posu = pos as usize;
122+
let h1 = self.filter[posu];
123+
let h2 = self.filter[posu + 1];
124+
let h = h1 + (h2 - h1) * (pos - posu as f64);
125+
interp += self.buf[iter_count] * h;
126+
left = iter_count - 1;
127+
right = iter_count + 1;
128+
} else {
129+
left = iter_count - 1;
130+
right = iter_count;
131+
}
132+
let coef = self.pos + self.half_order;
133+
for _ in 0..iter_count {
134+
let pos1 = (coef - left as f64).abs() * self.quan;
135+
let pos2 = (coef - right as f64).abs() * self.quan;
136+
let pos1u = pos1 as usize;
137+
let pos2u = pos2 as usize;
138+
if pos1u < pos_max {
139+
let h1 = self.filter[pos1u];
140+
let h2 = self.filter[pos1u + 1];
141+
let h = h1 + (h2 - h1) * (pos1 - pos1u as f64);
142+
interp += self.buf[left] * h;
143+
}
144+
if pos2u < pos_max {
145+
let h1 = self.filter[pos2u];
146+
let h2 = self.filter[pos2u + 1];
147+
let h = h1 + (h2 - h1) * (pos2 - pos2u as f64);
148+
interp += self.buf[right] * h;
125149
}
150+
left = left.wrapping_sub(1);
151+
right = right.wrapping_add(1);
126152
}
127153
interp
128154
}

0 commit comments

Comments
 (0)