Skip to content

Commit f1fbe97

Browse files
authored
Merge pull request #2 from maor1993/master
add support to get magnitude response of filter
2 parents 6c40def + 9904dba commit f1fbe97

4 files changed

Lines changed: 292 additions & 124 deletions

File tree

examples/fft_example.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ fn complex_fft_example() {
2121
println!("\nComplex FFT Example:");
2222

2323
// Create a new FFT instance for size 1024
24-
let fft = SimpleFFT::<f32>::new(1024);
24+
let mut fft = SimpleFFT::<f32>::new(1024);
2525

2626
// Input and output buffers
2727
let mut time_domain = vec![Complex::new(0.0, 0.0); 1024];

src/fft.rs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)