傅里叶变换 和 matlab FFT 函数解析
傅里叶变换网上有很多资料了,本博客主要讲实现《信号系统》P181页,不同周期的方波
的傅里叶级数:
与sinc形成包络:
其间隔ω0,如下图:
本博客用matlab 实现一下。
下面解析matlab fft
matlab fft 函数用于离散快速傅里叶变换,输出一个与输入等长n的序列。
它按以下方式计算:
有此公式也可以自行实现fft,例如实部:
clear
t0 = 0.1;% 采样间隙
tr = 32;
t = -tr:t0:tr;
n = length(t);
y = 3*cos(2*t);
mY = zeros(size(t));
w = linspace(-1/t0*pi,1/t0*pi,n);
for k = 1:n
for j = 1:n
mY(k) = mY(k) + y(j)*cos(-2*pi*(j-1)*(k-1)/n);
end
end
Y = fft(y);
plot(real(Y)-mY)
对比连续的傅里叶级数展开公式:
设n是全部样本数,t0是时间间隔,则有以下转换方式:
那么傅里叶系数ak对应fft()函数结果有如下关系:
这说明ak在fft()结果中间隔nt0/T,可以离散fft用来离散化连续傅里叶级数。
代码
基础设置
clear
t0 = 0.01;% 采样间隙
tr = 3200;
t = -tr:t0:tr;%样本时长,注意tr必须为T的整数倍,保证周期完整!
T1 = 0.1;%单周期方波时长
T = T1*16;%方波周期,改变T为4T1,8T1,16T1对应上面三个图
n = length(t); %离散化的点数,也对应fft结果的点数
y = zeros(size(t)); %信号
w = linspace(-1/t0*pi,1/t0*pi,n);% 频域范围对应2pi/t0
% ω 间隔2pi/(t0n),对应ak间隔2pi/(t0n)*nt0/T= ω0 与书上结论一致
产生占空比为2T1/T的方波:
for i = 1:n
if abs((rem(t(i),T))) < T1 || abs((rem(t(i),T)))>=T-T1
y(i) = 1;
end
end
figure()
plot(t,y);
调整T,画包络图
figure()
plot(w,2*sin(w*T1)./w) %sinc
hold on
Y = fft(y)/n;
k = fftshift(Y); %fftshift 将Y(0)移动到中心,Y(n/2:end)移动到负数频域
plot(w,T*real(k)) %频谱(包含ak,间隔nt0/T)
实验结果
T = 4T1
T = 8T1
T = 16T1
参考:
- <<信号与系统>>
- https://ww2.mathworks.cn/help/matlab/ref/fft.html