看到古月居大佬写的一篇博客,受此激发,用MATLAB写下我对fft和ifft用法的理解。
计算机只能处理有限长度的离散数据序列,所以只有DFS可以通过计算机进行计算
FFT只是加速 DFT 运算的一种快速算法, 在信号理论上没有新的贡献 。其计算的结果和本质内容仍然是离散傅里叶变换 (DFT)。
% 熟悉FFT和IFFT的使用
% 参考 https://www.guyuehome.com/35495
clc; clear; close all
N = 1000; % 信号总采样点数
fs = 100; % 采样率
t = (0: 1: N-1) / fs; % 时间点
f1 = 10; f2 = 60; % 信号频率
y = 3 + 2*cos(2*pi*f1*t) + 0.5*cos(2*pi*f2*t);
% f2=60Hz频率在频谱图上显示在40Hz处,因为其超过了奈奎斯特采样频率,采样时出现混叠
% 参考CSDN 混叠(aliasing)和抗混叠滤波器
%% 傅里叶变换
Y = fft(y, N);
Y2 = abs(Y(1: N/2+1)) * 2/N; % 取半谱
Y2(1) = Y2(1) / 2;
Y2(end) = Y2(end) / 2; % 第1个和第N/2+1个点没有对称,故不用除以2
f_l = (0: 1: N/2) * fs/N; % 频率点
%% 傅里叶反变换
yi = ifft(Y, N); % ifft输入为复数,输出为实数
%% 绘图
figure(1)
subplot(211)
plot(t, y, 'b'); % 绘制原始波形图
xlabel('时间/s'); ylabel('幅度');
subplot(212)
plot(t, yi, 'b'); % 绘制傅里叶反变换得到的波形图
xlabel('时间/s'); ylabel('幅度');
figure(2)
plot(f_l, Y2, 'r'); grid on
xlabel('频率/Hz'); ylabel('幅度');
参考: