北京工业大学信号处理工程应用训练.docx
《北京工业大学信号处理工程应用训练.docx》由会员分享,可在线阅读,更多相关《北京工业大学信号处理工程应用训练.docx(98页珍藏版)》请在冰豆网上搜索。
北京工业大学信号处理工程应用训练
北京工业大学
专业:
通信工程
学生姓名:
刘莹莹
指导教师:
席大林
完成时间:
2021年7月26日
通信系统工程应用训练报告
训练十一DFT性质研究
验证dft函数正确性
设置原始输入信号为x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}},将输入信号x[8]进行DFT正变换,dft(X,x,8,1),输出保存在X[8],如下:
可以看到,输入信号x(n)已经变换到频域X(k),且仍为8位。
再对X[8]进行DFT反变换,dft(x,X,8,-1),重新得到x[8],观察得到的输出与原始输入数据是否相同。
结果如下:
可以看到,输出的x[8]取值仍为x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}},证明经过DFT正反变换后,信号能够恢复原始信号。
根据帕塞瓦尔定理,应有时域、频域总能量相等:
。
经过计算,时域、频域能量和分别为
,证明时域、频域能量和相同,符合帕塞瓦尔定理。
综上,证明DFT变换正确。
A、补0效应研究
原数组:
x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,},{8,0}}
例如程序中补0后数组为:
x2[16]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}
补0方式
我使用的补0方式为:
for(i=8;i<13;i++)x2[i]=COMPLEX(0,0);
补0后数组为:
x2[13]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{0,0},{0,0},{0,0},{0,0},{0,0}}
结果分析与图
在时域中,信号长度增加,由于所增加的项均为零,波形仍与未补0时相同
未补零时的信号时域图
补5个零后的信号时域图补8个零后的信号时域图
经过DFT变换后,X(k)长度也会随着x(n)长度的增加而增加,且增加的值非零
未在末端补零时,信号频谱图
在末端补5个零时,信号频谱图在末端补8个零时,信号频谱图
可以看到,经过补0,经过DFT变换的频谱与未补零时形状根本相同,只是在长度上进行扩展,且补零数量越多,扩展越长。
可以理解为经过补0效应,增加了频域采样频率,但是由于信号未增加新的信息,因此不能提高物理分辨率。
在能量上,补5/8个零时,信号能量时域、频域能量和如下:
时域能量和、频域能量和始终相等,符合帕塞瓦尔定理,且能量与未插值时的相同。
B、插值效应研究
原数组:
x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,},{8,0}}
例如程序中插值后数组为:
x3[16]={{1,0},{8,0},{2,0},{7,0},{3,0},{6,0},{4,0},{5,0},{5,0},{4,0},{6,0},{3,0},{7,0},{2,0},{8,0},{1,0}}
插值方式
我使用的插值方式为:
for(i=0;i<16;i=i+2){x3[i]=COMPLEX(1+i/2,0);x3[i+1]=COMPLEX(i*0.5+2.5,0);}
插值后数组为:
x[16]={{1,0},{3,0},{2,0},{4,0},{3,0},{5,0},{4,0},{6,0},{5,0},{7,0},{6,0},{8,0},{7,0},{9,0},{8,0},{10,0}}
结果分析与图
(1)在例如程序中,在x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}}中反向插入原序列,使原序列变为x3[16]={{1,0},{8,0},{2,0},{7,0},{3,0},{6,0},{4,0},{5,0},{5,0},{4,0},{6,0},{3,0},{7,0},{2,0},{8,0},{1,0}},再进行DFT变换,观察频谱,比照时域、频域能量和。
反向插值后,时域、频域图
可以看到,反向插值后,信号频谱有了很大的直流分量,且近乎左右对称。
从三维频谱图上可以看出,高频、低频局部实际上是共轭反对称:
反向插值后,三维频域图
。
符合帕塞瓦尔定理,且能量是未插值时的2倍。
(2)在x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}}中插入序列{{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0},{10,0}},使原序列变为x3[16]={{1,0},{3,0},{2,0},{4,0},{3,0},{5,0},{4,0},{6,0},{5,0},{7,0},{6,0},{8,0},{7,0},{9,0},{8,0},{10,0}},再进行DFT变换,观察频谱,比照时域、频域能量和。
插值后,时域、频域图
可以看到,插值后,信号频谱有了很大的直流分量,且近乎左右对称。
,符合帕塞瓦尔定理。
(3)在x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}}中正向插入原序列,使原序列分别变为x2[16]={{1,0},{1,0},{2,0},{2,0},{3,0},{3,0},{4,0},{4,0},{5,0},{5,0},{6,0},{6,0},{7,0},{7,0},{8,0},{8,0}},再进行DFT变换,观察频谱,比照时域、频域能量和。
正向插值后,时域、频域图
可以看到,正向插值后,信号频谱有了很大的直流分量,且近乎左右对称。
。
符合帕塞瓦尔定理,且能量是未插值时的2倍。
C、插0效应研究
原数组:
x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,},{8,0}}
例如程序中插0后数组为:
x4[16]={{1,0},{0,0},{2,0},{0,0},{3,0},{0,0},{4,0},{0,0},{5,0},{0,0},{6,0},{0,0},{7,0},{0,0},{8,0},{0,0}}
插0方式
我使用的插0方式为:
for(i=0;i<16;i=i+3){x4[i]=COMPLEX(1+i/2,0);x4[i+1]=COMPLEX(2+i/2,0);x4[i+2]=COMPLEX(0,0);}
插0后数组为:
x4[12]={{1,0},{2,0},{0,0},{3,0},{4,0},{0,0},{5,0},{6,0},{0,0},{7,0},{8,0},{0,0}}
结果分析与图
(1)在例如程序中,在x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}}中,每隔一点,插入1个0值,使原序列分别变为x1[16]={{1,0},{0,0},{2,0},{0,0},{3,0},{0,0},{4,0},{0,0},{5,0},{0,0},{6,0},{0,0},{7,0},{0,0},{8,0},{0,0}},再进行DFT变换,观察频谱,比照时域、频域能量和。
插0前,时域、频域图
插0后,时域、频域图
可以看到,插0后的频谱是对原始信号频谱的周期延拓。
画出三维图像,可以更直观地看出周期延拓关系:
未插入零/插入一个零后的三维频谱图
通过对插零后图像进行DFT运算,可以证明插零后的DFT是原信号DFT的周期延拓。
。
符合帕塞瓦尔定理,且能量与未插值时的相同。
(2)在x[8]={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0}}中,每隔两点,插入1个0值,使原序列变为
x4[16]={{1,0},{2,0},{0,0},{3,0},{4,0},{0,0},{5,0},{6,0},{0,0},{7,0},{8,0},{0,0}},再进行DFT变换,观察频谱,比照时域、频域能量和。
插0后,时域、频域图
符合帕塞瓦尔定理
源程序:
//11yy.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"D:
\xhclgcyy\x_math.cpp"
#include"D:
\xhclgcyy\x_graph.cpp"
voidplotgri2(COLORREFgridcolor,COLORREFlinecolor,COMPLEXp[],intN)
{
inti;
HPENpen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win3.hdc,pen1);
HPENpen2=CreatePen(PS_SOLID,1,linecolor);
for(i=0;iSelectObject(win3.hdc,pen2);
moveto2(0,p[0].r);
for(i=0;iSelectObject(win2.hdc,oldpen);
DeleteObject(pen1);
DeleteObject(pen2);
}
voidplotgri3(COLORREFgridcolor,COLORREFlinecolor,COMPLEXp[],intN)
{
inti;
HPENpen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win3.hdc,pen1);
HPENpen2=CreatePen(PS_SOLID,1,linecolor);
for(i=0;iSelectObject(win3.hdc,pen2);
moveto3(0,p[0].r,p[0].i);
for(i=0;iSelectObject(win2.hdc,oldpen);
DeleteObject(pen1);
DeleteObject(pen2);
}
voidmain()
{
inti;
doublesumT,sumF;
COMPLEXx[8],//{{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,},{8,0}}
X[8],
x2[13],//={{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{0,0},{0,0},{0,0},{0,0},{0,0}}
X2[16],
x3[16],//={{{1,0},{1,0},{2,0},{2,0},{3,0},{3,0},{4,0},{4,0},{5,0},{5,0},{6,0},{6,0},{7,0},{7,0},{8,0},{8,0}}}
X3[16],
x4[12],//={{1,0},{2,0},{0,0},{3,0},{4,0},{0,0},{5,0},{6,0},{0,0},{7,0},{8,0},{0,0}}
X4[16];
//给待变换的复数数组赋值:
for(i=0;i<8;i++){x[i]=COMPLEX(i+1,0);X[i]=COMPLEX(0,0);}
for(i=0;i<8;i++)x2[i]=COMPLEX(i+1,0);
for(i=8;i<13;i++)x2[i]=COMPLEX(0,0);
for(i=0;i<16;i=i+2){x3[i]=COMPLEX(1+i/2,0);x3[i+1]=COMPLEX(1+i/2,0);}
for(i=0;i<16;i=i+3){x4[i]=COMPLEX(1+i/2,0);x4[i+1]=COMPLEX(2+i/2,0);x4[i+2]=COMPLEX(0,0);}
//第1步:
验证dft函数正确性
dft(X,x,8,1);
for(i=0;i<8;i++)printf("X[%d]=%f+%f\n",i,X[i].r,X[i].i);
getch();
dft(x,X,8,-1);
for(i=0;i<8;i++)printf("x[%d]=%f+%f\n",i,x[i].r,x[i].i);
getch();
for(sumT=0,sumF=0,i=0;i<8;i++){
sumT=sumT+x[i].r*x[i].r;
sumF=sumF+X[i].r*X[i].r+X[i].i*X[i].i;}
printf("时域能量和=%f,频域能量和=%f\n",sumT,sumF/8.0);
window2("函数图形显示",-20,40,20,-20,"t","f(t)");
xy2(BLUE);
plotgri2(BLUE,RED,X,8);
getch();
frame2(win2.xstr,win2.ystr);
xy2(BLUE);
plotgri2(BLUE,RED,x,8);
getch();
window3("周期信号频谱图",-1,-12,-12,20,12,12,"N","r","i");
xyz3(BLUE);
plotgri3(BLUE,RED,X,8);
getch();
frame3();
xyz3(BLUE);
plotgri3(BLUE,RED,x,8);
getch();
//第2步:
补0效应
dft(X2,x2,13,1);
for(i=0;i<13;i++)printf("X2[%d]=%f+%f\n",i,X2[i].r,X2[i].i);
getch();
dft(x2,X2,13,-1);
for(i=0;i<13;i++)printf("x2[%d]=%f+%f\n",i,x2[i].r,x2[i].i);
getch();
for(sumT=0,sumF=0,i=0;i<13;i++){
sumT=sumT+x2[i].r*x2[i].r;
sumF=sumF+X2[i].r*X2[i].r+X2[i].i*X2[i].i;}
printf("时域能量和=%f,频域能量和=%f\n",sumT,sumF/16.0);
window2("函数图形显示",-20,40,20,-20,"t","f(t)");
xy2(BLUE);
plotgri2(BLUE,RED,X2,13);
getch();
frame2(win2.xstr,win2.ystr);
xy2(BLUE);
plotgri2(BLUE,RED,x2,13);
getch();
window3("周期信号频谱图",-1,-12,-12,20,12,12,"N","r","i");
xyz3(BLUE);
plotgri3(BLUE,RED,X,13);
getch();
frame3();
xyz3(BLUE);
plotgri3(BLUE,RED,x,13);
getch();
//第3步:
插值效应
dft(X3,x3,16,1);
for(i=0;i<16;i++)printf("X3[%d]=%f+%f\n",i,X3[i].r,X3[i].i);
getch();
dft(x3,X3,16,-1);
for(i=0;i<16;i++)printf("x3[%d]=%f+%f\n",i,x3[i].r,x3[i].i);
getch();
for(sumT=0,sumF=0,i=0;i<16;i++){
sumT=sumT+x3[i].r*x3[i].r;
sumF=sumF+X3[i].r*X3[i].r+X3[i].i*X3[i].i;}
printf("时域能量和=%f,频域能量和=%f\n",sumT,sumF/16.0);
window2("函数图形显示",-20,20,20,-20,"t","f(t)");
xy2(BLUE);
plotgri2(BLUE,RED,X3,16);
getch();
frame2(win2.xstr,win2.ystr);
xy2(BLUE);
plotgri2(BLUE,RED,x3,16);
getch();
window3("周期信号频谱图",-1,-12,-12,20,12,12,"N","r","i");
xyz3(BLUE);
plotgri3(BLUE,RED,X3,16);
getch();
frame3();
xyz3(BLUE);
plotgri3(BLUE,RED,x3,16);
getch();
//第4步:
插0效应
dft(X4,x4,12,1);
for(i=0;i<12;i++)printf("X4[%d]=%f+%f\n",i,X4[i].r,X4[i].i);
getch();
dft(x4,X4,12,-1);
for(i=0;i<12;i++)printf("x4[%d]=%f+%f\n",i,x4[i].r,x4[i].i);
getch();
for(sumT=0,sumF=0,i=0;i<12;i++){
sumT=sumT+x4[i].r*x4[i].r;
sumF=sumF+X4[i].r*X4[i].r+X4[i].i*X4[i].i;}
printf("时域总和=%f,频域总和=%f\n",sumT,sumF/12.0);
window2("函数图形显示",-20,40,20,-20,"t","f(t)");
xy2(BLUE);
plotgri2(BLUE,RED,X4,12);
getch();
frame2(win2.xstr,win2.ystr);
xy2(BLUE);
plotgri2(BLUE,RED,x4,12);
getch();
window3("周期信号频谱图",-1,-12,-12,20,12,12,"N","r","i");
xyz3(BLUE);
plotgri3(BLUE,RED,X4,12);
getch();
frame3();
xyz3(BLUE);
plotgri3(BLUE,RED,x4,12);
getch();
}
训练十二DFT及抽样定理研究
D、给定单频信号抽样
1.对给定信号x(t)=sin(2πfct),fc==50,N=264进行抽样,抽样频率分布为100Hz,110Hz,200Hz,230Hz,250Hz
。
单频信号抽样示意图
关于能量泄露的问题:
1.计算时域能量、频域能量。
观察是否满足Et=Ef=2|X50|2/N,假设抽样频率正确,即无泄漏。
fs=110Hz
fs=200Hz
Fs=230Hz
fs=250Hz
抽样定理指出,假设信号x(t)的最高频率为fc,当抽样频率fs2fc时,可由抽样信号x(nTs)完全恢复原信号x(t)。
此题中,fs≥100Hz,符合采样定理条件。
但在fs=100Hz时,由于采样点均是原信号x(t)取值为0的点,导致采样信号值始终为0,所以时域能量、频域能量始终为0。
其他采样频率时,时域、频域能量始终相等,约为132,符合帕塞瓦尔定理。
实验结果:
抽样频率为110Hz,200Hz时,没有发生能量泄漏,抽样频率为230Hz,250Hz时,发生能量泄漏。
计算是否发生能量泄漏的依据是,计算频率为原信号频率fc=50Hz处的频谱能量,E=2|X50|2/N。
而经过长度为N的DFT变换,对应f=50Hz的k点的计算公式为k=N*fc/fs。
当抽样频率为110Hz和200Hz时,k分别等于120和66,因此只需计算第120点和第66点的能量,就可以计算X50处的能量,不会发生泄漏。
但当抽样频率为230Hz,250Hz时,k不能取到整数值,只能取到近似值,能量会泄漏到周围频率上,会产生能量泄漏,这种泄露是由于非整周期采样引起的。
2.对x(t)=sin(2πfct),fc==50进行fs=250hz的抽样,然后分别进行250点的DFT和补零至256点的FFT,并计算时域能量、频域能量。
观察是否满足Et=Ef=2|X50|2/N,假设抽样频率正确,那么无泄漏。
250点DFT
256点FFT
由实验结果可知,经过DFT、FFT前后均符合帕塞瓦尔定理,即时域、频域能量一致,均为原始信号能量125。
但在用DFT计算X50处的能量时,计算结果与原始信号能量相同,即未发生能量泄漏;在用FFT计算X50处的能量时,计算结果低于原始信号能量,即发生了能量泄漏。
因为取f=50Hz所对应的k值时,k=N*fc/fs。
对250点DFT,k=250*50/250=50,计算k=50这点的能量即可;对256点FFT,k=256*50/250,不能取到整数,因此能量会泄漏到周围的频率区间,即发生能量泄漏。
250点DFT256点FFT
由图可知,DFT在f=50Hz(k=50)的能量即是频谱上的全部能量。
而FFT由于补零之后,k不能取到整数,能量一定会泄漏到周围的频率区间,f=50Hz的能量并不是频谱上的全部能量,而是有其他频率分量,所以只计算f=50Hz处的能量时,会低于频谱上的全部能量。
结论:
所以对于DFT,只要满足k=N*fc/fs可以取到整数,即可实现无能量泄漏。
对于FFT,因为需要补零,所以能量一定会泄漏。
E、画出单频信号抽样后的频谱图F、标出频谱图上的单频信号位置
Fs=110Hz未发生能量泄漏Fs=200Hz未发生能量泄漏
F=50Hz对应k=120F=50Hz对应k=66
fs=230Hz发生能量泄漏fs=250Hz发生能量泄漏
F=50Hz无法对应整数kF=50Hz无法对应整数k
对X(k)信号进行反变换,再次得到x(n),与原始信号相比照,发现无论这五种抽样频率下,均能恢复原始信号。
说明采样频率fs大于信号最高频率fc时,能不失真地恢复原信号,符合帕塞瓦尔定理。
源程序:
//12yy.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"D:
\xhclgcyy\x_math.cpp"
#include"D:
\xhclgcyy\x_graph.cpp"
COMPLEXx[264],Y[264],X50,X[264],x1[264];//{{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,},{8,0}},X[]做完DFT之后的,Y[]是取模之后的DFT,x1[]为反DFT
voidplotgri2(COLORREFgridcolor,C