DFT泄露问题和DFT的频率轴表示方法(第三章离散傅里叶变换(3.8,3.13.4)学习笔记)
发布日期:2021-05-15 10:42:58 浏览次数:18 分类:技术文章

本文共 3121 字,大约阅读时间需要 10 分钟。

文章目录

1、DFT泄露原因

一个被称之为“”泄露“”的特性使得DFT结果只是数字采样前原始输入信号真实谱的近似。

我们知道分析频率是 f(analysis)=(mFs)/N (m取整数)

如果输入信号在分析频率 mFs/N 上存在信号分量,如1.5Fs/N(m非整数的地方) ,那么在某种程度上这个输入信号将会在DFT所有N个输出分析频率样值上出现。

clear;%清除内存close all;%关闭所有图形x=sin(2*pi*(0:63)*3/64);%产生某时段的正弦信号;连续信号频率3 采样频率10figure;plot(x);%画图grid on;%并打网格title('时域可分信号','FontSize',14);ylabel('x(n)','FontSize',14);xlabel('n','FontSize',14);%标注X轴,Y轴坐标xf=fft(x,64);%FFT(X,N)是N点的FFT,如果X小于0,就用0填充figure;plot((0:63)*64/64,abs(xf(1:64)));grid on;%画图xlabel('KHZ','FontSize',14);ylabel('信号频谱','FontSize',14);%标注XY轴坐标title('信号频谱','FontSize',14);

在这里插入图片描述

下面把连续信号改为3.4,频谱精度为1,这样分辨率就不够了,产生了泄露,从公式上来讲m只能取整数,取不到3.4。

clear;%清除内存close all;%关闭所有图形x=sin(2*pi*(0:63)*3.4/64);%产生某时段的正弦信号;连续信号频率3.4  采样频率64figure;plot(x);%画图grid on;%并打网格title('时域可分信号','FontSize',14);ylabel('x(n)','FontSize',14);xlabel('n','FontSize',14);%标注X轴,Y轴坐标xf=fft(x,64);%FFT(X,N)是N点的FFT,如果X小于0,就用0填充figure;plot((0:63)*64/64,abs(xf(1:64)));grid on;%画图xlabel('KHZ','FontSize',14);ylabel('信号频谱','FontSize',14);%标注XY轴坐标title('信号频谱','FontSize',14);

在这里插入图片描述

现在我们再来更改输入序列,看是否会导致频谱泄露。
现在把输入序列的点数改为201个点,大于了做FFT的64个点。分辨率是1hz

clear;%清除内存close all;%关闭所有图形x=sin(2*pi*(0:200)*3/64);%产生某时段的正弦信号;连续信号频率3  采样频率64figure;plot(x);%画图grid on;%并打网格title('时域可分信号','FontSize',14);ylabel('x(n)','FontSize',14);xlabel('n','FontSize',14);%标注X轴,Y轴坐标xf=fft(x,64);%FFT(X,N)是N点的FFT,如果X小于0,就用0填充figure;stem((0:63)*64/64,abs(xf(1:64)));grid on;%画图xlabel('KHZ','FontSize',14);ylabel('信号频谱','FontSize',14);%标注XY轴坐标title('信号频谱','FontSize',14);

在这里插入图片描述

并不产生DFT泄露。
下面,我们再把输入序列的点数小于做FFT的点数。改为61个输入序列点,发生泄露
clear;%清除内存
close all;%关闭所有图形
x=sin(2pi(0:60)*3/64);%产生某时段的正弦信号;连续信号频率0.5 采样频率10
figure;
plot(x);%画图
grid on;%并打网格
title(‘时域可分信号’,‘FontSize’,14);
ylabel(‘x(n)’,‘FontSize’,14);
xlabel(‘n’,‘FontSize’,14);%标注X轴,Y轴坐标
xf=fft(x,64);%FFT(X,N)是N点的FFT,如果X小于0,就用0填充
figure;
plot((0:63)*64/64,abs(xf(1:64)));
grid on;%画图
xlabel(‘KHZ’,‘FontSize’,14);
ylabel(‘信号频谱’,‘FontSize’,14);%标注XY轴坐标
title(‘信号频谱’,‘FontSize’,14);

在这里插入图片描述

下面我们把采样率也改改,看与FFT的点数有什么关系么?
clear;%清除内存
close all;%关闭所有图形
x=sin(2pi(0:63)*3.5/32);%产生某时段的正弦信号;连续信号频率3.5 采样频率32
figure;
plot(x);%画图
grid on;%并打网格
title(‘时域可分信号’,‘FontSize’,14);
ylabel(‘x(n)’,‘FontSize’,14);
xlabel(‘n’,‘FontSize’,14);%标注X轴,Y轴坐标
xf=fft(x,64);%FFT(X,N)是N点的FFT,如果X小于0,就用0填充
figure;
plot((0:63)*32/64,abs(xf(1:64)));
grid on;%画图
xlabel(‘KHZ’,‘FontSize’,14);
ylabel(‘信号频谱’,‘FontSize’,14);%标注XY轴坐标
title(‘信号频谱’,‘FontSize’,14);
在这里插入图片描述

通过上面的实际仿真,我们验证了DFT泄露有两种原因,

第一原因,就是Fs/N分辨率不够。
第二原因,就是输入序列的点数小于了做FFT的点数。

特别提醒:与输入序列是不是一个周期没有关系!,这种情况依然能够输出正常的DFT。

输入序列是一个完整周期或者非完整周期均可。你不信!我们实验数据来看看。
下面是输入序列N=71个点。肯定不是整的周期吧

在这里插入图片描述

**下面是频谱,清晰可见!没有泄露!!!!!**这里只取了一半
在这里插入图片描述

所以,我们可以得出造成泄露的两大原因:1,点数小于了FFT点数。2 分辨率不够

另外,我们再想一下那个公式k代表啥k,就是代表的就是真实模拟频率!模拟频率如果刚好等于频谱数字化的频率m,落在了分辨率上,那么,就不会造成泄露!
实际信号中,我们的信号频率不可能刚好在一个整数上,说不定是3.11111111hz,不可能刚好精确3hz,所以必然产生分辨力不够的问题,从而必然产生DFT泄露。
这里,我还要额外补充一点,书中说,周期输入信号和非周期输入信号也会导致DFT泄露,这一点,其实是这样的,如果点数足够大于了FFT点数,且满足了频率分辨率的情况下,确实是存在这样的情况,由周期影响,但是,现实生活中,由于噪声总是存在的,根本就没有理想的周期信号,所以一段看似周期的信号都是不能代表原始信号的,所以必然存在频谱泄露。

2、DFT的频率轴

1、以Hz为单位的频率轴

以HZ为单位,Fs/N,即为分辨率,长度为Fs为一个周期循环。

2、以Fs归一化的DFT频率轴

以Fs归一化的DFT,需要将信号的频率f /Fs 进行归一化,最大频率为1,以1为一个循环,分辨率是1/N,单位为周期/样值。

3、使用归一化角度的DFT频率轴

频率变量为w,频率分辨率是2π/N,重复间隔是2π,以2π为一个循环。

转载地址:https://blog.csdn.net/ciscomonkey/article/details/84679424 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:我的书法记录--2018.12.2
下一篇:5.3 FIR低通滤波器的设计

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月25日 06时37分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql in 有序_mysql中的in排序 mysql按in中顺序来排序 2019-04-21
由于连接方在一段时间后没有正确答复或连接的主机_新风换气机使用效果不佳,为何?掌握正确使用方法就好了... 2019-04-21
mysql 查询姓王_MySQL查询语句练习题,测试足够用了 2019-04-21
mysql多实例脚本_mysql多实例脚本 2019-04-21
python如何生成excel文件夹_用python脚本通过excel生成文件夹树结构 2019-04-21
python获取post请求中的所有参数_Django从POST reques获取请求参数 2019-04-21
mysql加密复制_MySQL主从复制使用SSL加密 2019-04-21
python启动远端 exe_python打包exe开机自动启动的实例(windows) 2019-04-21
java当前路径_java获取当前路径的几种方法 2019-04-21
java web传递参数_Javaweb的八种传值方式 2019-04-21
java gui支持的包有哪两个_Java GUI 2019-04-21
java list详解_java集合List解析 2019-04-21
java坐标代码_java实现计算地理坐标之间的距离 2019-04-21
kettle调用java程序_Kettle ETL调用 java代码来进行数据库的增删改查 2019-04-21
mysql 取两个时间差 php_在php和MySql中计算时间差的方法详解 2019-04-21
mysql 重启数据库实例_mysql 单机多实例重启数据库服务 2019-04-21
oracle12c order by,oracle 数据库中order by 的一些高级用法 2019-04-21
oracle8i substr,Oracle中的INSTR,NVL和SUBSTR函数的用法详解 2019-04-21
导出oracle11g的空表,轻松解决oracle11g 空表不能 exp 导出 的问题。 2019-04-21
php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理 2019-04-21