Skip to content

Commit 763b4d5

Browse files
committed
Use Twiddles iter for untangling step in R2C FFT
1 parent 0c10592 commit 763b4d5

1 file changed

Lines changed: 13 additions & 11 deletions

File tree

‎src/fft.rs‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use std::simd::prelude::f64x8;
33

44
use crate::planner::{Planner32, Planner64};
55
use crate::{
6-
fft_32_with_opts_and_plan, fft_64, fft_64_with_opts_and_plan, twiddles::generate_twiddles,
6+
fft_32_with_opts_and_plan, fft_64, fft_64_with_opts_and_plan,
7+
twiddles::{generate_twiddles, Twiddles},
78
Direction, Options,
89
};
910

@@ -60,19 +61,21 @@ macro_rules! impl_r2c_fft {
6061
let (mut z_even, mut z_odd): (Vec<_>, Vec<_>) =
6162
input_re.chunks_exact(2).map(|c| (c[0], c[1])).unzip();
6263

63-
let mut planner = <$planner>::new(big_n, Direction::Forward);
64+
// let mut planner = <$planner>::new(big_n, Direction::Forward);
6465

6566
// save these for the untanngling step
66-
let twiddle_re = planner.twiddles_re;
67-
let twiddle_im = planner.twiddles_im;
67+
// let twiddle_re = planner.twiddles_re;
68+
// let twiddle_im = planner.twiddles_im;
69+
let stride = big_n / 2;
70+
let twiddles_iter = Twiddles::<$precision>::new(stride);
6871

69-
planner = <$planner>::new(big_n / 2, Direction::Forward);
72+
let planner = <$planner>::new(big_n / 2, Direction::Forward);
7073

7174
// We only need (N / 2) / 2 twiddle factors for the actual FFT call, so we filter
7275
// filter_twiddles(&mut planner.twiddles_re, &mut planner.twiddles_im);
7376

7477
let opts = Options::guess_options(z_even.len());
75-
$fft_w_opts_and_plan(&mut z_even, &mut z_odd, &opts, &mut planner);
78+
$fft_w_opts_and_plan(&mut z_even, &mut z_odd, &opts, &planner);
7679

7780
// Z = np.fft.fft(z)
7881
let mut z_x_re = vec![0.0; big_n / 2];
@@ -135,19 +138,18 @@ macro_rules! impl_r2c_fft {
135138
.zip(z_x_im.iter())
136139
.zip(z_y_re.iter())
137140
.zip(z_y_im.iter())
138-
.zip(twiddle_re.iter())
139-
.zip(twiddle_im.iter())
140141
.zip(output_re_first_half)
141142
.zip(output_im_first_half)
142143
.zip(output_re_second_half)
143144
.zip(output_im_second_half)
145+
.zip(twiddles_iter)
144146
.for_each(
145147
|(
146148
(
147-
(((((((zx_re, zx_im), zy_re), zy_im), w_re), w_im), o_re_fh), o_im_fh),
148-
o_re_sh,
149+
((((((zx_re, zx_im), zy_re), zy_im), o_re_fh), o_im_fh), o_re_sh),
150+
o_im_sh,
149151
),
150-
o_im_sh,
152+
(w_re, w_im),
151153
)| {
152154
let wz_re = w_re * zy_re - w_im * zy_im;
153155
let wz_im = w_re * zy_im + w_im * zy_re;

0 commit comments

Comments
 (0)