实验三 FFT及其在卷积计算和谱分析中的应用

目录

一、实验目的

二、实验内容

三、实验思考


一、实验目的

1.在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉FFT子程序;

2.熟练掌握FFT实现两个序列的线性卷积的方法;

3.熟悉应用FFT进行信号频谱分析过程中可能出现的问题以便在实际中正确应用FFT;

4. 学习用FFT对连续信号进行谱分析的方法和参数选择原则;

5.掌握用FFT对连续信号进行谱分析时,由模拟信号采样得到序列的

X(k) = DFT[x(n)]中 k 值与模拟信号实际频率 f 或 W 的对应关系。

二、实验内容

1.已知序列 x(n)=12,1,1,12,利用FFT计算线性卷积 x(n)*x(n) ,并画出相应的图形。

clc,clear,close all
xn=[1/2,1,1,1/2];
Xk=fft(xn,7);
Yk=Xk.*Xk;
yn=ifft(Yk);
subplot(211)
stem(yn)
xlabel('n');
ylabel('xn*xn');
title('利用fft计算线性卷积');
ynn=conv(xn,xn);
subplot(212)
stem(ynn);
xlabel('n');
ylabel('xn*xn');
title('利用conv函数计算线性卷积');

2.对如下模拟周期信号用FFT进行谱分析

x(t)=cos8πt+cos16πt+cos20πt

选择Fs=64Hz,对变换区间 N=16,32,64 三种情况进行谱分析,并回答相应的问题。

  1. 用stem绘制三种情况下的幅频特性曲线fk~X(k),图中要求显示三种情况的频谱分辨率 F各是多少Hz。
clc,clear,close all
Fs=64;
Ts=1/Fs;
N1=16;
N2=32;
N3=64;
n1=0:1:N1-1;
n2=0:1:N2-1;
n3=0:1:N3-1;
x1=cos(8*pi*n1*Ts)+cos(16*pi*n1*Ts)+cos(20*pi*n1*Ts);
x2=cos(8*pi*n2*Ts)+cos(16*pi*n2*Ts)+cos(20*pi*n2*Ts);
x3=cos(8*pi*n3*Ts)+cos(16*pi*n3*Ts)+cos(20*pi*n3*Ts);
X1=fft(x1,N1);
X2=fft(x2,N2);
X3=fft(x3,N3);

subplot(311)
stem(n1/N1/Ts,abs(X1)/max(abs(X1)));
ylabel("X1  F=4");
xlabel("fk(Hz)");
subplot(312)
stem(n2/N2/Ts,abs(X2)/max(abs(X2)));
ylabel("X2  F=2");
xlabel("fk(Hz)");
subplot(313)
stem(n3/N3/Ts,abs(X3)/max(abs(X3)));
ylabel("X3  F=1");
xlabel("fk(Hz)");

问题 3-1:检查 N=16,32,64 三种情况下谱峰的出现位置,说明哪个是正确的,哪个是不正确的?为什么?

答:N=16不正确,N=32、64是正确的。频率分辨率F=2, Tp应该大于等于1/2,而N=16时,Tp=1/4,所以得到的频谱不正确。

问题 3-2:观察幅频谱图,根据分辨率F读出信号x(n)含有的频率分量分别是多少 Hz?

答:4Hz,8Hz,10Hz,54Hz,56Hz,60Hz。

(2)用plot绘制三种情况的功率谱曲线fk~X(k)。

幅频谱:|X(k)| = abs (Xk)

功率谱:PSD(k)=|X(k)|2/N=X(k)X*(k)/N;

Matlab 语句:PSD = Xk.*conj(Xk)/N;

clc,clear,close all
Ts=1/64;
N1=16;
N2=32;
N3=64;
n1=0:1:N1-1;
n2=0:1:N2-1;
n3=0:1:N3-1;
x1=cos(8*pi*n1*Ts)+cos(16*pi*n1*Ts)+cos(20*pi*n1*Ts);
x2=cos(8*pi*n2*Ts)+cos(16*pi*n2*Ts)+cos(20*pi*n2*Ts);
x3=cos(8*pi*n3*Ts)+cos(16*pi*n3*Ts)+cos(20*pi*n3*Ts);
X1=fft(x1,N1);
X2=fft(x2,N2);
X3=fft(x3,N3);
P1=X1.*conj(X1)/N1;
P2=X2.*conj(X2)/N2;
P3=X3.*conj(X3)/N3;
subplot(311)
plot(n1/N1/Ts,abs(P1));
ylabel("P1(DB) F=4");
xlabel("fk(Hz)");
subplot(312)
plot(n2/N2/Ts,abs(P2));
ylabel("P2(DB) F=2");
xlabel("fk(Hz)");
subplot(313)
plot(n3/N3/Ts,abs(P3));
ylabel("P3(DB) F=1");
xlabel("fk(Hz)");

问题 3-3:注意观察频谱的形状和谱峰出现位置,检查有无混叠和泄漏现象?说明产生现象的原因。

    答:存在混叠现象。由于不满足奈奎斯特采样定理,在Fs确定条件下,在采样之前未进行预滤波,所以使高于Fs/2的成分折叠而发生混叠。存在泄露现象,由于对原信号进行截断,产生截断效应,使得离散谱线展宽,使其它无频率成分处有了频率成分。

(3)为减少泄露,提高频谱分辨率,另取N值,观察谱分辨率、频谱泄露的改善情况。

clc,clear,close all
Ts=1/64;
N1=128;
N2=512;
N3=2048;
n1=0:1:N1-1;
n2=0:1:N2-1;
n3=0:1:N3-1;
x1=cos(8*pi*n1*Ts)+cos(16*pi*n1*Ts)+cos(20*pi*n1*Ts);
x2=cos(8*pi*n2*Ts)+cos(16*pi*n2*Ts)+cos(20*pi*n2*Ts);
x3=cos(8*pi*n3*Ts)+cos(16*pi*n3*Ts)+cos(20*pi*n3*Ts);
X1=fft(x1,N1);
X2=fft(x2,N2);
X3=fft(x3,N3);
PSD1=X1.*conj(X1)/N1;
PSD2=X2.*conj(X2)/N2;
PSD3=X3.*conj(X3)/N3;
subplot(311)
plot(n1/N1/Ts,abs(PSD1));
ylabel("PSD(DB)  F=1");
xlabel("fk(Hz)");
subplot(312)
plot(n2/N2/Ts,abs(PSD2));
ylabel("PSD(DB)  F=0.5");
xlabel("fk(Hz)");
subplot(313)
plot(n3/N3/Ts,abs(PSD3));
ylabel("PSD(DB)  F=0.25");
xlabel("fk(Hz)");

说明,在绘制幅频特性曲线时需注意以下两点:

注意1:

用 DFT(FFT)对模拟信号分析频谱时,需将 X(k)的自变量 k 换算成对应的模拟频率 fk 并作为横坐标绘图,以便于观察频谱。这样,不管变换区间 N 或 Tp取信号周期的几倍,画出的频谱图中有效离散谐波谱线所在的频率值不变。

如图 3-2 所示,

fk=kF=kNTs=kTp,k=0,1⋯N-1

注意2:

对于由截取得到的序列xn,其长度为 N 时,它的DFT 定义为:

X(k)=n=0N-1x(n)WNkn,WN=e-j2πN

可见随着截取长度导致的 N 值的增大,所计算出来的同一模拟信号的幅频特性幅度值会随着变换区间 N 的变化而变化。为避免幅度值随变换区间 N 变化的缺点,实际上在分析频谱时最好给出对最大值归一化的幅度值。如:stem(fk,abs(Xk)/max(abs(Xk)))。

三、实验思考

1)已知模拟信号x(t)=cos(2πft),其中f=50Hz,用DFT(FFT)对此模拟信号分析频谱时,若采样间隔为Ts,采样后的序列x(n)的长度为N, X(k)=DFT[x(n)] ,则k=1对应的连续频率fk为多少?

用 DFT(FFT)对模拟信号分析频谱时,需将 X(k)的自变量k换算成对应的模拟频率fk并作为横坐标绘图,以便于观察频谱。k=1对应的连续频率fk=1/NTs

2)对于周期序列,如果周期信号的周期预先不知道,如何使用FFT进行谱分析?

可以先截取预定点数进行DFT,再逐渐将截取长度扩大截取,比较结果,如果二者的差别满足分析误差要求,则可以进行谱分析。

猜你喜欢

转载自blog.csdn.net/yyfloveqcw/article/details/124345110