目录
关于快速傅里叶变换的理论知识见博客:
1. FFT算法仿真
我们有一个信号,它含有 2V 的直流分量,频率为 50Hz、相位为-30 度、幅度为 3V 的交流信号,以及一个频率为 75Hz、相位为 90 度、幅度为 1.5V 的交流信号。
用数学表达式就是如下:
对该信号进行傅里叶变换,FFT变换,将这三个信号分离开来。
代码:
% 参数设置
Fs = 256; % 采样频率 (Hz)
N = 256; % 采样点数
n = 0:N-1; % 采样点索引
t = n / Fs; % 时间向量,时间范围从0到1秒,步长为1/Fs
% 原始信号:由多个频率成分的余弦波组成
x = 2 + 3*cos(2*pi*50*t - pi*30/180) + 1.5*cos(2*pi*75*t + pi*90/180);
% 绘制原始信号的时域图
subplot(2,1,1); % 创建2行1列的子图,选择第1个子图区域
plot(t, x); % 绘制时域信号
title('Original Signal (Time Domain)'); % 设置标题
xlabel('Time (s)'); % 设置x轴标签
ylabel('Amplitude'); % 设置y轴标签
% 进行快速傅里叶变换 (FFT)
y = fft(x); % 对原始信号进行FFT变换
M = abs(y); % 计算FFT结果的幅度(模值)
% 绘制频域信号的幅频谱图
subplot(2,1,2); % 创建2行1列的子图,选择第2个子图区域
plot(n, M); % 绘制FFT幅频谱
title('FFT of the Signal (Magnitude Spectrum)'); % 设置标题
xlabel('Frequency (Hz)'); % 设置x轴标签
ylabel('Magnitude'); % 设置y轴标签
详细解释:
-
信号参数设置:
Fs = 256;
设定采样频率为256 Hz,即每秒采样256次。N = 256;
信号的采样点数为256。n = 0:N-1;
生成一个从0到255的整数序列,表示采样点的索引。t = n / Fs;
生成时间向量t
,它的长度为N
,且时间间隔为1/Fs
。这个向量表示信号的采样时刻。
-
创建信号:
x
是原始信号,它是由多个频率成分的余弦波组成的。- 信号的组成:
2
是常数偏置(直流分量)。3*cos(2*pi*50*t - pi*30/180)
是一个幅值为3,频率为50 Hz,初相位为-30°
的余弦波。1.5*cos(2*pi*75*t + pi*90/180)
是一个幅值为1.5,频率为75 Hz,初相位为+90°
的余弦波。
-
FFT变换:
Y = fft(signal);
对信号进行FFT变换,得到频域表示Y
。fft
函数计算离散傅里叶变换(DFT),其结果是复数。
-
频谱计算:
y = fft(x)
:对原始信号x
执行快速傅里叶变换(FFT),得到频域信号y
。FFT计算的结果是复数,因此包含了幅度和相位信息。M = abs(y)
:计算FFT结果的幅度,即信号在频域的强度,abs(y)
取复数的模值。
-
时域与频域绘图:
subplot(2,1,1)
:创建一个2行1列的子图布局,选择第1个子图来绘制时域信号。plot(t, x)
:绘制时域信号,x轴是时间t
,y轴是信号幅度x
。subplot(2,1,2)
:选择第2个子图区域,用于绘制频域信号的幅频谱。plot(n, M)
:绘制频域信号的幅频谱图,x轴是采样点n
,y轴是信号的幅度M
。在频域图中,你可以看到信号在不同频率成分上的强度。
仿真结果:
如下为Matlab中的仿真结果: