Skip to content

Commit 3f3b62a

Browse files
committed
v4.1: fix rfft normalization
1 parent 9840bde commit 3f3b62a

File tree

4 files changed

+52
-13
lines changed

4 files changed

+52
-13
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Released
22
--------
33

4+
0.4.1 - 23 June 2023
5+
===================
6+
7+
Bugfix
8+
-------
9+
- Fixed normalization of rfft for inputs with odd number of elements
10+
411
0.4 - 15 March 2023
512
===================
613

Cargo.lock

Lines changed: 16 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ndrustfft"
3-
version = "0.4.0"
3+
version = "0.4.1"
44
authors = ["preiter <phil.reiter93@gmail.com>"]
55
edition = "2018"
66
description = "N-dimensional FFT, real-to-complex FFT and real-to-real DCT"

src/lib.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ impl<T: FftNum> R2cFftHandler<T> {
497497
buffer.clone_from_slice(data);
498498
match self.norm {
499499
Normalization::None => (),
500-
Normalization::Default => Self::norm_default(&mut buffer),
500+
Normalization::Default => Self::norm_default(&mut buffer, self.n),
501501
Normalization::Custom(f) => f(&mut buffer),
502502
}
503503
// First element must be real
@@ -509,8 +509,8 @@ impl<T: FftNum> R2cFftHandler<T> {
509509
self.plan_bwd.process(&mut buffer, out).unwrap();
510510
}
511511

512-
fn norm_default(data: &mut [Complex<T>]) {
513-
let n = T::one() / T::from_usize((data.len() - 1) * 2).unwrap();
512+
fn norm_default(data: &mut [Complex<T>], size: usize) {
513+
let n = T::one() / T::from_usize(size).unwrap();
514514
for d in data.iter_mut() {
515515
d.re = d.re * n;
516516
d.im = d.im * n;
@@ -1080,6 +1080,31 @@ mod test {
10801080
approx_eq(&v, &solution_numpy_last_elem);
10811081
}
10821082

1083+
#[test]
1084+
fn test_fft_r2c_odd() {
1085+
// Setup
1086+
let mut v = array![[1., 2., 3.], [4., 5., 6.], [7., 8., 9.],];
1087+
let v_copy = v.clone();
1088+
let (nx, ny) = (v.shape()[0], v.shape()[1]);
1089+
let mut vhat = Array2::<Complex<f64>>::zeros((nx, ny / 2 + 1));
1090+
let mut handler = R2cFftHandler::<f64>::new(ny);
1091+
1092+
// Transform
1093+
ndfft_r2c(&v, &mut vhat, &mut handler, 1);
1094+
ndifft_r2c(&vhat, &mut v, &mut handler, 1);
1095+
1096+
// Assert
1097+
approx_eq(&v, &v_copy);
1098+
1099+
// Transform Par
1100+
let mut v = array![[1., 2., 3.], [4., 5., 6.], [7., 8., 9.],];
1101+
ndfft_r2c_par(&v, &mut vhat, &mut handler, 1);
1102+
ndifft_r2c_par(&vhat, &mut v, &mut handler, 1);
1103+
1104+
// // Assert
1105+
approx_eq(&v, &v_copy);
1106+
}
1107+
10831108
#[test]
10841109
fn test_dct1() {
10851110
// Solution from scipy.fft.dct(x, type=1)

0 commit comments

Comments
 (0)