我是靠谱客的博主 调皮铃铛,最近开发中收集的这篇文章主要介绍实验三 FFT 及其在卷积计算和谱分析中的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、[实验目的]

1 .在理论学习的基础上,通过本实验,加深 FFT 的理解,熟悉 FFT 子程序;
2 .熟练掌握 FFT 实现两个序列的线性卷积的方法;
3 .熟悉应用 FFT 进行信号频谱分析过程中可能出现的问题以便在实际中正
确应用 FFT
4. 学习用 FFT 对连续信号进行谱分析的方法和参数选择原则;
5.掌握用 FFT 对连续信号进行谱分析时,由模拟信号采样得到序列的中 k 值与模拟信号实际频率 f 或Ω的对应关系。

二、[实验原理]

FFT 并不是与 DFT 不同的另一种变换,而是为了减少 DFT 运算次数的一种
DFT 快速算法。常用的 FFT 是基 2 算法,其长度 N=2^M 。当要变换的序列长
度不等于 2 的整数次幂时,为了使用以 2 为基数的 FFT,可以用末位补零的方
法,使其长度延长至 2 的整数次幂。其应用一般都以卷积运算的具体计算为依据,
或者以 DFT 作为连续傅里叶变换的近似为基础。

1.用 FFT 计算线性卷积

用 FFT 可以实现两个序列的循环卷积,其原理框图如图 3-1。一般情况,设
两个序列的长度分别为 N1 和 N2,循环卷积等于线性卷积的充要条件是 FFT 的
长度 N 满足:N≥N1+N2,对于长度不足 N 的两个序列分别将他们补零延长到 N。

 

              图 1.用 FFT 计算循环卷积的原理框图

2.用 FFT 对信号进行频谱分析

MATLAB 提供了快速傅里叶变换算法 FFT 计算 DFT 的函数 fft,其调用格
式如下:
Xk = fft(xn, N) Xk = fft(xn)
参数 xn 为被变换的时域序列向量,N 是 DFT 变换区间长度,当 N 大于 xn 长
度时,fft 函数自动在 xn 后面补零。当 N 省略时,fft 函数按 xn 的实际长度计
算,此时,相当于 DFT 的计算。
在运用 DFT 进行频谱分析的过程中可能产生三种误差:混叠、泄漏、栅栏
效应,具体概念详见教材。其中需要注意的是减少栅栏效应(提高频谱密度)与
提高 DFT 频率分辨率是不同的两个概念,减小栅栏效应的一个有效方法就是借
助于在原序列的末端补零。补零只能减轻栅栏效应,不能提高 DFT 的频率分辨
率。

3.模拟信号的频谱分析

(1)模拟信号的采样及 DFT 谱分析的原对模拟周期信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。用 DFT 分析模拟信号谱的原理如图 3-2 所示。
序列 x(n)的傅里叶变换和连续信号频谱的关系可以表示为:

上式说明:可以通过对连续信号采样并进行 DFT 再乘以 Ts,近似得到模拟信号 频谱的周期延拓函数在第一个周期[0,Fs]上的 N 点等间隔采样
​​​​​​​

 

图 2 用 DFT 分析模拟信号谱的原理示意图
(2) 模拟信号进行谱分析时的参数选择问题 对模拟信号进行谱分析时,有几个重要的参数要选择:采样频率 Fs、频率分 辨率 F、DFT 的长度 N、模拟信号的截取时长 Tp=N*Ts。 要提高谱分辨率,又保持谱分析的范围不变(Fs 采样频率不变),只能增长 纪录时间 Tp(截取长度),增加采样点数 N。
(3)周期信号谱分析时对截取长度 Tp 的要求
对模拟周期信号用 DFT(FFT)作谱分析,要求有两点:一是截取的长度 Tp 是周期的整数倍;二是采样频率满足采样定理,且满足每个周期中采样点数相等。 这样得到的离散谱才能代表离散信号的频谱。否则会有相当大的谱分析误差。如 果不知道信号周期,可以尽量选择信号的观察时间长一些。

三、实验内容

1.已知序列

利用 FFT 计算线性卷积 ,并画 出相应的图形

实验代码如下:
clc,clear,close all
N=8;
n=0:N-1;
xn=[1/2,1,1,1/2];
xk=fft(xn,N);
yk=xk.*xk;
yn=ifft(yk,N);
yn1=conv(xn,xn);
subplot(211) stem(n,yn);
grid on;
title('循环卷积计算线性卷积');
xlabel('n');
ylabel('x(n)*x(n)');
subplot(212)
n1=0:1:6;
stem(n1,yn1);
grid on;
title('直接计算线性卷积');
xlabel('n');
ylabel('x(n)*x(n)');
循环卷积计算线性卷积

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

 选择 Fs=64Hz,对变换区间 N=16,32,64 三种情况进行谱分析,并回答相 应的问题。 说明,在绘制幅频特性曲线时需注意以下两点:

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

注意 2:
对于由截取得到的序列 x(n),其长度为 N 时,它的 DFT 定义为:

可见随着截取长度导致的 N 值的增大,所计算出来的同一模拟信号的幅
频特性幅度值会随着变换区间 N 的变化而变化。为避免幅度值随变换区间 N
变化的缺点,实际上在分析频谱时最好给出对最大值归一化的幅度值。如:
stem(fk,abs(Xk)/max(abs(Xk)))。
(1)用 stem 绘制三种情况下的幅频特性曲线 fk~X(k),图中要求显示三种
情况的频谱分辨率 F 各是多少 Hz。
问题 3-1: 检查 N=16,32,64 三种情况下谱峰的出现位置,说明哪个是正
确的,哪个是不正确的?为什么?
问题 3-2: 观察幅频谱图,根据分辨率 F 读出信号 x(n)含有的频率分量分
别是多少 Hz?
实验代码如下:
clc,clear,close all xn=[0.5,1,1,0.5];
Xk=fft(xn,4);
Yk=Xk.*Xk;
yn=ifft(Yk);
n=0:3;
figure(1);
stem(n,yn, '*' , 'LineWidth' ,1);
grid on
title( 'Xn 的线性卷积' );
xlabel( 'n' );
ylabel( 'yn' );
%xt=cos(8*pi*t)+cos(16*pi*t)+cos(20*pi*t);
Fs=64;
T=1/Fs;
N=16;
n=0:N-1;
xnT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
x16k=fft(xnT,16);
Tp=N*T;
F=1/Tp;
K=0:N-1; fk1=-32:4:28;
figure(2)
subplot(311)
stem(fk1,abs(x16k));
grid on
title([ 'Xn16 点 FFT 频谱分辨率 F=' ,num2str(F)]);
xlabel( 'k' );
ylabel( 'Xk' );
A=32;
n=0:A-1;
xnT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
x32k=fft(xnT,32);
Tp1=A*T;
F1=1/Tp1;
fk2=-32:2:30;
subplot(312)
stem(fk2,abs(x32k));
grid on
title([ 'Xn32 点 FFT 频谱分辨率 F=' ,num2str(F1)]);
xlabel( 'k' ); ylabel( 'Xk' );
B=64;
n=0:B-1;
xnT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T);
x64k=fft(xnT,64);
Tp2=B*T;
F2=1/Tp2;
fk3=-32:1:31;
subplot(313)
stem(fk3,abs(x64k));
grid on
title([ 'Xn64 点 FFT 频谱分辨率 F=' ,num2str(F2)]);
xlabel( 'k' );
ylabel( 'Xk' );
figure(3)
subplot(311)
PSD1k=x16k.*conj(x16k)/16;
plot(PSD1k); grid on
title( 'N=16 功率谱曲线' );
xlabel( 'k' );
ylabel( 'PSD1k' );
subplot(312)
PSD2k=x32k.*conj(x32k)/32;
plot(PSD2k);
grid on
title( 'N=32 功率谱曲线' );
xlabel( 'k' );
ylabel( 'PSD2k' );
subplot(313)
PSD3k=x64k.*conj(x64k)/64;
plot(PSD3k);
grid on
title( 'N=64 功率谱曲线' );
xlabel( 'k' );
ylabel( 'PSD3k' ); 实验结果如下:

                                                图 4Xn 的线性卷积结果

                              图 5Xn 等于 163264 的频谱特性图

问题 3-1: 检查 N=16,32,64 三种情况下谱峰的出现位置,说明哪个是正
确的,哪个是不正确的?为什么?
问题 3-2: 观察幅频谱图,根据分辨率 F 读出信号 x(n)含有的频率分量分
别是多少 Hz?
问题 3-1 答:N=16 是不正确的,N=32、64 是正确的。因为 T=1/2,所以 Tp
应该取大于等于 1/2,而 N=16 时,Tp=1/4,所以得到的频谱不正确。
问题 3-2 答:根据 F 读出的频率分别为 4Hz,8 Hz,10 Hz,54 Hz,56 Hz,60 Hz
(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;
问题 3-3: 注意观察频谱的形状和谱峰出现位置,检查有无混叠和泄漏现象?
说明产生现象的原因。
实验代码如下:
clc;clear;close all
Fs=64;
Ts=1/Fs;
N1=16;N2=32;N3=64;
t1=0:Ts:Ts*(N1-1);
t2=0:Ts:Ts*(N2-1);
t3=0:Ts:Ts*(N3-1);
n1=0:N1-1;
n2=0:N2-1;
n3=0:N3-1; xt1=cos(8*pi*t1)+cos(16*pi*t1)+cos(20*pi*t1);
xt2=cos(8*pi*t2)+cos(16*pi*t2)+cos(20*pi*t2);
xt3=cos(8*pi*t3)+cos(16*pi*t3)+cos(20*pi*t3);
xk1=fft(xt1,N1);
xk2=fft(xt2,N2);
xk3=fft(xt3,N3);
subplot(311)
PSD1=xk1.*conj(xk1)/N1;
plot((Fs/N1)*n1,PSD1)%功率谱
grid on
title("N=16,F=4 的功率谱")
xlabel('f/Hz')
ylabel('功率')
subplot(312)
PSD2=xk2.*conj(xk2)/N2;
plot((Fs/N2)*n2,PSD2)
grid on
title("N=32,F=2 的功率谱") xlabel('f/Hz')
ylabel('功率')
subplot(313)
PSD3=xk3.*conj(xk3)/N3;
plot((Fs/N3)*n3,PSD3)
grid on
title("N=64,Tp=2 个周期,F=1 的功率谱")
xlabel('f/Hz')
ylabel('功率')
实验结果如下:

                     图 6 N=16,32,64 时功率谱曲线 fk~X(k)

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

问题 3-3 答:有混叠现象,产生原因:在 Fs 确定条件下,在采样之前没有进
行滤波,所以使高于 Fs/2 的成分折叠而发生混叠。
有泄露现象,产生原因:由于对原信号进行截断,产生截断效应,使得离散
谱线展宽,使其它无频率成分处有了频率成分。
(2)为减少泄露,提高频谱分辨率,另取 N 值,观察谱分辨率、频谱泄露的
改善情况。
实验代码如下:
clc;clear;close all
Fs=64;
Ts=1/Fs;
N1=64;N2=128;N3=256;
t1=0:Ts:Ts*(N1-1);
t2=0:Ts:Ts*(N2-1);
t3=0:Ts:Ts*(N3-1);
n1=0:N1-1;
n2=0:N2-1;
n3=0:N3-1;
xt1=cos(8*pi*t1)+cos(16*pi*t1)+cos(20*pi*t1);
xt2=cos(8*pi*t2)+cos(16*pi*t2)+cos(20*pi*t2);
xt3=cos(8*pi*t3)+cos(16*pi*t3)+cos(20*pi*t3); xk1=fft(xt1,N1);
xk2=fft(xt2,N2);
xk3=fft(xt3,N3);
subplot(311)
PSD1=xk1.*conj(xk1)/N1;
plot((Fs/N1)*n1,PSD1)%功率谱
grid on
title("N=64,F=4 的功率谱")
xlabel('f/Hz')
ylabel('功率')
subplot(312)
PSD2=xk2.*conj(xk2)/N2;
plot((Fs/N2)*n2,PSD2)
grid on
title("N=128,F=2 的功率谱")
xlabel('f/Hz')
ylabel('功率') subplot(313)
PSD3=xk3.*conj(xk3)/N3;
plot((Fs/N3)*n3,PSD3)
grid on
title("N=256,Tp=2 个周期,F=1 的功率谱")
xlabel('f/Hz')
ylabel('功率')
实验结果如下:
                               图 7.N=64,128,256 时功率谱密度
因此,为减少泄露,提高频谱分辨率,应该增大 N。此处取 N 分别为 64, 128,256

最后

以上就是调皮铃铛为你收集整理的实验三 FFT 及其在卷积计算和谱分析中的应用的全部内容,希望文章能够帮你解决实验三 FFT 及其在卷积计算和谱分析中的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部