傅里叶变换 matlab FFT 函数解析

傅里叶变换 和 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 = 4T1
在这里插入图片描述
T = 8T1
在这里插入图片描述
T = 16T1

参考:

  1. <<信号与系统>>
  2. https://ww2.mathworks.cn/help/matlab/ref/fft.html
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zb12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值