A pythonic wrapper around FFTW, the FFT library, presenting a unified interface for all the supported transforms.
—
Drop-in replacement for numpy.fft functions with additional optimization parameters, enabling existing code to benefit from FFTW performance with minimal changes. This interface maintains full API compatibility while adding FFTW-specific performance options.
Core complex-to-complex transform functions compatible with numpy.fft.
def fft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
1D discrete Fourier transform.
Parameters:
- a: Input array
- n: Length of transform (default: a.shape[axis])
- axis: Axis over which to compute FFT (default: -1)
- norm: Normalization mode ('backward', 'ortho', 'forward', None)
- overwrite_input: Whether input can be overwritten (default: False)
- planner_effort: FFTW planning effort (default: 'FFTW_ESTIMATE')
- threads: Number of threads (default: 1)
- auto_align_input: Auto-align input for SIMD (default: True)
- auto_contiguous: Make input contiguous (default: True)
Returns:
- Complex array containing the transform
"""
def ifft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
1D inverse discrete Fourier transform.
Parameters: Same as fft()
Returns:
- Complex array containing the inverse transform
"""
def fft2(
a,
s=None,
axes=(-2, -1),
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
2D discrete Fourier transform.
Parameters:
- a: Input array
- s: Shape of transform (default: a.shape[axes])
- axes: Axes over which to compute FFT (default: (-2, -1))
- Other parameters: Same as fft()
Returns:
- Complex array containing the 2D transform
"""
def ifft2(
a,
s=None,
axes=(-2, -1),
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
2D inverse discrete Fourier transform.
Parameters: Same as fft2()
Returns:
- Complex array containing the 2D inverse transform
"""
def fftn(
a,
s=None,
axes=None,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
N-dimensional discrete Fourier transform.
Parameters:
- a: Input array
- s: Shape of transform (default: a.shape[axes])
- axes: Axes over which to compute FFT (default: all axes)
- Other parameters: Same as fft()
Returns:
- Complex array containing the N-D transform
"""
def ifftn(
a,
s=None,
axes=None,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
N-dimensional inverse discrete Fourier transform.
Parameters: Same as fftn()
Returns:
- Complex array containing the N-D inverse transform
"""Real-to-complex and complex-to-real transform functions.
def rfft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
1D real-to-complex discrete Fourier transform.
Parameters: Same as fft()
Returns:
- Complex array with shape [..., n//2 + 1] along transform axis
"""
def irfft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
1D complex-to-real inverse discrete Fourier transform.
Parameters: Same as fft()
Returns:
- Real array with specified length n along transform axis
"""
def rfft2(
a,
s=None,
axes=(-2, -1),
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
2D real-to-complex discrete Fourier transform.
Parameters: Same as fft2()
Returns:
- Complex array with last axis shape s[-1]//2 + 1
"""
def irfft2(
a,
s=None,
axes=(-2, -1),
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
2D complex-to-real inverse discrete Fourier transform.
Parameters: Same as fft2()
Returns:
- Real array with specified shape s
"""
def rfftn(
a,
s=None,
axes=None,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
N-dimensional real-to-complex discrete Fourier transform.
Parameters: Same as fftn()
Returns:
- Complex array with last transform axis shape s[-1]//2 + 1
"""
def irfftn(
a,
s=None,
axes=None,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
N-dimensional complex-to-real inverse discrete Fourier transform.
Parameters: Same as fftn()
Returns:
- Real array with specified shape s
"""Functions for transforms of Hermitian (conjugate-symmetric) data.
def hfft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
FFT of Hermitian (conjugate-symmetric) sequence.
Parameters: Same as fft()
Returns:
- Real array containing the transform
"""
def ihfft(
a,
n=None,
axis=-1,
norm=None,
overwrite_input=False,
planner_effort='FFTW_ESTIMATE',
threads=1,
auto_align_input=True,
auto_contiguous=True
):
"""
Inverse FFT of Hermitian sequence.
Parameters: Same as fft()
Returns:
- Complex array containing the inverse transform
"""# Original numpy code
import numpy as np
data = np.random.randn(1024) + 1j * np.random.randn(1024)
result_numpy = np.fft.fft(data)
# Replace with pyFFTW - same interface, better performance
from pyfftw.interfaces import numpy_fft
result_pyfftw = numpy_fft.fft(data)
print(f"Results match: {np.allclose(result_numpy, result_pyfftw)}")from pyfftw.interfaces import numpy_fft
import numpy as np
# Use additional performance parameters
data = np.random.randn(1024, 512) + 1j * np.random.randn(1024, 512)
# Standard call with optimization
result = numpy_fft.fft2(
data,
overwrite_input=True, # Allow input modification
planner_effort='FFTW_MEASURE', # Better planning
threads=4, # Use multiple threads
auto_align_input=True # Ensure optimal alignment
)from pyfftw.interfaces import numpy_fft
import numpy as np
# Process real signal
signal = np.random.randn(2048)
# Real-to-complex transform
spectrum = numpy_fft.rfft(signal, planner_effort='FFTW_PATIENT')
print(f"Signal shape: {signal.shape}")
print(f"Spectrum shape: {spectrum.shape}") # (1025,) - n//2 + 1
# Modify spectrum (e.g., filtering)
spectrum[100:] = 0 # Low-pass filter
# Transform back to real
filtered_signal = numpy_fft.irfft(spectrum, n=len(signal))
print(f"Filtered signal shape: {filtered_signal.shape}")from pyfftw.interfaces import numpy_fft
import numpy as np
# Process 2D image data
image = np.random.randn(512, 512)
# 2D real FFT for image processing
freq_domain = numpy_fft.rfft2(
image,
threads=2,
auto_align_input=True
)
# Apply frequency domain filter
center_y, center_x = np.array(freq_domain.shape) // 2
y, x = np.ogrid[:freq_domain.shape[0], :freq_domain.shape[1]]
mask = (y - center_y)**2 + (x - center_x)**2 > 50**2
freq_domain[mask] = 0
# Transform back
filtered_image = numpy_fft.irfft2(freq_domain, s=image.shape)from pyfftw.interfaces import numpy_fft
import numpy as np
data = np.random.randn(128) + 1j * np.random.randn(128)
# Different normalization modes
forward = numpy_fft.fft(data, norm='forward') # 1/n scaling on forward
backward = numpy_fft.fft(data, norm='backward') # 1/n scaling on inverse (default)
ortho = numpy_fft.fft(data, norm='ortho') # 1/sqrt(n) scaling on both
# Verify orthogonal normalization preserves energy
print(f"Original energy: {np.sum(np.abs(data)**2)}")
print(f"Ortho energy: {np.sum(np.abs(ortho)**2)}")from pyfftw.interfaces import numpy_fft
import numpy as np
# 3D volume data
volume = np.random.randn(64, 64, 64) + 1j * np.random.randn(64, 64, 64)
# Transform only specific axes
result_2d = numpy_fft.fftn(volume, axes=(0, 2)) # Transform first and last axes
result_all = numpy_fft.fftn(volume) # Transform all axes
print(f"2D transform shape: {result_2d.shape}")
print(f"3D transform shape: {result_all.shape}")Install with Tessl CLI
npx tessl i tessl/pypi-pyfftw