数字信号处理实验~~~~快速傅里叶变换及其应用
- 格式:docx
- 大小:460.08 KB
- 文档页数:13
1. 实验目的及原理
1.1实验目的:
(1)在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉MATLAB中的有关函数。
(2)应用FFT对典型的信号进行频谱分析。
(3)了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。
(4)应用FFT实现序列的线性卷积和相关。
1.2实验原理:
快速傅氏变换(FFT),是离散傅里叶变换的快速算法,它是根据离散傅氏变换的奇,偶,虚,实等特性,对离散傅里叶变换的算法进行改进获得的,根据不同的情况又分为按时间抽取的FFT和频率抽取的FFT,同时还包括N为任意复合数的算法以及Chirp-z变化算法。
2. 实验步骤和内容
(2)衰减的正弦序列
观察衰减正弦序列xb(n)的时域和幅频特性,a=0.1,f=0.0625,检查谱峰出现位置是否正确,注意频谱的形状,绘出幅频特性曲线,改变f,使f分别等于0.4375和0.5625,观察这两种情况下,频谱的形状和谱峰出现位置,有无混叠和泄漏现象?说明产生现象的原因。
MATLAB代码:
clear
x=0:15
a=0.1
f=0.5625
y=exp(-(a.*x)).*sin(2.*pi.*f.*x)
subplot(1,2,1)
stem(x,y)
xk=fft(y,16)
subplot(1,2,2)
stem(x,abs(xk))
f=0.0625
f=0.4375 f=0.5625
(4)一个连续信号含两个频率分量,经采样得
x(n)=sin[2π*0.125n]+cos[2π*(0.125+f)*n] n=0,1,……,N-1
已知N=16,f分别为1/16和1/64,观察其频谱;当N=128时,Δf不变,其结果有何不同,为什么?
MATLAB代码:
N=16
f=1/16
x=0:N-1
y=sin(2*pi*0.125*x)+c os(2*pi*(0.125+f)*x)
xk=fft(y,N)
stem(x,abs(xk))
将N=16,f=1/16依次改为N=16,f=1/64和N=128,f=1/16和N=128,f=1/64。
图:
N=16,f=1/16
N=16,f=1/64
N=128,f=1/16
N=128,f=1/64
(5)用FFT分别计算xa(n)(p=8,q=2)和Xb(n)(a=0.1,f=0.0625)的16点循环卷积和线性卷积。
MATLAB代码:
clear
N=16
x=0:N-1
p=8
q=2
y1=exp(-(x-p).^2/q)
n=0:N-1
a=0.1
f=0.0625
y2=exp(-(a.*n)).*sin(2.*pi.*f.*n)
y3=conv(y1,y2)
subplot(1,2,1)
r=0:2*N-2;
stem(r,y3)
title('线性卷积');
y4=fft(y1)
y5=fft(y2)
rm=real(ifft(y4.*y5));
m=0:N-1
subplot(1,2,2)
stem(m,rm)
title('循环卷积');
图:
(6)产生一512点的随机序列xe(n),并用xe(n)和xe(n)作线性卷积,观察卷积前后xe(n)频谱的变化。要求将xe(n)分成8段,分别采用重叠相加法和重叠保留法。
MATLAB代码:
重叠相加法
Xe=randn(1,512);
output(1:700)=0;
temp2(1:71)=0;
temp1(1:71)=0;
N=8;
for i=1:N if i<5 Xb(i)=i-1;
else
Xb(i)=8-i+1;
end
end
Xbk=fft(Xb,71);
for j=1:8
for k=1:71
if k<65
temp2(k)=Xe(k+64.*(j-1));
else
temp2(k)=0;
end
end
tempk=fft(temp2,71);
temp2=real(ifft(tempk.*Xbk));
output((64*(j-1)+1):64*j)=[temp1(8:64),temp1(65:71)+temp2(1:7)];
temp1=temp2;
if j==8
output((64*j+1):64*(j+1))=temp1(8:71);
end
end
output1(1:519)=output(58:576);
m=0:518;
Xek=fft(Xe,519);
outputk=fft(output1,519);
subplot(2,1,1);
plot(m,Xek(1:519))
title('原频谱图')
subplot(2,1,2);
plot(m,outputk(1:519))
title('卷积后谱图')
图:
重叠保留法
Xe=randn(1,512);
output(1:700)=0;
temp2(1:71)=0;
temp1(1:71)=0;
N=8;
for i=1:N if i<5 Xb(i)=i-1;
else
Xb(i)=8-i+1;
end
end
Xbk=fft(Xb,71);
for j=1:8
for k=1:71
if k<8
if j==1
temp2(k)=0;
else
temp2(k)=Xe(k+64.*(j-1)-8);
end
else
if j==9
temp2(k)=0;
else
temp2(k)=Xe(k-7+64.*(j-1));
end
end
end
tempk=fft(temp2,71);
temp2=real(ifft(tempk.*Xbk));
output((64*(j-1)+1):64*j)=[temp2(8:71)];
end
output1(1:519)=output(1:519);
m=0:518;
Xek=fft(Xe,519);
outputk=fft(output1,519);
subplot(2,1,1);
plot(m,Xek(1:519))
title('原频谱图')
subplot(2,1,2);
plot(m,outputk(1:519))
title('卷积后谱图')
图:
数字信号处理(Digital Sigral Processing)
实验三:
快速傅里叶变换及其应用