@@ -153,27 +153,38 @@ impl<T: Float + FromPrimitive> SimpleFFT<T> {
153153 }
154154
155155 /// Perform a forward FFT
156- pub fn fft ( & self , time : & [ Complex < T > ] , freq : & mut [ Complex < T > ] ) {
156+ pub fn fft ( & mut self , time : & [ Complex < T > ] , freq : & mut [ Complex < T > ] ) {
157157 let size = self . working . len ( ) ;
158158 if size <= 1 {
159159 if size == 1 {
160160 freq[ 0 ] = time[ 0 ] ;
161161 }
162162 return ;
163163 }
164- self . fft_pass :: < false > ( size, 1 , time, freq, & mut self . working . clone ( ) ) ;
164+ let working_size = self . working . len ( ) ;
165+ let working_mut = & mut self . working ;
166+ Self :: fft_pass :: < false > (
167+ working_size,
168+ & self . twiddles ,
169+ size,
170+ 1 ,
171+ time,
172+ freq,
173+ working_mut) ;
165174 }
166175
167176 /// Perform an inverse FFT
168- pub fn ifft ( & self , freq : & [ Complex < T > ] , time : & mut [ Complex < T > ] ) {
177+ pub fn ifft ( & mut self , freq : & [ Complex < T > ] , time : & mut [ Complex < T > ] ) {
169178 let size = self . working . len ( ) ;
170179 if size <= 1 {
171180 if size == 1 {
172181 time[ 0 ] = freq[ 0 ] ;
173182 }
174183 return ;
175184 }
176- self . fft_pass :: < true > ( size, 1 , freq, time, & mut self . working . clone ( ) ) ;
185+ let working_size = self . working . len ( ) ;
186+ let working_mut = & mut self . working ;
187+ Self :: fft_pass :: < true > ( working_size, & self . twiddles , size, 1 , freq, time, working_mut) ;
177188 }
178189
179190 /// Perform a forward FFT with split complex representation
@@ -213,8 +224,9 @@ impl<T: Float + FromPrimitive> SimpleFFT<T> {
213224 }
214225
215226 // Internal implementation of FFT pass
216- fn fft_pass < const INVERSE : bool > (
217- & self ,
227+ fn fft_pass < const INVERSE : bool > (
228+ orignal_working_size : usize ,
229+ twiddles : & [ Complex < T > ] ,
218230 size : usize ,
219231 stride : usize ,
220232 input : & [ Complex < T > ] ,
@@ -223,15 +235,15 @@ impl<T: Float + FromPrimitive> SimpleFFT<T> {
223235 ) {
224236 if size / 4 > 1 {
225237 // Calculate four quarter-size FFTs
226- self . fft_pass :: < INVERSE > ( size / 4 , stride * 4 , input, working, output) ;
227- self . combine4 :: < INVERSE > ( size, stride, working, output) ;
238+ Self :: fft_pass :: < INVERSE > ( orignal_working_size , twiddles , size / 4 , stride * 4 , input, working, output) ;
239+ Self :: combine4 :: < INVERSE > ( orignal_working_size , twiddles , size, stride, working, output) ;
228240 } else if size == 4 {
229- self . combine4 :: < INVERSE > ( 4 , stride, input, output) ;
241+ Self :: combine4 :: < INVERSE > ( orignal_working_size , twiddles , 4 , stride, input, output) ;
230242 } else {
231243 // 2-point FFT
232244 for s in 0 ..stride {
233- let a = input[ s] ;
234245 let b = input[ s + stride] ;
246+ let a = input[ s] ;
235247 output[ s] = a + b;
236248 output[ s + stride] = a - b;
237249 }
@@ -282,18 +294,19 @@ impl<T: Float + FromPrimitive> SimpleFFT<T> {
282294
283295 // Combine interleaved results into a single spectrum
284296 fn combine4 < const INVERSE : bool > (
285- & self ,
297+ working_buf_len : usize ,
298+ twiddles : & [ Complex < T > ] ,
286299 size : usize ,
287300 stride : usize ,
288301 input : & [ Complex < T > ] ,
289302 output : & mut [ Complex < T > ] ,
290303 ) {
291- let twiddle_step = self . working . len ( ) / size;
304+ let twiddle_step = working_buf_len / size;
292305
293306 for i in 0 ..size / 4 {
294- let twiddle_b = self . twiddles [ i * twiddle_step] ;
295- let twiddle_c = self . twiddles [ i * 2 * twiddle_step] ;
296- let twiddle_d = self . twiddles [ i * 3 * twiddle_step] ;
307+ let twiddle_b = twiddles[ i * twiddle_step] ;
308+ let twiddle_c = twiddles[ i * 2 * twiddle_step] ;
309+ let twiddle_d = twiddles[ i * 3 * twiddle_step] ;
297310
298311 let input_a = & input[ 4 * i * stride..] ;
299312 let input_b = & input[ ( 4 * i + 1 ) * stride..] ;
@@ -610,7 +623,7 @@ impl<T: Float+ FromPrimitive> Pow2FFT<T> {
610623 }
611624
612625 /// Perform a forward FFT
613- pub fn fft ( & self , time : & [ Complex < T > ] , freq : & mut [ Complex < T > ] ) {
626+ pub fn fft ( & mut self , time : & [ Complex < T > ] , freq : & mut [ Complex < T > ] ) {
614627 self . simple_fft . fft ( time, freq) ;
615628 }
616629
@@ -620,7 +633,7 @@ impl<T: Float+ FromPrimitive> Pow2FFT<T> {
620633 }
621634
622635 /// Perform an inverse FFT
623- pub fn ifft ( & self , freq : & [ Complex < T > ] , time : & mut [ Complex < T > ] ) {
636+ pub fn ifft ( & mut self , freq : & [ Complex < T > ] , time : & mut [ Complex < T > ] ) {
624637 self . simple_fft . ifft ( freq, time) ;
625638 }
626639
@@ -680,7 +693,7 @@ mod tests {
680693 #[ test]
681694 fn test_simple_fft ( ) {
682695 // Create a 4-point FFT
683- let fft = SimpleFFT :: < f32 > :: new ( 4 ) ;
696+ let mut fft = SimpleFFT :: < f32 > :: new ( 4 ) ;
684697
685698 // Create input and output buffers
686699 let input = vec ! [
0 commit comments