Skip to content

Commit 32ac5f5

Browse files
committed
Unroll sinc interpolate
1 parent dc20bdb commit 32ac5f5

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

src/sinc.rs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,44 @@ impl Converter {
113113
let coef = self.pos;
114114
let mut interp = 0.0;
115115
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;
116+
let order = self.buf.len();
117+
let iter_count = order / 2;
118+
let mut left;
119+
let mut right;
120+
if order % 2 == 1 {
121+
let pos = coef * self.quan;
122+
let posu = pos as usize;
123+
let h1 = self.filter[posu];
124+
let h2 = self.filter[posu + 1];
125+
let h = h1 + (h2 - h1) * (pos - posu as f64);
126+
interp += self.buf[iter_count] * h;
127+
left = iter_count - 1;
128+
right = iter_count + 1;
129+
} else {
130+
left = iter_count - 1;
131+
right = iter_count;
132+
}
133+
for _ in 0..iter_count {
134+
let idx1 = left as f64 - self.half_order;
135+
let idx2 = right as f64 - self.half_order;
136+
let pos1 = (coef - idx1) * self.quan;
137+
let pos2 = (idx2 - coef) * self.quan;
138+
let pos1u = pos1 as usize;
139+
let pos2u = pos2 as usize;
140+
if pos1u < pos_max {
141+
let h1 = self.filter[pos1u];
142+
let h2 = self.filter[pos1u + 1];
143+
let h = h1 + (h2 - h1) * (pos1 - pos1u as f64);
144+
interp += self.buf[left] * h;
145+
}
146+
if pos2u < pos_max {
147+
let h1 = self.filter[pos2u];
148+
let h2 = self.filter[pos2u + 1];
149+
let h = h1 + (h2 - h1) * (pos2 - pos2u as f64);
150+
interp += self.buf[right] * h;
125151
}
152+
left = left.wrapping_sub(1);
153+
right = right.wrapping_add(1);
126154
}
127155
interp
128156
}

0 commit comments

Comments
 (0)