Matlab中FFT运算加窗函数的验证
在上一篇博客中,介绍了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运算加窗函数的验证相关推荐
- matlab 点符号,matlab 中在运算符号前加一点是什么意思?
matlab 中在运算符号前加一点是什么意思? mip版 关注:210 答案:2 悬赏:20 解决时间 2021-01-23 18:50 已解决 2021-01-23 08:24 例如,矩阵A. ...
- matlab 日期加小时数_实验一 连续时间信号在Matlab中的运算
实验一连续时间信号在Matlab中的运算 一.实验目的 1.学会运用Matlab进行连续时间信号的时移.反褶和尺度变换. 2.学会运用Matlab进行连续时间信号相加.相乘.微分.积分和卷积运算. 3 ...
- MATLAB中FFT的使用方法(频谱分析)
原文地址:MATLAB中FFT的使用方法(频谱分析)作者:飞鸿 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法 X=FFT(x): X=FFT(x,N): ...
- MATLAB中控制运算精度
Matlab设置计算精度 #原理 MATLAB中控制运算精度 : format long 只能设置显示精度,并不能控制运算精度. 在MATLAB中,控制运算精度一般使用 digits 和 vpa. # ...
- 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. ...
- matlab函数乘阶跃,MATLAB中FFT函数和点乘、乘、单位阶跃函数
注意问题:1, 对于单位阶跃函数u(t-b)和Dirac函数delta(t-a),可以借用Maple函数库中的定义,他们分别是Heaviside(t-b),Dirca(t-a). 2,点乘和点除代表矩 ...
- Matlab中fft作频谱横纵坐标
关于这个问题,在很早之前就分享过,也通过了解实现了算法,当时看的明白,想的明白,突然要用的时候,又开始疑问,不免有些纠结,与其每次使用的时候都查,浪费时间,还不如,一次搞定. 真心没把哪门没学好的课程 ...
- Matlab中fft函数的使用与原理
快速傅里叶变换(Fast Fourier transform,FFT) 利用离散傅里叶变换(DTF)算法进行运算时,复数乘法运行次,复数加法运行次,计算量其实可以通过fft减小.1965年,首先由Co ...
- fft2MATLAB内存不足,matlab中fft快速傅里叶变换
博文来源:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle 视 ...
最新文章
- LeetCode简单题之连续字符
- python2.7读汉字的时候出现乱码,如何解决
- java 参数 string_关于Java中String类型的参数传递问题
- 2021-11-13SystemStringBuliding
- 天天象棋 残局闯关 第6关
- 对某公司一次弱口令到存储型xss挖掘
- Dapper试用简例
- Linux find 命令概览
- Python关键字和标识符
- abb880/580驱动程序,zmu程序图纸571/592/792需要
- 空调基础知识培训课件
- 有哪些曾惊艳到你了的古诗词?1024程序员读古诗词
- 服务发现框架 —————— 开开开山怪
- 回顾过去,展望未来 —— web唐和诚
- 现代电子计算机数学理论基础,知到食品营养学(暨南大学)2020网课答案
- 破解压缩包密码-两行命令
- 多边形(n边形)面积计算公式hdu2036
- 用python建立三元一次方程组的解法_三元一次方程组的解法及运用
- 气象学需要计算机知识吗,应用气象学专业学什么 附学习科目和课程
- Merlin部署KMS
热门文章
- 我们 | 单枪匹马,不如群狼作战!
- CGB2111-Day18
- iOS 一个错误 Unable to find a specification for
- 中国医科大学网络教育学院试卷计算机,中国医科大学网络教育学院试卷
- 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家
- 译书《物联网实战指南》出版 | 新成就:翻译自己的英文简介
- 高中计算机二级考试试题,高中二年级全国计算机等级考试试题.doc
- 智能硬件产品经理需要哪些技术基础?
- 4.STM32F407ZG按键输入
- Vue Router 路由中 this.$router 与this.$route区别