@@ -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