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