信号处理的应用与实现实验报告Word文档格式.docx
《信号处理的应用与实现实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《信号处理的应用与实现实验报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
可以用函数H=Freqz(num,den,w)计算;
可以用函数U=fft(u,N)和u=ifft(U,N)计算N点序列的DFT正、反变换。
因此,设置产生一个正弦波信号,该信号有含有50Hz和100Hz和200Hz三种频率,如:
y=cos(2*pi*50*ns*ts)+cos(2*pi*100*ns*ts)+cos(2*pi*200*ns*ts),
对此信号可进行时域和频域的显示和分析,通过对其进行傅里叶变换,可得到其的频谱图,并在处理分离显示出这三个独立的频谱分量。
2.程序设计如下:
%实验一DFT频谱分析
clc;
fs=500;
%设抽样频率为500Hz
ts=1/fs;
%抽样周期
T=1;
%时间
ns=1:
T/ts;
%序列长度
y=cos(2*pi*50*ns*ts)+cos(2*pi*100*ns*ts)+cos(2*pi*200*ns*ts);
%产生含三不同频率的信号
N=length(y);
%计算N点DFT
n=0:
1:
N-1;
k=n;
WN=exp(-j*2*pi/N);
nk=n'
*k;
WNnk=WN.^nk;
xk=y*WNnk;
figure;
%绘图
subplot(2,1,1)
plot(ns*ts,y);
title('
图一 该信号波形'
);
xlabel('
Time/s'
)
ylabel('
幅度'
%figure;
subplot(2,1,2)
plot(1:
N/2,xk(1:
N/2));
图二 各频率分量(50Hz&
100Hz&
200Hz)'
频率/Hz'
3.产生图形如下:
4.试验总结:
通过本次实验采用的抽样频率为600hz,本次实验图形主要是对信号y=cos(2*pi*50*ns*ts)+cos(2*pi*100*ns*ts)+cos(2*pi*200*ns*ts)进行时域和频域(傅里叶变换后的频谱图和三个频率分量50hz、100hz、200hz的频谱绝对值)进行图形显示,通过它们,我们可以认识到该正弦波信号的时域、频域特征。
【2】实验二
设计一个实验,利用Chrip-z变换,分析信号任意指定频带之间的频谱。
(1)待分析信号为现实中的信号,如语音信号;
也可以用MATLAB仿真产生;
(2)要分析的频带可以任意指定。
1.实验设计
(1)实验目的:
设计一个利用czt变换对原信号进行任意指定频率细化的实验,获得比整个频率范围的频率分辨率更高的频率分辨率,从而观察频谱中的细微部分。
(2)实验内容:
用MATLAB仿真产生一个信号,然后显示该信号,对该信号90-120Hz的范围内的频谱进行细化,输出直接FFT变换所得的图像和czt细化后的图像。
(3)实验原理:
Chirp-Z变换是一种在Z平面上沿着螺旋线轨道计算有限时宽的Z变换方法。
基本原理是在折叠频率范围内,任意选择起始频率和结束频率分辨率,在这有限带宽里对样本信号进行Z变换。
Chirp-Z变换原理:
已知有限长序列x(n)(0≤n≤N-1)的z变换为:
为适应z变换可以沿z平面更一般的路径取值,现沿z平面的一段螺线作等分角的采样,采样点为zk,可表示为
zk=AW-k,k=0,1…M-1
其中
,
M为采样点的总数,不一定与x(n)的长度N相等。
A为采样轨迹的起始点位置,由它的半径A0及相角θ0确定。
通常A0≤1,否则z0将处于单位圆|z|=1的外部。
W为螺线参数,W0表示螺线的伸展率,W0>
1时,随着k的增加螺线内缩,W0<
1则随k的增加螺线外伸。
φ0是采样点间的角度间隔。
由于φ0是任意的,减小φ0就可提高频率分辨率,这对分析具有任意起始频率的高分辨率窄带频谱是很有用的。
z变换在这些采样点的值为
,k=0,1…M-1
将zk=AW-k代入,则得
直接计算这一公式,与直接计算DFT相似,当N和M数值很大时,运算量会很大。
为了提高运算速度,可对上式做进一步分析处理,首先把kn变成求和项,即
kn=1/2[n2+k2-(k-n)2]
于是
令
,n=0,1…N-1
则
fs=256;
%抽样频率
N=600;
%点数
M=256;
f1=90;
%频率展开起始点
f2=120;
%频率展开结束点
e=fs/N;
%%抽样时间间隔
n1=0:
e:
(fs/2)-e;
x=2*cos(2*pi*100*n/fs)+5*cos(2*pi*101.45*n/fs)+3*cos(2*pi*102.3*n/fs);
subplot(3,1,1);
plot(n,x);
Time/t'
value'
MATLAB产生的信号的时域波形'
XK=abs(fft(x));
%FFT变换
subplot(3,1,2);
stem(n1,XK(1:
(N/2)));
axis([f1,f2,0,1500]);
Frequency/Hz'
原信号直接FFT变换后的频谱'
w=exp(-j*2*pi*(f2-f1)/(fs*M));
a=exp(j*2*pi*f1/fs);
xk=czt(x,M,w,a);
h=0:
M-1;
f0=(f2-f1)/M*h+f1;
subplot(3,1,3);
stem(f0,abs(xk));
利用CZT进行细化后的频谱'
3.所得图形如下:
4.实验总结
通过本次实验,很好的掌握了CZT的原理和应用,特别是使用CZT对频率区域的细化以提高分辨率有了很好的理解。
【1】实验三
编写基-2按时间抽选的FFT算法程序。
并将之与直接算法的运算时间进行比较。
(1)用x=[1234]的DTF验证所编程序的正确性。
(2)产生一个10000个点的序列,求其DFT。
比较所编程序、matlab自带的FFT程序以及用直接计算所用的时间。
1.试验原理
本实验目的主要目的为比较DFT和FFT算法之间的计算量的大小,故主要原理在于分析怎么实现FFT算法,并且验证其是否正确。
然后比较FFT和DFT直接计算以及系统自带的FFT三者计算耗时,以检验FFT的优越性!
由于Matlab语言掌握不好,本实验在Linux下用C语言自行编写了DFT和FFT两个算法的实现,并对比两者之间的计算耗时。
2.程序设计
/*DFT直接算法与按时抽选FFT算法的比较*/
#include<
stdlib.h>
stdio.h>
time.h>
math.h>
#definePI3.1415927
voidtest_fft(void);
//用x=[1234]的DFT验证所实现的FFT算法正确性
voidtest_time(void);
//两种算法的用时
voiddft(intnpt,floatxr[],floatxi[],floatXR[],floatXI[],intinv);
//DFT变换的实现(直接计算)
voidfft(intn,floatx[],floaty[]);
//FFT算法的实现
intmain(void)
{
printf("
测试x=[1234]的FFT和DFT:
\n"
);
test_fft();
printf("
测试1000点的FFT与DFT时间对比:
test_time();
return0;
}
voidtest_fft(void)
inti;
floatxr[4],xi[4],Xr[4],Xi[4];
for(i=0;
i<
4;
i++)//生产x=[1234]
{
xr[i]=i+1;
xi[i]=0;
}
printf("
fft:
//计算FFT
fft(4,xr,xi);
i++)
%6.1f%6.1f\n"
xr[i],xi[i]);
ifft:
dft:
//计算DFT
dft(4,xr,xi,Xr,Xi,0);
Xr[i],Xi[i]);
idft:
dft(4,Xr,Xi,xr,xi,1);
voidtestTime(void)
inti,start,end;
float*xr,*xi,*Xr,*Xi;
xr=malloc(1000,sizeof(float));
xi=malloc(1000,sizeof(float));
Xr=malloc(1000,sizeof(float));
Xi=malloc(1000,sizeof(float));
1000;
xr[i]=i;
//fft要求N为2的幂
start=clock();
fft(1000,xr,xi);
end=clock();
1000点FFT用时:
t=%fs\n"
(float)(end-start)/CLK_TCK);
dft(10000,x