对于DFT频谱泄漏问题的研究
问题简介:
对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱。但是,在实际利用DFT求它的频谱时,对时域做了截断,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱线出现,它们可以理解为是从fs频率上“泄漏”出去的,这种现象称 为频谱“泄漏”。
不发生泄露的条件:F_c=(mF_s)/N (m为整数,F_c为信号频率,F_s为采样频率)
现象分析:
以7K采样为例:
DFT本质是以一个离散的窗函数对信号进行取样,也就是在时域相乘的过程。时域相乘又等价于频域的卷积,并对频域的幅值产生影响,在这里只需要讨论频谱形态而不必讨论幅值,由于本次采样周期为500点,我们画出一个500点矩形序列的频谱图
可以看出每个频域的每个小峰宽度都为14Hz,理论上说他们的间隔应为
Fs/N=7000/500=14
与理论相符合
下一步是与信号的频谱进行卷积,由于原信号的理论频谱为在F_c及〖-F〗_c的冲激信号,我们只要将目前的频谱向左向右移动F_c即可,为了方便,只研究右半块。
时域采样率为F_s那么在频域中就以F_s/N=7000/500=14Hz,从零点开始等间隔取样,而调制过的信号每个小峰的宽度也为F_s/N=7000/500=14Hz,主峰的宽度为小峰宽度的两倍,也就是28Hz,此时在主峰中会以357*14=4998Hz及358*14=5012Hz进行采样,并且在小峰中也会在峰体中采样,从而显出原信号不存在的频率。
小峰宽度与频域采样宽度相等这就表明每个频域取样点可以正好落在每个小峰的零点上,而落在最高峰的中间,完美显示出原信号的频谱分布,此时采样信号频率应满足:
F_c=(mF_s)/N (m为整数)
如果采样频率不满足这一公式,那么频率域采样点就会处于各个旁瓣中,从而在频域中表现出原信号不存在的频率,这些旁瓣的幅值与原信号频率距离成反比,越靠近信号频率造成的谐波振幅越大。
改进措施
增大FFT变换的点数N。 通过增大N,一方面提高频域分辨率,更大可能满足F=m*Fs/N, 另一方面,压缩采样信号的瓣宽,降低泄露水平。
下图为以不同采样点数得出的频谱:
可以明显看出500点采样比64点采样效果好很多。
选用合适的窗函数。根据不同的需求来选择不同特性的窗函数,主瓣宽但旁瓣衰减大的窗或是主瓣窄但旁瓣相对衰减小的窗。
选取7K, 64点采样的频域信号进行测试,选取常用的Hanning窗:
可以看出虽然加窗可以很好地抑制旁瓣,但对于主瓣的频率却不能很好地优化,我也试了一下其他的加窗函数,都不太理想,对于本题测试的窄带信号,主瓣的信号尤为重要,只能采用增加取样点的方法来凸显主瓣信号。、
总结
- 要注意理论与实际的差异,并善于思考其中的原因
- 善于运用优质网络资源
参考文档:https://www.ni.com/white-paper/4844/zhs/
附c++采样程序:
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
double Fs_7 =7,Fs_10=10,Fs_11=11;//K
int i;
int const dn = 10;//延时滤波器长度
int const s_n =500 ; //序列长度
double xn[500];
for (i = 0; i<s_n; i++)
{
xn[i] =sin(2 * 3.1416 * 5 / Fs_7 * i);
}
ofstream SaveFile_a("xn_7.txt");
for (i = 0; i<s_n; i++)
SaveFile_a << " " << xn[i] << endl;
SaveFile_a.close();
for (i = 0; i<s_n; i++)
{
xn[i] = sin(2 * 3.1416 * 5 / Fs_10 * i);
}
ofstream SaveFile_a1("xn_10.txt");
for (i = 0; i<s_n; i++)
SaveFile_a1 << " " << xn[i] << endl;
SaveFile_a1.close();
for (i = 0; i<s_n; i++)
{
xn[i] = sin(2 * 3.1416 * 5 / Fs_11 * i);
}
ofstream SaveFile_a1("xn_11.txt");
for (i = 0; i<s_n; i++)
SaveFile_a1 << " " << xn[i] << endl;
SaveFile_a1.close();
}
Matlab程序
显示采样过信号的频谱:
xn_f=fopen('xn_7.txt','r');
[xn,count]=fscanf(xn_f,'%f');
fclose(xn_f);
Fs=7000;
x=xn;
x=x.*hamming(64);%加窗
x = x(:,1);
x = x';
N = length(x);%
t = (0:N-1)/Fs;%
y = fft(x);
f = Fs/N*(0:round(N/2)-1);
stem(f,abs(y(1:round(N/2))));
xlabel('Frequency / (s)');ylabel('Amplitude');
title('7K²ÉÑùµÄƵÆ×');
grid;
显示采样矩形序列频谱:
Fs=7000;
x=boxcar(500);%生成矩形序列
x = x(:,1);
x = x';
N = length(x);
y = fft(x,1000);
y=circshift(y,143,2);
y=abs(y)/10;
f1 = Fs/length(y)*(0:length(y)-1);
plot(f1,y);
xlabel('Frequency / (s)');ylabel('Amplitude');
title('ÐÅºÅµÄÆµÆ×');
grid;
对于DFT频谱泄漏问题的研究的更多相关文章
- Release编译模式下,事件是否会引起内存泄漏问题初步研究
题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...
- GDI 对象的释放与内存泄漏的问题研究
最近写了一个GDI 绘图的程序,过程中遇到一个奇怪的问题,就是 定时器定时一会GDI绘的图就消失了..后来经过分析,原来是 GDI对象数量过多 ,即GDI对象超过10000个 导致内存泄漏的问题.找到 ...
- 正余弦信号的DFT频谱分析
一般的,对正余弦信号进行採样并DFT运算,画出频谱图,会发现频谱并不干净.这样的现象称为频谱泄漏.由于DFT运算仅仅能是有限序列,突然的截断产生了泄漏. 会有这种特殊情况.当採样截取的刚好是整数个周期 ...
- L230 RF可靠性测试-RF指标
最近调试Zigbee 和2.4G产品时需要做一些认证,查找到常用的RF指标. ----------http://www.52rd.com/S_TXT/2016_5/TXT83303.htm------ ...
- 基于MFCC的语音数据特征提取概述
1. 概述 语音是人类之间沟通交流的最直接也是最快捷方便的一种手段,而实现人类与计算机之间畅通无阻的语音交流,一直是人类追求的一个梦想. 伴随着移动智能设备的普及,各家移动设备的厂家也开始在自家的设备 ...
- 经典功率谱估计及Matlab仿真
原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...
- (转) 经典功率谱估计及Matlab仿真
原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...
- [NLP-ASR] 语音识别项目整理(一) 语音预处理
简介 之前参与过114对话系统的项目,中间搁置很久,现在把之前做过的内容整理一下,一是为自己回顾,二是也希望分享自己看的内容,中间也遇到一些问题,如果您可以提一些建议将不胜感激. 114查询主要分 ...
- 语音信号的梅尔频率倒谱系数(MFCC)的原理讲解及python实现
梅尔倒谱系数(MFCC) 梅尔倒谱系数(Mel-scale FrequencyCepstral Coefficients,简称MFCC).依据人的听觉实验结果来分析语音的频谱, MFCC分析依据的听觉 ...
随机推荐
- Hey,man,are you ok? -- 关于心跳、故障监测、lease机制
电话之于短信.微信的一个很大的不同点在于,前者更加及时,有更快速直接的反馈:而后面两个虽然称之为instant message,但经常时发出去了就得等对方回复,等多久是不确定的.打电话能明确知道对方在 ...
- maven多环境部署
1.首先在maven的pom.xml文件中添加profiles标签,然后分别添加3个不同环境的profile, 本例中添加了dev.test.product三个环境,这个可以根据自己的需要添加和减少. ...
- j2ee基础(1)servlet的生命周期
Servlet的生命周期 Servlet 生命周期规定了 Servlet 如何被加载.实例化.初始化. 处理客户端请求,以及何时结束服务. 该生命周期可以通过 javax.servlet.Servle ...
- python入门(13)获取函数帮助和调用函数
Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...
- 修改hosts 流畅使用coursera
以管理员权限打开 C盘 -> Windows-> System32 -> drives -> etc -> hosts文件 在hosts文件最后写入 52.84.246 ...
- 使用 C#/.NET Core 实现单体设计模式
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要 ...
- HRBUST1522【单调队列+DP】
题目:输入一个长度为n的整数序列(A1,A2,--,An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大. #include<stdio.h> #include<s ...
- python Django知识点总结
python Django知识点总结 一.Django创建项目: CMD 终端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令: 通过类创 ...
- 智能提示含查询多列(html+JS+handler+ HttpRemoting)一、html示列 加 JS加 请求 Handler
<html> <head> </head> <body> <form id="recordform" name="r ...
- [论文阅读] ImageNet Classification with Deep Convolutional Neural Networks(传说中的AlexNet)
这篇文章使用的AlexNet网络,在2012年的ImageNet(ILSVRC-2012)竞赛中获得第一名,top-5的测试误差为15.3%,相比于第二名26.2%的误差降低了不少. 本文的创新点: ...