Hello!
Suppose I have a tensor of shape [N,]
with real entries. Then, np.fft.rfft(x)
and torch.rfft(x)
produce the same output (i.e. they are np.allclose
).
However, taking the respective irfft
s of both of these FFTs return different outputs. Firstly, the two outputs are of different shapes. Secondly, the values are different: comparing them with np.allclose
fails: in fact, not a single pair of values in their Cartesian product are close. I’ve attached a minimal reproducible example below.
I’m not sure what I’m doing wrong here: any help would be appreciated! Thanks!
import numpy as np
import torch
import itertools
x = np.random.randn(100).astype(np.float32)
# IFFT(FFT(x)) == x
fft_np = np.fft.rfft(x)
ifft_np = np.fft.irfft(fft_np)
assert np.allclose(x, ifft_np)
# Same thing but in PyTorch
x = torch.tensor(x)
fft_torch = torch.rfft(x, signal_ndim=1)
ifft_torch = torch.irfft(fft_torch, signal_ndim=1).numpy()
# The FFTs are np.allclose
fft_torch = fft_torch.numpy()
assert np.allclose(np.real(fft_np), fft_torch[:, 0])
assert np.allclose(np.imag(fft_np), fft_torch[:, 1])
# But the IFFTs have different shapes
print(ifft_np.shape) # (100,)
print(ifft_torch.shape) # (101,)
# And none of their values are np.allclose
print(np.allclose(ifft_np, ifft_torch[:-1])) # False
print([x for (x, y) in itertools.product(ifft_np, ifft_torch)
if np.allclose(x, y)]) # []