MATLAB - 傅里叶逆变换
现代傅里叶分析:逆变换
Section titled “现代傅里叶分析:逆变换”快速傅里叶逆变换(IFFT)是快速傅里叶变换(FFT)的对应部分。fft 函数将信号从时域(或空间域)转换为频域,而 ifft 函数则将其转换回来。这对变换是现代信号和图像处理的基础,可实现频域滤波、分析和数据压缩。
一维逆 FFT:ifft
Section titled “一维逆 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 的典型结果)时使用它。它强制输出为纯实数,并且可以更快。
示例 1:重建信号
Section titled “示例 1:重建信号”本示例展示了往返过程:创建信号,使用 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)]);二维逆 FFT:ifft2
Section titled “二维逆 FFT:ifft2”ifft2 函数执行二维逆变换,这对于图像处理至关重要。它将二维频率表示转换回空间图像。
实际应用:频域图像滤波
Section titled “实际应用:频域图像滤波”一个强大的应用是在频域中对图像进行滤波。在这里,我们将创建一个低通滤波器,通过衰减其高频分量(对应于边缘和细节)来模糊图像。
% 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');重要注意事项
Section titled “重要注意事项”归一化与功率
Section titled “归一化与功率”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逆转该过程。