基于DFT的信号识别系统
班级:10级信息工程
一、实验目的
(1) 通过实验巩固离散傅立叶变换DFT的认识和理解。
(2) 熟练掌握应用DFT进行频谱分析的方法。
(3) 理解DFT离散频谱分析的应用价值。
二、实验内容
在语音识别、雷达信号处理、生物医学信号检测与识别等应用领域广泛使用基于离散傅立叶变换的谱分析技术。一个典型的信号识别系统如下图:
设系统的输入信号x(n)是具有单一频谱峰值的正弦信号,短时矩形窗将信号截短为有限长,经过DFT变换得到频谱,频率检测器检测频谱最大峰值的位置,即对应的频率,然后由分类器识别信号的类别。分类器的分类判决规则为:
第一类:最大峰值频率分布范围(Hz)为0≤f≤200。
第二类:最大峰值频率分布范围(Hz)为200≤f≤500。
第三类:最大峰值频率分布范围(Hz)为500≤f≤1000。
第四类:最大峰值频率分布范围(Hz)为f≥1000。
设采样频率fs=10000Hz,短时矩形窗宽度为N=1000,短时加窗信号经过DFT可以得到连续频谱在0≤ω<2范围内的1000个取样点。
(1)编程实现该系统
(2)输入信号x(n)=1.2sin(0.08πn),理论计算并画出0≤f≤fs范围的幅度谱,标出峰值频率,观察系统的实际识别结果,分析其正确性。
(3)输入信号x(n)=1.5+3cos(0.5πn),理论计算并画出0≤f≤fs范围的幅度谱,标出峰值频率,观察系统的实际识别结果,分析其正确性。
(4)输入信号x(n)=0.7sin(0.14πn),理论计算并画出0≤f≤fs范围的幅度谱,标出峰值频率,观察系统的实际识别结果,分析其正确性。
(5)输入信号x(n)=1.2cos(0.5πn)+ 9.5sin(0.02πn),理论计算并画出0≤f≤fs范围的幅度谱,标出峰值频率,观察系统的实际识别结果,分析其正确性。
(6)输入信号x(n)=cos(0.102πn),理论计算并画出0≤f≤fs范围的幅度谱,标出峰值频率,观察系统的实际识别结果,分析其正确性。
三、实验理论分析
设x(n)是长度为N的有限长信号,信号仅仅分布在[0,N-1]区间,而在其他的时间下值为0。那么,该信号的离散傅立叶变换定义如下:
, k=0~N-1
f与k存在以下关系
又因为ω=2π*k/N,所以有f=ωfs/2π。以此为依据对输入信号作如下理论分析:
(1) 输入信号为x(n)=1.2sin(0.08πn)时,在f=ωfs/2π =400Hz出现峰值,则该信号是第二类信号。
(2) 输入信号为x(n)=1.5+3cos(0.5πn)时,存在直流分量但是不存在正弦分量,峰值出现在f=ωfs/2π=0Hz 或f=2500Hz。但是因为直流分量不仅使笫1条谱线(0频率)有很大的值,同时由于泄漏的存在,对低频部分造成影响,所以一般频谱分析要去掉0频率,所以最大峰值出现在f=2500Hz。
(3) 输入信号为x(n)=0.7sin(0.14πn)时,在f=ωfs/2/π=700Hz出现峰值,则该信号是第三类信号。
(4) 输入信号为x(n)=1.2cos(0.5πn)+ 9.5sin(0.02πn)时,峰值出现在f=ωfs/2π=2500Hz 或f=100Hz,因为幅值9.5>1.2,所以应该出现在100Hz处,则此信号是第一类信号。
(5) 输入信号为x(n)=cos(0.102πn)时,在f=ωfs/2π=510Hz出现峰值,则此信号是第三类信号
四、实验结果
1.matlab编程实现DFT变换,生成一个函数,在使用是进行调用函数即可。具体程序如下:
function FH=DFT(A,a,B,b,C)
fs=10000; %采样点频率
N=1000; %采样点个数
n=0:(N-1);
x=A*cos(a*pi*n)+B*sin(b*pi*n)+C; %定义一般性的输入信号
y=x; %定义一个y数组
s=0; %初始化s,用于记录最大峰值
FH=[0,0,0]; %将返回值定义为数组用于返回多个数
for k=1:N %进行离散傅里叶变换
y(k)=0;
n=1;
while(n
y(k)=x(n)*exp(-j*2*pi*(k-1)*(n-1)/N)+y(k);
n=n+1;
end
if k
if s<=abs(y(k)) %最大峰值
s=abs(y(k));
m=k-1; %最大峰值处的值
end
end
end
f=fs*m/N; %最大峰值处的频率
FH=[m,f,s]; %返回最大峰值处的k,最大峰值处的频率,最大峰值
k=0:N-1;
plot(k*10,abs(y)); %画出频谱图
end
2.具体信号输入matlab进行检测:
a.x(n)=1.2sin(0.08πn)
通过matlab程序测试如下:
点:k=40 频率:f=400 Hz 幅值600
最大峰值频率为400Hz,属于第2类信号。
与理论值相同,则结果正确。
b.x(n)=1.5+3cos(0.5πn)
通过matlab程序测试如下:
点:k=250 频率:f=2500Hz 幅值1500
最大峰值频率为2500 Hz,属于第4类信号。
与理论值相同,则结果正确。
c.x(n)=0.7sin(0.14πn)
通过matlab程序测试如下:
点:k=70 频率:f=700Hz 幅值350
最大峰值频率为700 Hz,属于第3类信号。
与理论值相同,则结果正确。
d.x(n)=1.2cos(0.5πn)+ 9.5sin(0.02πn)
通过matlab程序测试如下:
点:k=10 频率:f=100Hz 幅值4750 最大峰值频率为100 Hz,属于第1类信号。
与理论值相同,则结果正确。
e.x(n)=cos(0.102πn)
通过matlab程序测试如下:
点:k=51 频率:f=510Hz 幅值500
最大峰值频率为510 Hz,属于第3类信号。
与理论值相同,则结果正确。
综合上述五个信号的DFT变换,matlab检测结果与理论分析是一致的,则该程序正确,可以实现检测最大频谱的功能。
五、思考题
1.当矩形窗长度比1000小,例如32,以上实验内容(6)可能出现什么情况?
随着短时窗长度N的减小,出现失真情况。
以上述第一个信号为例:
N=500时:
N=100时:
N=32时:
由此可见,随着N的减少,会出现失真现象,且N越小,失真现象就越严重。
2. 当输入信号x(n)=cos(0.199πn)+0.9sin(0.204πn)时,系统能够得到正确的识别结果吗?为什么?
不能得出正确的识别结果。
Matlab检测如下:
Matlab的检测结果如下:
点k=102 频率f=1020Hz 幅值514.3
此信号属于第四类信号。
但是根据理论分析,峰值出现在f=ωfs/2π=995Hz 或f=1020Hz,因为幅值1>0.9,所以最大峰值应该出现在995Hz处。500 =< 995 <1000,应该属于第三类。
因为窗的宽度N为1000,f=10k(Hz),频率分量都为10的倍数,频率的分辨率不够,所以不能分辨出995Hz的频率分量,而是被其它频率分量的组合所代替,从而1020Hz被matlab检测出来,判定为第四类。
如果将窗的宽度扩大为2000,频率分辨率扩大,包含有995Hz这一频率分量,系统就能够正确的识别结果,得出正确的结论:
ans=
199.0000 995.0000 557.9079
点:k=199 频率:f=995Hz 幅值557.9079
最大峰值频率为995 Hz,属于第3类。
与理论值相同,系统正确识别结果。
3. 如果输入信号x(n)中含有叠加性宽带噪声e(n)会影响识别结果么?为什么?
可能是会有影响。
设混叠后的信号为s(n),则s(n)=x(n)+e(n);所以S(K)=X(K)+E(K),因此S(K)^2= S(K)S(K)*=X(K )^2+E(K)^2。两边求算术平方根得S(K)=。所以如果输入信号中含有叠加性宽带噪声,且噪声较大,则有可能会影响识别结果。
A. 例如x(n) =1.2*sin(0.08*pi*n)+randn(1,1000),matlab的检测如下:
ans =
40.0000 400.0000 572.1710
由此可见,当噪声相对于原来信号不是很大时,对该检测不会产生影响,但是对检测出的最大幅度会有影响。
B.例如x(n) =1.2*sin(0.08*pi*n)+10*randn(1,1000),matlab的检测如下:
ans =
1.0e+003 *
0.2130 2.1300 1.1027
由此可见,当噪声相对于原来信号十分大时,对检测的结果就会产生影响。
4. 如果系统中的DFT需要更新为FFT,并且短时窗不变,则FFT计算时应该做哪儿些考虑?对识别结果会产生什么影响?
当DFT更新为FFT时,要短时窗不变,在计算的时候应该考虑以下几个方面:
1. FFT中要求信号长度是2的整数幂,现在N=1000点,则须将其改为2的整数幂,如1024。
2. 应该将信号序列分为偶序列X0(K)和奇序列X1(K)两个长度相等的序列,
奇序列X1(K)和偶序列X0(K)的短时窗长度都将变为N/2=512点,而不再是N=1024;
3. 奇序列X1(K)和偶序列X0(K)的K值取值范围为K=0~N/2-1;,当N/2≤K<N时,应该利用X0(K)、X1(K)的周期性特征,即X0(K)= X0(K-N/2),X1(K)=X1(K-N/2)。如k=1024,则需要进行(1024/2)log21024=5120次复数乘法运算。
4. 对识别结果的频谱分析和时间分辨率不会造成影响,但是可以可以提高频率分辨率。
六、总结
通过本次实验,巩固了对DFT的认识和理解,并且有了更加深入的了解。掌握了应用DFT进行频谱分析,了解DFT离散频谱分析的应用价值,同时对于DFT以及FFT之间的关系有了更加清晰的理解。
通过本次实验,对于matlab这一款用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言有了一定的了解,具备了用matlab进行编程的一些基本能力,掌握了更多灵活多变的函数调用方法以及生产图形的方法。
本文来源:https://www.2haoxitong.net/k/doc/331bad1f0b4e767f5acfce65.html
文档为doc格式