E、画出单频信号抽样后的频谱图 F、标出频谱图上的单频信号位置
Fs=110Hz未发生能量泄漏 Fs=200Hz未发生能量泄漏 F=50Hz对应k=120 F=50Hz对应k=66
fs=230Hz发生能量泄漏 fs=250Hz发生能量泄漏
F=50Hz 无法对应整数k F=50Hz 无法对应整数k
对X(k)信号进行反变换,再次得到x(n),与原始信号相对比,发现无论这五种抽样频率下,均能恢复原始信号。说明采样频率fs大于信号最高频率fc时,能不失真地恢复原信号,符合帕塞瓦尔定理。
源程序:
// 12yy.cpp : Defines the entry point for the console application. //
#include \
#include\#include\
COMPLEX
x[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
void plotgri2(COLORREF gridcolor,COLORREF linecolor,COMPLEX p[],int N)
{ int i;
HPEN pen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win3.hdc,pen1); HPEN pen2=CreatePen(PS_SOLID,1,linecolor); //for(i=0;i SelectObject(win3.hdc,pen2); for(i=0;i SelectObject(win2.hdc,oldpen); DeleteObject(pen1); DeleteObject(pen2); } void chouyang(int N,double fs,int fc) //对正弦信号进行抽样 { int i; double t=0,dt; dt=1.0/fs; for(i=0;i void main(void) { int N=264;//数据长度 int i,fc=50,fs=110,down,up;//fs可变fs=100hz;fs=110hz;fs=200hz;fs=230hz;fs=250hz double sumT,sumF,dt,aa,bb,bb1,EX50; for(i=0;i window2(\函数图形显示\ //抽样出来的x[n]显示 window2(\函数图形显示\xy2(GREEN);//画xy轴。 plotgri2(BLUE,RED,x,264);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch(); frame2(); //对做完DFT的X[n]取模之后显示 for(i=0;i<264;i++) Y[i]=abs(X[i]); window2(\函数图形显示\xy2(GREEN);//画xy轴。 plotgri2(BLUE,BLUE,Y,264);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch(); frame2(); for(sumT=0,sumF=0,i=0;i<264;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\//求是否有频谱泄露 aa=50*N/fs; //aa:50HZ处对应的点; down=floor(aa);//向下取整 X50=Y[down]; EX50=pow(abs(X50),2)*2/N; printf(\运算%f\\n\getchar(); //求反DFT看是否可以恢复出原函数: dft(x1,X,264,-1); window2(\函数图形显示\xy2(GREEN );//画xy轴。 plotgri2(BLUE,RED,x1,264);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch(); frame2(); //验证DFT及其频谱泄露情况 N=250; fs=250; for(i=0;i chouyang(N,fs,fc);//对信号进行抽样,抽样频率为250hz,抽样点数为250点 window2(\函数图形显示\xy2(RED);//画xy轴。 plotgri2(BLUE,BLUE,x,250);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch(); frame2(); dft(X,x,250,1);//做250点DFT for(i=0;i<250;i++) Y[i]=abs(X[i]); window2(\函数图形显示\xy2(RED);//画xy轴。 plotgri2(BLUE,BLUE,Y,250);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch(); frame2(); for(sumT=0,sumF=0,i=0;i<250;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\//看是否有泄漏 aa=50*N/fs; //aa:50HZ处对应的点; down=floor(aa);//向下取整 X50=Y[down]; EX50=pow(abs(X50),2)*2/N; printf(\ printf(\运算%f\\n\getchar(); //验证反DFT可不可以恢复原信号 dft(x,X,250,-1); window2(\函数图形显示\xy2(RED);//画xy轴。 plotgri2(BLUE,BLUE,x,250);//宏函数工具方式,注意x是形式上的宏参数,它指明后面函数的自变量。 getch();
相关推荐: