实验要求:
- 离散信号及离散系统的MATLAB编程实现(2学时)
- 要求:
- 编写一程序,输出一定长度(点数),具有一定幅度、(角)频率和初始相位的实(或复)信号序列,如复指数序列;
- 利用matlab,求系统y(n)-0.8y(n-1)-0.5y(n-2)=0.7x(n)+0.3(n-1)的零极点。
- 目的:
- 熟悉MATLAB命令和编辑、运行、调试环境;
- 学会编写MATLAB程序(.m文件)
- 要求:
实验报告:
一、实验内容
i.设计一个最小阶次的低通FIR数字滤波器,性能指标为:通带0Hz~1500Hz,阻带截止频率2000Hz,通带波动不大于1%,阻带波动不大于1%,采样频率为8000Hz;
ii.用一个仿真信号来验证滤波器的正确性(注意:要满足幅度要求和线性相位特性)。
二、实验目的
i.利用学习到的数字信号处理知识解决实际问题;
ii.了解线性相位滤波器的特殊结构;
三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况)
Windows系统 Matlab 2022b
四、实验记录
1.原理基础
FIR(有限脉冲响应)滤波器是一种数字滤波器,其脉冲响应在有限的时间内衰减为零。FIR滤波器通过一系列加权系数的线性组合对输入信号进行卷积,以产生输出信号。对于低通FIR滤波器,它允许低频信号通过并抑制高频信号。
线性相位FIR滤波器具有对称或反对称的系数,这保证了滤波器在所有频率上具有相同的相位延迟,这对于避免信号失真非常重要。
设计FIR滤波器时,常用的方法有窗函数法、最小二乘法(如firls函数)和等波纹法(如remez函数)。这些方法通过最小化通带和阻带内的误差来优化滤波器的性能。
2 实验流程
①确定滤波器参数:
包括采样频率、通带和阻带截止频率、通带和阻带波动等。
②设计FIR滤波器:
使用MATLAB的firls或remez函数设计满足性能要求的FIR滤波器。
③生成仿真信号:
创建一个包含通带和阻带频率分量的仿真信号。
④应用滤波器:
使用MATLAB的filter函数将设计的FIR滤波器应用于仿真信号。
⑤分析滤波结果:
绘制原始信号和滤波后信号的频谱图,检查通带和阻带的波动是否满足要求,并验证滤波器的线性相位特性。
3 源程序代码
%名称:模拟信号采样与重构及频谱分析FFT
%结构:1.模拟信号的采样 2.生成复合信号并绘制时域和频域 3.应用滤波器并绘制时域频域
%编辑人:贾雯爽
%目的:掌握模拟信号的采样、重构和频谱分析
%最后更新时间:2024/06/05
%模拟信号采样、重构、频谱分析
%1.模拟信号的采样(参数设置、创建模拟信号、信号采样、绘制图像)
%1.1 设置参数
Fs = 1000;%采样频率
A = 1;%幅度
f0 = 5;%频率
t = 0:1/Fs:1-1/Fs;%时间向量
%1.2 信号生成
x = A*sin(2*pi*f0*t);
%1.3 信号采样
Ts = 1/Fs;
t_sample = 0:Ts:1-Ts; % 采样时间点
x_sample = A*sin(2*pi*f0*t_sample);
% 第四步:绘制原始信号和采样信号
figure;
subplot(3,1,1);
plot(t, x);
title('原始模拟信号');
xlabel('时间 (s)');
ylabel('幅度');
subplot(3,1,2);
stem(t_sample, x_sample, 'filled');
title('采样信号');
xlabel('时间 (s)');
ylabel('幅度');
%2.信号重构(模拟)
%2.1 模拟信号重构
t_recon = linspace(0, 1, Fs*10); % 用于重构的更细粒度时间向量
x_recon = interp1(t_sample, x_sample, t_recon, 'linear'); % 线性插值
%2.2 绘制信号重构
subplot(313);
plot(t_recon, x_recon);
title('重构模拟信号');
xlabel('时间(s)');
ylabel('幅度');
%3.频谱分析(fft) 原始信号与分析后信号对比
%3.1 对原始信号进行FFT频谱分析
N = length(t);
X = fft(x, N);
P2 = abs(X/N);%转换为单边谱
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(N/2))/N; % 频率向量
% 3.2绘制原始信号的频谱
figure;
subplot(211);
plot(f, P1);
title('原始模拟信号的频谱');
xlabel('频率 (Hz)');
ylabel('|P(f)|');
% 3.3对采样信号进行FFT
N_sample = length(t_sample);
X_sample = fft(x_sample, N); % 使用与原始信号相同的FFT长度
%取单边频谱的流程
P2_sample = abs(X_sample/N);
P1_sample = P2_sample(1:N/2+1);
P1_sample(2:end-1) = 2*P1_sample(2:end-1);
% 3.4绘制采样信号的频谱
subplot(212);
plot(f, P1_sample);
title('采样信号的频谱');
xlabel('频率 (Hz)');
ylabel('|P(f)|');
% 程序结束
4 实验结果
5实验结果分析
i. 对于复指数序列,可以观察到序列的周期性、幅度、频率和相位的变化。这些参数对信号分析和处理非常重要。
ii. 通过对系统差分方程零点和极点的分析,可以了解系统的稳定性和动态特性。在本例中,极点都位于单位圆内,说明系统是稳定的。此外,零点的位置可以影响系统的频率响应特性。通过零极点图,可以直观地看到系统的零点和极点在复平面上的位置,从而进一步分析系统的性能。
五、实验总结
本次实验着重点有两个;①熟悉Matlab的使用操作,包括文件建立、路径添加等。②熟练掌握复指数序列的概念并掌握通过差分方程推到H(z),进一步进行零极点分析的过程。
零极点对数字信号处理系统的性能有着重要作用,稳定性,因果性,低通高通等……
原创文章内容,学术不精恐有错漏之处,恳请各位批评指正。如有Matlab代码源文件或其他沟通需要,可通过邮箱(2642610289@qq.com)联系我,特情注意,学业繁忙难以及时回复,敬请理解。