Expand description
Fast Fourier Transform (FFT) and its inverse (IFFT) for one, two, and N dimensions.
Unsuffixed functions are the canonical named Result paths and use the current thread’s scoped
stream or runtime default. Select an explicit stream or device with crate::with_stream or
crate::with_device. The _device functions and generated operation macros are deprecated
forwarding shims.
N-dimensional transforms accept FftnOptions. Its default selects every axis at the input
lengths, and correlated lengths and axes are validated before calling MLX.
§Examples
§One dimension
use mlx_rs::{
Dtype, Array, complex64, fft::*,
test_utils::{assert_array_eq, tolerances},
};
let src = [1.0f32, 2.0, 3.0, 4.0];
let mut array = Array::from_slice(&src[..], &[4]);
let mut fft_result = fft(&array, 4, 0).unwrap();
assert_eq!(fft_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(10.0, 0.0),
complex64::new(-2.0, 2.0),
complex64::new(-2.0, 0.0),
complex64::new(-2.0, -2.0),
], &[4]);
assert_array_eq(&fft_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut ifft_result = ifft(&fft_result, 4, 0).unwrap();
assert_eq!(ifft_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(1.0, 0.0),
complex64::new(2.0, 0.0),
complex64::new(3.0, 0.0),
complex64::new(4.0, 0.0),
], &[4]);
assert_array_eq(ifft_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut rfft_result = rfft(&array, 4, 0).unwrap();
assert_eq!(rfft_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(10.0, 0.0),
complex64::new(-2.0, 2.0),
complex64::new(-2.0, 0.0),
], &[3]);
assert_array_eq(&rfft_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut irfft_result = irfft(&rfft_result, 4, 0).unwrap();
assert_eq!(irfft_result.dtype(), Dtype::Float32);
assert_array_eq(
irfft_result,
Array::from_slice(&src, &[4]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
// The original array is not modified
assert_array_eq(
array,
Array::from_slice(&src, &[4]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);§Two dimensions
use mlx_rs::{
Dtype, Array, complex64, fft::*,
test_utils::{assert_array_eq, tolerances},
};
let src = [1.0f32, 1.0, 1.0, 1.0];
let mut array = Array::from_slice(&src[..], &[2, 2]);
let mut fft2_result = fft2(&array, None, None).unwrap();
assert_eq!(fft2_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(4.0, 0.0),
complex64::new(0.0, 0.0),
complex64::new(0.0, 0.0),
complex64::new(0.0, 0.0),
], &[2, 2]);
assert_array_eq(&fft2_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut ifft2_result = ifft2(&fft2_result, None, None).unwrap();
assert_eq!(ifft2_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(1.0, 0.0),
complex64::new(1.0, 0.0),
complex64::new(1.0, 0.0),
complex64::new(1.0, 0.0),
], &[2, 2]);
assert_array_eq(ifft2_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut rfft2_result = rfft2(&array, None, None).unwrap();
assert_eq!(rfft2_result.dtype(), Dtype::Complex64);
let expected = Array::from_slice(&[
complex64::new(4.0, 0.0),
complex64::new(0.0, 0.0),
complex64::new(0.0, 0.0),
complex64::new(0.0, 0.0),
], &[2, 2]);
assert_array_eq(&rfft2_result, expected, tolerances::EXACT.rtol, tolerances::EXACT.atol);
let mut irfft2_result = irfft2(&rfft2_result, None, None).unwrap();
assert_eq!(irfft2_result.dtype(), Dtype::Float32);
assert_array_eq(
irfft2_result,
Array::from_slice(&src, &[2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
// The original array is not modified
assert_array_eq(
array,
Array::from_slice(&src, &[2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);§N dimensions
use mlx_rs::{
Dtype, Array, complex64, fft::*,
test_utils::{assert_array_eq, tolerances},
};
let mut array = Array::ones::<f32>(&[2, 2, 2]).unwrap();
let mut fftn_result = fftn(&array, FftnOptions::default()).unwrap();
assert_eq!(fftn_result.dtype(), Dtype::Complex64);
let mut expected = [complex64::new(0.0, 0.0); 8];
expected[0] = complex64::new(8.0, 0.0);
assert_array_eq(
&fftn_result,
Array::from_slice(&expected, &[2, 2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
let mut ifftn_result = ifftn(&fftn_result, FftnOptions::default()).unwrap();
assert_eq!(ifftn_result.dtype(), Dtype::Complex64);
let expected = [complex64::new(1.0, 0.0); 8];
assert_array_eq(
ifftn_result,
Array::from_slice(&expected, &[2, 2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
let mut rfftn_result = rfftn(&array, FftnOptions::default()).unwrap();
assert_eq!(rfftn_result.dtype(), Dtype::Complex64);
let mut expected = [complex64::new(0.0, 0.0); 8];
expected[0] = complex64::new(8.0, 0.0);
assert_array_eq(
&rfftn_result,
Array::from_slice(&expected, &[2, 2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
let mut irfftn_result = irfftn(&rfftn_result, FftnOptions::default()).unwrap();
assert_eq!(irfftn_result.dtype(), Dtype::Float32);
let expected = [1.0; 8];
assert_array_eq(
irfftn_result,
Array::from_slice(&expected, &[2, 2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);
// The original array is not modified
assert_array_eq(
array,
Array::from_slice(&[1.0; 8], &[2, 2, 2]),
tolerances::EXACT.rtol,
tolerances::EXACT.atol,
);Macros§
- fft
Deprecated - Macro generated for the function
crate::fft::fft. See the function documentation for more details. - fft2
Deprecated - Macro generated for the function
crate::fft::fft2. See the function documentation for more details. - fftn
Deprecated - Macro generated for the function
crate::fft::fftn. See the function documentation for more details. - fftshift
Deprecated - Macro generated for the function
crate::fft::fftshift. See the function documentation for more details. - ifft
Deprecated - Macro generated for the function
crate::fft::ifft. See the function documentation for more details. - ifft2
Deprecated - Macro generated for the function
crate::fft::ifft2. See the function documentation for more details. - ifftn
Deprecated - Macro generated for the function
crate::fft::ifftn. See the function documentation for more details. - ifftshift
Deprecated - Macro generated for the function
crate::fft::ifftshift. See the function documentation for more details. - irfft
Deprecated - Macro generated for the function
crate::fft::irfft. See the function documentation for more details. - irfft2
Deprecated - Macro generated for the function
crate::fft::irfft2. See the function documentation for more details. - irfftn
Deprecated - Macro generated for the function
crate::fft::irfftn. See the function documentation for more details. - rfft
Deprecated - Macro generated for the function
crate::fft::rfft. See the function documentation for more details. - rfft2
Deprecated - Macro generated for the function
crate::fft::rfft2. See the function documentation for more details. - rfftn
Deprecated - Macro generated for the function
crate::fft::rfftn. See the function documentation for more details.
Structs§
- Fftn
Options - Options shared by the n-dimensional FFT and real FFT transforms.
Functions§
- fft
- One dimensional discrete Fourier Transform.
- fft2
- Two dimensional discrete Fourier Transform.
- fft2_
device Deprecated - Compatibility shim for
fft2. - fft_
device Deprecated - Compatibility shim for
fft. - fftfreq
- Returns the discrete Fourier transform sample frequencies for a transform of length
n. - fftn
- n-dimensional discrete Fourier Transform.
- fftn_
device Deprecated - Compatibility shim for
fftn. - fftshift
- Shift the zero-frequency component to the center of the spectrum.
- fftshift_
device Deprecated - Compatibility shim for
fftshift. - ifft
- One dimensional inverse discrete Fourier Transform.
- ifft2
- Two dimensional inverse discrete Fourier Transform.
- ifft2_
device Deprecated - Compatibility shim for
ifft2. - ifft_
device Deprecated - Compatibility shim for
ifft. - ifftn
- n-dimensional inverse discrete Fourier Transform.
- ifftn_
device Deprecated - Compatibility shim for
ifftn. - ifftshift
- The inverse of
fftshift. - ifftshift_
device Deprecated - Compatibility shim for
ifftshift. - irfft
- The inverse of
rfft(). - irfft2
- The inverse of
rfft2(). - irfft2_
device Deprecated - Compatibility shim for
irfft2. - irfft_
device Deprecated - Compatibility shim for
irfft. - irfftn
- The inverse of
rfftn(). - irfftn_
device Deprecated - Compatibility shim for
irfftn. - rfft
- One dimensional discrete Fourier Transform on a real input.
- rfft2
- Two-dimensional real discrete Fourier Transform.
- rfft2_
device Deprecated - Compatibility shim for
rfft2. - rfft_
device Deprecated - Compatibility shim for
rfft. - rfftfreq
- Returns the nonnegative discrete Fourier transform sample frequencies for a real transform.
- rfftn
- n-dimensional real discrete Fourier Transform.
- rfftn_
device Deprecated - Compatibility shim for
rfftn.