在上一篇博客中,介绍了MATLAB中的IFFT和虚部取反后的FFT的验证,结果表明是一致的。

https://blog.csdn.net/weixin_42316458/article/details/80462145#comments_13197383

有人提问:“做了逆变换之后为啥头部和尾部的信号和原始信号不一致了啊?能否通过某种方式恢复呢”

通过图形可以看出,在“IFFT时域”和“虚部取反做FFT时域”,结果是一致的。同时也看出,在头部和尾部与“原信号”均有差异。原因是加了窗函数的原因。而加窗函数的原因,是为了减少泄露。

泄露的产生

因为对于傅里叶变化运算的前提是:信号是周期性的信号。如果是周期性信号,则FFT后的模值更加聚集在一起,而如果是非周期性信号,则频域模值会分散。如下图所示:

加窗函数的目的

在实操中,也只有加窗函数,把头部和尾部都通过乘以系数衰减,这样才能把信号认为是周期信号。(比如上图红线和黑线,在时域上再复制一个它,依然是连接起来的)。

如果不加窗函数,那么就会造成泄漏。关于泄漏,可以理解为是由于信号不是周期性信号,在FFT后,由于头部和尾部的原因,造成结果在模值上看有一些其他成分。具体可看下图:

如果不加窗函数,FFT的结果就是在周围也会存在其他频率(上图红线)。而可以通过增加窗函数,使频率更加聚集(上图蓝线)。

窗函数类型

窗函数有:矩形窗,三角形窗,汉宁窗(Hanning),海明窗(Hamming),布莱克曼窗(Blackman)……等,每个都有各自的特性。上一篇博客中,我使用汉宁窗hanning。档使用矩形窗函数时,相当于是没有加窗,这样可以验证不加窗函数的结果。以下图片是针对一正弦波加不同窗函数结果。

以下MATLAB程序在2016a版上运行,可直接生成以上3图

clear;clc;clf;
%% 参数
Fs=24000;
timeS = 0.2;                %长度参数
t1 = 0:1/Fs:timeS;          %周期信号时间参数
t = 0:1/Fs:timeS+0.002;     %非周期信号时间参数
plotX = 39;                %作图参数
plotY = 1700;               %作图参数%% 周期性信号
y1=sin(200*2*pi*t1);     %24k采样率下,生成200Hz正弦波
yfft1=fft(y1);
yifft1=ifft(yfft1);%% 非周期性信号
y=sin(200*2*pi*t+50);       %24k采样率下,生成200Hz正弦波
yfft=fft(y);                %不加窗运算
yifft=ifft(yfft);%% 非周期性信号加窗函数
Windows=hanning(length(y));
yWindows=y.*Windows';       %加窗运算
yfftWindows=fft(yWindows);
yifftWindows=ifft(yfftWindows);%% 作图
figure(1);
subplot(331);plot(y1);xlabel('周期性信号时域');
subplot(334);plot(abs(yfft1));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('周期性信号频域');
subplot(337);plot(real(yifft1));xlabel('IFFT信号时域');subplot(332);plot(y);xlabel('非周期性信号时域');
subplot(335);plot(abs(yfft));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('非周期性信号频域');
subplot(338);plot(real(yifft));xlabel('IFFT信号时域');subplot(333);plot(yWindows);xlabel('加窗函数信号时域');
subplot(336);plot(abs(yfftWindows));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('加窗函数信号频域');
subplot(339);plot(real(yifftWindows));xlabel('IFFT信号时域');figure(2);
plot(abs(yfft),'r');hold on
yfftWindows = yfftWindows*(max(abs(yfft))/max(abs(yfftWindows)));    %把最大值转换成一样,方便作图对比查看
plot(abs(yfftWindows),'b');axis([plotX,plotX*1.2,-plotY*0.5,plotY*1.8]);grid on
xlabel('非周期性信号加窗函数和不加窗函数时域对比');
legend('不加窗函数','加窗函数');%% 使用不同窗函数效果
WindowsHanning=hanning(length(y));
WindowsHamming=hamming(length(y));
WindowsTri=triang(length(y));yW1=y.*WindowsHanning';       %加窗运算
yW1=fft(yW1);
yW2=y.*WindowsHamming';       %加窗运算
yW2=fft(yW2);
yW3=y.*WindowsTri';       %加窗运算
yW3=fft(yW3);figure(3);
plot(abs(yfft),'b');hold on;
plot(abs(yW1),'k');hold on;
plot(abs(yW2),'r');hold on;
plot(abs(yW3),'g');axis([plotX*0.95,plotX*1.2,-plotY*0.05,plotY*1.1]);grid on
xlabel('不同窗函数的对比');
legend('不加窗函数','汉宁窗','海明窗','三角窗');

本人新建了个QQ群,如想进一步沟通可添加:947187213。

Matlab中FFT运算加窗函数的验证相关推荐

  1. matlab 点符号,matlab 中在运算符号前加一点是什么意思?

    matlab 中在运算符号前加一点是什么意思? mip版  关注:210  答案:2  悬赏:20 解决时间 2021-01-23 18:50 已解决 2021-01-23 08:24 例如,矩阵A. ...

  2. matlab 日期加小时数_实验一 连续时间信号在Matlab中的运算

    实验一连续时间信号在Matlab中的运算 一.实验目的 1.学会运用Matlab进行连续时间信号的时移.反褶和尺度变换. 2.学会运用Matlab进行连续时间信号相加.相乘.微分.积分和卷积运算. 3 ...

  3. MATLAB中FFT的使用方法(频谱分析)

    原文地址:MATLAB中FFT的使用方法(频谱分析)作者:飞鸿 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法 X=FFT(x): X=FFT(x,N): ...

  4. MATLAB中控制运算精度

    Matlab设置计算精度 #原理 MATLAB中控制运算精度 : format long 只能设置显示精度,并不能控制运算精度. 在MATLAB中,控制运算精度一般使用 digits 和 vpa. # ...

  5. matlab函数fftshift,matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)

    plot([0 : PointNum/2 - 1], x1(1:PointNum/2)); grid on subplot(3,1,2); % [REX IMX] am = sqrt(abs(REX. ...

  6. matlab函数乘阶跃,MATLAB中FFT函数和点乘、乘、单位阶跃函数

    注意问题:1, 对于单位阶跃函数u(t-b)和Dirac函数delta(t-a),可以借用Maple函数库中的定义,他们分别是Heaviside(t-b),Dirca(t-a). 2,点乘和点除代表矩 ...

  7. Matlab中fft作频谱横纵坐标

    关于这个问题,在很早之前就分享过,也通过了解实现了算法,当时看的明白,想的明白,突然要用的时候,又开始疑问,不免有些纠结,与其每次使用的时候都查,浪费时间,还不如,一次搞定. 真心没把哪门没学好的课程 ...

  8. Matlab中fft函数的使用与原理

    快速傅里叶变换(Fast Fourier transform,FFT) 利用离散傅里叶变换(DTF)算法进行运算时,复数乘法运行次,复数加法运行次,计算量其实可以通过fft减小.1965年,首先由Co ...

  9. fft2MATLAB内存不足,matlab中fft快速傅里叶变换

    博文来源:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle 视 ...

最新文章

  1. LeetCode简单题之连续字符
  2. python2.7读汉字的时候出现乱码,如何解决
  3. java 参数 string_关于Java中String类型的参数传递问题
  4. 2021-11-13SystemStringBuliding
  5. 天天象棋 残局闯关 第6关
  6. 对某公司一次弱口令到存储型xss挖掘
  7. Dapper试用简例
  8. Linux find 命令概览
  9. Python关键字和标识符
  10. abb880/580驱动程序,zmu程序图纸571/592/792需要
  11. 空调基础知识培训课件
  12. 有哪些曾惊艳到你了的古诗词?1024程序员读古诗词
  13. 服务发现框架 —————— 开开开山怪
  14. 回顾过去,展望未来 —— web唐和诚
  15. 现代电子计算机数学理论基础,知到食品营养学(暨南大学)2020网课答案
  16. 破解压缩包密码-两行命令
  17. 多边形(n边形)面积计算公式hdu2036
  18. 用python建立三元一次方程组的解法_三元一次方程组的解法及运用
  19. 气象学需要计算机知识吗,应用气象学专业学什么 附学习科目和课程
  20. Merlin部署KMS

热门文章

  1. 我们 | 单枪匹马,不如群狼作战!
  2. CGB2111-Day18
  3. iOS 一个错误 Unable to find a specification for
  4. 中国医科大学网络教育学院试卷计算机,中国医科大学网络教育学院试卷
  5. 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家
  6. 译书《物联网实战指南》出版 | 新成就:翻译自己的英文简介
  7. 高中计算机二级考试试题,高中二年级全国计算机等级考试试题.doc
  8. 智能硬件产品经理需要哪些技术基础?
  9. 4.STM32F407ZG按键输入
  10. Vue Router 路由中 this.$router 与this.$route区别