北京工业大学通信系统工程应用训练报告专业:通信工程学生姓名:刘莹莹指导教师:席大林完成时间:2016年4月29日目录训练十一 DFT性质研究 (1)训练十二 DFT及抽样定理研究 (13)训练十三数字滤波器制作 (20)训练十四 IIR数字滤波器设计与实现 (25)训练十五线性卷积计算 (46)训练十六 FIR数字滤波器设计与实现 (55)训练十一 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]=COM PLEX(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 : Defines the entry point for the console application.//#include "stdafx.h"#include"D:\xhclgcyy\x_math.cpp"#include"D:\xhclgcyy\x_graph.cpp"void plotgri2(COLORREF gridcolor,COLORREF linecolor,COMPLEX p[],int N){int i;HPENpen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win3.hdc,pen1); HPEN pen2=CreatePen(PS_SOLID,1,linecolor);for(i=0;i<N;i++)line2(i,0,i,abs(p[i]));SelectObject(win3.hdc,pen2);moveto2(0,p[0].r);for(i=0;i<N;i++)lineto2(i,abs(p[i]));SelectObject(win2.hdc,oldpen);DeleteObject(pen1);DeleteObject(pen2);}void plotgri3(COLORREF gridcolor,COLORREF linecolor,COMPLEX p[],int N){int i;HPENpen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win3.hdc,pen1); HPEN pen2=CreatePen(PS_SOLID,1,linecolor);for(i=0;i<N;i++)line3(i,0,0,i,p[i].r,p[i].i);SelectObject(win3.hdc,pen2);moveto3(0,p[0].r,p[0].i);for(i=0;i<N;i++)lineto3(i,p[i].r,p[i].i);SelectObject(win2.hdc,oldpen);DeleteObject(pen1);DeleteObject(pen2);}void main(){int i;double sumT,sumF;COMPLEX x[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]=COM PLEX(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。