Skip to content

MATLAB - 傅里叶逆变换

快速傅里叶逆变换(IFFT)是快速傅里叶变换(FFT)的对应部分。fft 函数将信号从时域(或空间域)转换为频域,而 ifft 函数则将其转换回来。这对变换是现代信号和图像处理的基础,可实现频域滤波、分析和数据压缩。

ifft 函数计算向量或矩阵列的离散傅里叶逆变换(IDFT)。

x = ifft(Y)
x = ifft(Y, n)
x = ifft(Y, [], dim)
x = ifft(Y, ..., 'symmetric')
  • x = ifft(Y): 计算 Y 的逆变换。
  • x = ifft(Y, n): 计算 n 点逆变换。Y 会用零填充或截断到长度 n。
  • x = ifft(Y, [], dim): 沿特定维度 dim 执行 IFFT。
  • 'symmetric' 标志: 一个重要的优化。当已知输入 Y 是共轭对称的(实信号进行 FFT 的典型结果)时使用它。它强制输出为纯实数,并且可以更快。

本示例展示了往返过程:创建信号,使用 fft 将其变换到频域,再使用 ifft 将其变换回来。

% 1. 创建一个包含两个频率分量的信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
signal = sin(2*pi*50*t) + 0.5*sin(2*pi*120*t);
% 2. 计算傅里叶变换
Y = fft(signal);
% 3. 计算傅里叶逆变换
% 使用 'symmetric' 标志,因为原始信号是实数。
x_reconstructed = ifft(Y, 'symmetric');
% 4. 验证和绘图
figure;
tiledlayout(2, 1);
% 原始信号
nexttile;
plot(t, signal);
title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude');
grid on;
% 重建信号
nexttile;
plot(t, x_reconstructed, '--');
title('Reconstructed Signal');
xlabel('Time (s)');
ylabel('Amplitude');
grid on;
% 检查重建误差(应该非常小)
reconstruction_error = max(abs(signal - x_reconstructed));
disp(['Max reconstruction error: ', num2str(reconstruction_error)]);

ifft2 函数执行二维逆变换,这对于图像处理至关重要。它将二维频率表示转换回空间图像。

一个强大的应用是在频域中对图像进行滤波。在这里,我们将创建一个低通滤波器,通过衰减其高频分量(对应于边缘和细节)来模糊图像。

% 1. 加载并准备图像
I = imread('cameraman.tif'); % 加载一个标准演示图像
I = im2double(I); % 转换为双精度浮点数以进行计算
% 2. 计算二维 FFT
% fftshift 用于将零频率分量移到中心以便于滤波
F = fftshift(fft2(I));
% 3. 创建一个低通滤波器掩码
[rows, cols] = size(I);
[u, v] = meshgrid(-(cols-1)/2:(cols-1)/2, -(rows-1)/2:(rows-1)/2);
cutoff_freq = 30; % 滤波器半径(像素)
mask = sqrt(u.^2 + v.^2) < cutoff_freq;
% 4. 将掩码应用于频率数据
F_filtered = F .* mask;
% 5. 计算二维逆 FFT
% 使用 ifftshift 在 IFFT 之前将零频率移回
I_filtered = ifft2(ifftshift(F_filtered), 'symmetric');
% 6. 显示结果
figure;
tiledlayout(1, 2);
nexttile;
imshow(I);
title('Original Image');
nexttile;
imshow(I_filtered);
title('Low-Pass Filtered Image');

MATLAB 的 fft/ifft 对不是酉的。ifft 函数包含一个 1/N 归一化因子。这意味着 ifft(fft(x)) 可以正确恢复 x,但在频域中,如果不手动缩放,能量将不守恒。对于功率谱计算,您必须正确缩放 fft 输出。

使用 ifft(Y, n) 且 n > length(Y) 等效于在频域中对 Y 进行零填充。这会在时域中产生插值,通过增加采样点数量来生成更平滑的信号。

  • 实数与复数输出:如果您的原始信号 x 是实数,则 ifft(fft(x)) 也应该是实数。由于浮点误差,它可能包含一个微小、可忽略的虚部。使用 real(ifft(...)) 或 'symmetric' 标志来舍弃它。
  • fftshift/ifftshift:在频域中可视化或滤波时,始终使用 fftshift 将频谱居中。请记住在应用 ifft2 之前使用 ifftshift 逆转该过程。