Skip to content

Commit 2197ee8

Browse files
committed
Simplify fft's API
1 parent 200d3fa commit 2197ee8

File tree

5 files changed

+196
-211
lines changed

5 files changed

+196
-211
lines changed

fft/src/fftwrap.rs

+80-34
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use crate::smallft::*;
2-
31
/* Copyright (C) 2005-2006 Jean-Marc Valin
42
File: fftwrap.c
53
@@ -33,46 +31,94 @@ use crate::smallft::*;
3331
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3432
3533
*/
36-
pub fn spx_fft_init(size: usize) -> DrftLookup {
37-
DrftLookup::new(size)
34+
35+
use crate::smallft::*;
36+
37+
#[derive(Clone)]
38+
pub struct DrftLookup {
39+
pub n: usize,
40+
pub trigcache: Vec<f32>,
41+
pub splitcache: Vec<i32>,
3842
}
3943

40-
pub fn spx_fft(table: &mut DrftLookup, in_0: &mut [f32], out: &mut [f32]) {
41-
let scale = (1.0f64 / table.n as f64) as f32;
42-
if in_0 == out {
43-
eprintln!("FFT should not be done in-place");
44+
impl DrftLookup {
45+
pub fn new(n: usize) -> Self {
46+
let mut drft = Self {
47+
n: n,
48+
trigcache: vec![0.0; 3 * n],
49+
splitcache: vec![0; 32],
50+
};
51+
52+
fdrffti(n, &mut drft.trigcache, &mut drft.splitcache);
53+
54+
drft
4455
}
4556

46-
out.iter_mut()
47-
.zip(in_0.iter())
48-
.take(table.n as usize)
49-
.for_each(|(o, i)| *o = scale * *i);
57+
pub fn spx_fft(&mut self, in_0: &[f32], out: &mut [f32]) {
58+
let scale = (1.0f64 / self.n as f64) as f32;
59+
if in_0 == out {
60+
eprintln!("FFT should not be done in-place");
61+
}
5062

51-
spx_drft_forward(table, out);
52-
}
63+
out.iter_mut()
64+
.zip(in_0.iter())
65+
.take(self.n as usize)
66+
.for_each(|(o, i)| *o = scale * *i);
5367

54-
pub fn spx_ifft(table: &mut DrftLookup, in_0: &mut [f32], out: &mut [f32]) {
55-
if in_0 == out {
56-
eprintln!("FFT should not be done in-place");
57-
} else {
58-
out.copy_from_slice(&in_0[..table.n as usize]);
68+
self.spx_drft_forward(out);
5969
}
6070

61-
spx_drft_backward(table, out);
62-
}
71+
pub fn spx_ifft(&mut self, in_0: &[f32], out: &mut [f32]) {
72+
if in_0 == out {
73+
eprintln!("FFT should not be done in-place");
74+
} else {
75+
out.copy_from_slice(&in_0[..self.n as usize]);
76+
}
6377

64-
pub fn spx_fft_float(
65-
table: &mut DrftLookup,
66-
in_0: &mut [f32],
67-
out: &mut [f32],
68-
) {
69-
spx_fft(table, in_0, out);
70-
}
78+
self.spx_drft_backward(out);
79+
}
80+
81+
pub fn spx_fft_float(&mut self, in_0: &[f32], out: &mut [f32]) {
82+
self.spx_fft(in_0, out);
83+
}
84+
85+
pub fn spx_ifft_float(&mut self, in_0: &[f32], out: &mut [f32]) {
86+
self.spx_ifft(in_0, out);
87+
}
88+
89+
pub fn spx_drft_forward(&mut self, data: &mut [f32]) {
90+
if self.n == 1 {
91+
return;
92+
}
93+
94+
let mut trigcache_temp = self.trigcache[self.n as usize..].to_vec();
95+
96+
drftf1(
97+
self.n as i32,
98+
data,
99+
&mut self.trigcache,
100+
&mut trigcache_temp,
101+
&mut self.splitcache,
102+
);
71103

72-
pub fn spx_ifft_float(
73-
table: &mut DrftLookup,
74-
in_0: &mut [f32],
75-
out: &mut [f32],
76-
) {
77-
spx_ifft(table, in_0, out);
104+
self.trigcache[self.n as usize..].copy_from_slice(&trigcache_temp);
105+
}
106+
107+
pub fn spx_drft_backward(&mut self, data: &mut [f32]) {
108+
if self.n == 1 {
109+
return;
110+
}
111+
112+
let mut trigcache_temp = self.trigcache[self.n as usize..].to_vec();
113+
114+
drftb1(
115+
self.n as i32,
116+
data,
117+
&mut self.trigcache,
118+
&mut trigcache_temp,
119+
&mut self.splitcache,
120+
);
121+
122+
self.trigcache[self.n as usize..].copy_from_slice(&trigcache_temp);
123+
}
78124
}

fft/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,3 @@ mod fftwrap;
44
mod smallft;
55

66
pub use crate::fftwrap::*;
7-
pub use crate::smallft::*;

fft/src/smallft.rs

+4-61
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,6 @@
11
use crate::dradb::*;
22
use crate::dradf::*;
33

4-
#[derive(Clone)]
5-
pub struct DrftLookup {
6-
pub n: usize,
7-
pub trigcache: Vec<f32>,
8-
pub splitcache: Vec<i32>,
9-
}
10-
11-
impl DrftLookup {
12-
pub fn new(n: usize) -> Self {
13-
let mut drft = Self {
14-
n: n,
15-
trigcache: vec![0.0; 3 * n],
16-
splitcache: vec![0; 32],
17-
};
18-
19-
fdrffti(n, &mut drft.trigcache, &mut drft.splitcache);
20-
21-
drft
22-
}
23-
}
24-
254
#[inline(always)]
265
fn drfti1_c_10244(ifac: &mut [i32], n: i32, nf: &mut i32) {
276
const NTRYH: [i32; 4] = [4, 2, 3, 5];
@@ -62,7 +41,7 @@ fn drfti1_c_10244(ifac: &mut [i32], n: i32, nf: &mut i32) {
6241
}
6342
}
6443

65-
fn drfti1(wa: &mut [f32], ifac: &mut [i32]) {
44+
pub(crate) fn drfti1(wa: &mut [f32], ifac: &mut [i32]) {
6645
const TPI: f32 = 6.283_185_307_179_586_48;
6746

6847
let n = wa.len() as i32;
@@ -112,7 +91,7 @@ fn drfti1(wa: &mut [f32], ifac: &mut [i32]) {
11291
}
11392
}
11493

115-
fn fdrffti(n: usize, wsave: &mut [f32], ifac: &mut [i32]) {
94+
pub(crate) fn fdrffti(n: usize, wsave: &mut [f32], ifac: &mut [i32]) {
11695
if n == 1 {
11796
return;
11897
}
@@ -152,7 +131,7 @@ fn drftf1_l102(
152131
}
153132
}
154133

155-
fn drftf1(
134+
pub(crate) fn drftf1(
156135
n: i32,
157136
c: &mut [f32],
158137
ch: &mut [f32],
@@ -254,7 +233,7 @@ fn drftb1_l102(
254233
}
255234
}
256235

257-
fn drftb1(
236+
pub(crate) fn drftb1(
258237
n: i32,
259238
c: &mut [f32],
260239
ch: &mut [f32],
@@ -312,42 +291,6 @@ fn drftb1(
312291
c[..n as usize].copy_from_slice(&ch[..n as usize]);
313292
}
314293

315-
pub fn spx_drft_forward(l: &mut DrftLookup, data: &mut [f32]) {
316-
if l.n == 1 {
317-
return;
318-
}
319-
320-
let mut trigcache_temp = l.trigcache[l.n as usize..].to_vec();
321-
322-
drftf1(
323-
l.n as i32,
324-
data,
325-
&mut l.trigcache,
326-
&mut trigcache_temp,
327-
&mut l.splitcache,
328-
);
329-
330-
l.trigcache[l.n as usize..].copy_from_slice(&trigcache_temp);
331-
}
332-
333-
pub fn spx_drft_backward(l: &mut DrftLookup, data: &mut [f32]) {
334-
if l.n == 1 {
335-
return;
336-
}
337-
338-
let mut trigcache_temp = l.trigcache[l.n as usize..].to_vec();
339-
340-
drftb1(
341-
l.n as i32,
342-
data,
343-
&mut l.trigcache,
344-
&mut trigcache_temp,
345-
&mut l.splitcache,
346-
);
347-
348-
l.trigcache[l.n as usize..].copy_from_slice(&trigcache_temp);
349-
}
350-
351294
#[cfg(test)]
352295
mod tests {
353296
use super::*;

0 commit comments

Comments
 (0)