关于自己学习傅里叶变换的一点总结,本人一开始编这块代码极其痛苦,故有此一篇;不详细讲原理,只说怎么编代码,以一个实际例子进行讲解。
1、例题:假设现有两个频率分别为20Hz、25Hz的cos函数叠加,要求选取合适的采样频率,进行离散采样,求其频谱图(即傅里叶变换)。
思路:1、首先根据奈奎斯特采样定理,采样频率应该大于信号最高频率的2倍,不然会出现频谱混叠,这里选择采样频率fs为100Hz;
2、然后考虑采样点数N的选取,由题目可知两个信号的频率相差为5Hz,要想频谱图上能够区分开两个信号的频点,则需要频谱图的频率分辨率Δf小于5Hz,而频率分辨率,故N需大于20;
为便于理解,此处我们分别选取N=10,20,40,进行仿真,代码如下
clc
clear
close all
% 定义参数
f1 = 20; % 第一个余弦函数频率为20 Hz
f2 = 25; % 第二个余弦函数频率为25 Hz
fs = 100; % 采样频率为100 Hz
% 生成时间向量
t = 0:1/fs:1-1/fs;
figure;
i = 0;
for N = [10,20,40]
i = i + 1;
n = 1:N;
x = cos(2*pi*f1*t) + cos(2*pi*f2*t);
% 进行离散傅里叶变换
X = fft(x(1:N));
% 计算频谱横坐标
f = (0:N-1) * (fs/N);% (fs/N)为:频率分辨率
subplot(3,1,i);
stem(f, abs(X), 'filled');
title(['N = ' num2str(N)]);
xlabel('Frequency (Hz)');
ylabel('Magnitude');
end
2、仿真结果
可见,当采样点数少于10(即频率分辨率大于5Hz)时,发生了频谱混叠的现象
3、个人觉得难理解的地方:
“横轴相邻两点的间隔”即为“频率分辨率”,且总点数即为采样点数N