数字信号处理实验:IIR数字滤波器设计及软件实现

news2024/9/21 9:24:05

目录

一、实验目的

二、实验原理

三、实验设备

四、实验内容及步骤

五、实验结果及分析

六、实验主程序框图及程序清单

七、实验总结


一、实验目的

  1. 熟悉用双线性变换法设计IIR数字滤波器的原理与方法;
  2. 学会调用MATLAB信号处理工具箱中滤波器设计函数(或滤波器设计分析工具FDATool)设计各种IIR数字滤波器,学会根据滤波需求确定滤波器指标参数。
  3. 掌握IIR数字滤波器的MATLAB实现方法。
  4. 通过观察滤波器输入、输出信号的时域波形及其频谱,建立数字滤波的概念

二、实验原理

数字滤波器是对数字信号实现滤波的线性时不变系统。数字滤波实质上是一种运算过程,实现对信号的运算处理。输入数字信号(数字序列)通过特定的运算转变为输出的数字序列,因此,数字滤波器本质上是一个完成特定运算的数字计算过程,也可以理解为是一台计算机。描述离散系统输出与输入关系的卷积和差分方程只是给数字信号滤波器提供运算规则,使其按照这个规则完成对输入数据的处理。时域离散系统的频域特性:​​​​​​​​​​​​​​

其中、分别是数字滤波器的输出序列和输入序列的频域特性(或称为频谱特性),是数字滤波器的单位取样响应的频谱,又称为数字滤经过滤波后的频域响应。只要按照输入信号频谱的特点和处理信号的目的,适当选择,使得滤波后满足设计的要求,这就是数字滤波器的滤波原理。

设计IIR数字滤波器一般采用间接法(脉冲响应不变法和双线性变换法),应用最广泛的是双线性变换法。基本设计过程是:① 将给定的数字滤波器的指标转换成过渡模拟滤波器的指标;② 设计过渡模拟滤波器;③ 将过渡模拟滤波器系统函数转换成数字滤波器的系统函数。MATLAB信号处理工具箱中的各种IIR数字滤波器设计函数都是采用双线性变换法。第6章介绍的滤波器设计函数butter、cheby1 、cheby2 和ellip可以分别被调用来直接设计巴特沃斯、切比雪夫1、切比雪夫2以及椭圆模拟与数字滤波器。本实验要求读者调用如上函数直接设计IIR数字滤波器。

本实验的数字滤波器的MATLAB实现是指调用MATLAB信号处理工具箱函数 filter对给定的输入信号x(n)进行滤波,得到滤波后的输出信号y(n)。

三、实验设备

计算机  Matlab软件

四、实验内容及步骤

  1. 调用信号产生函数mstg产生由三路抑制载波调幅信号相加构成的复合信号st,该函数还会自动绘图显示st的时域波形和幅频特性曲线,如图2.1所示。由图可见,三路信号时域混叠无法在时域分离。但频域是分离的,所以可以通过滤波器的方法在频域分离,这就是本实验的目的。

2.要求将st中三路调幅信号分离,通过观察st的幅频特性曲线,分别确定可以分离st中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波器)的通带截止频率和阻带截止频率。要求滤波器的通带最大衰减为0.1dB, 阻带最小衰减为60 dB。

3.编程序调用MATLAB滤波器设计函数ellipord和ellip分别设计这三个椭圆滤波器,并绘图显示其损耗函数曲线。 

4.调用滤波器实现函数filter,用三个滤波器分别对信号产生函数mstg产生的信号st进行滤波,分离出st中的三路不同载波频率的调幅信号y1(n)、y2(n)和y3(n), 并绘图显示y1(n)、y2(n)和y3(n)的时域波形,观察分离效果。

实验结果及分析

1.调用信号产生函数mstg产生由三路抑制载波调幅信号相加构成的复合信号st,该函数还会自动绘图显示st的时域波形和幅频特性曲线,如图2.1所示。由图可见,三路信号时域混叠无法在时域分离。但频域是分离的,所以可以通过滤波器的方法在频域分离,这就是本实验的目的。

(1)程序运行所得波形(代码见程序清单)

​​​​​​​​​​​​​​

(2)结果分析

这个函数生成了三路调幅信号并将它们相加,最后将产生的混合信号在时域和频域上绘制出图像。

在本函数中,采样频率为10kHz,产生三路调幅信号的载波频率分别为1000Hz、500Hz、250Hz,而调制信号频率则分别为100Hz、50Hz、25Hz。产生的三路信号分别通过正弦波和载波信号相乘的方式得到,且三路信号的调幅方案均为幅度调制。

绘图部分将产生的混合信号在时域和频域上直观地展现出来。其中,时域波形显示在第一个子图中,横轴为时间,纵轴为信号幅度,此处限定了横轴范围仅为采样时间的1/8,使得波形更加清晰。第二个子图中呈现了混合信号的幅频特性,即频谱图,其中横轴为频率,纵轴为信号的幅度,由于幅度峰值可能大于1,因此在绘图前将幅度归一化到最大值为1。

通过对程序的分析,我们可以看到该程序以MATLAB语言实现了生成并展示三路调幅信号的功能,方便用户对其进行研究和分析。

2.滤波器的设计:

要求将st中三路调幅信号分离,通过观察st的幅频特性曲线,分别确定可以分离st中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波器)的通带截止频率和阻带截止频率。要求滤波器的通带最大衰减为0.1dB, 阻带最小衰减为60 dB。

编程序调用MATLAB滤波器设计函数ellipord和ellip分别设计这三个椭圆滤波器,并绘图显示其损耗函数曲线。 

(1)首先讨论对于滤波器参数选取,由1可知,三路调幅信号的载波频率分别为250Hz,500Hz,1000Hz。带宽为50Hz,100Hz,200Hz。所以分离混合信号st中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波器)的指标参数选取如下:

对载波频率为250Hz的调幅信号,用低通滤波器分离,其通带截止频率fp=280Hz,通带最大衰减ap=0.1dB,阻带截止频率为fs=450Hz,阻带最小衰减as=60dB。对载波频率为500Hz的调幅信号,用低通滤波器分离,其通带截止频率fpl=440Hz、fph=560Hz,通带最大衰减ap=0.1dB,阻带截止频率为fsl=275Hz、fsh=900Hz阻带最小衰减as=60dB。对载波频率为1000Hz的调幅信号,用低通滤波器分离,其通带截止频率fp=890Hz,通带最大衰减ap=0.1dB,阻带截止频率为fs=600Hz,阻带最小衰减as=60dB。

(2)程序运行波形

I 低通椭圆滤波器耗损函数曲线

II 带通椭圆滤波器耗损函数曲线

 III 高通椭圆滤波器耗损函数曲线

(2)结果分析

这段程序,通过调用函数mstg生成由三路抑制载波调幅信号相加构成的复合信号s,并对该信号进行椭圆滤波器的低通、带通、高通滤波、绘制出时域图和频谱图。

具体步骤如下:

调用mstg()函数生成长度为1600的由三路抑制载波调幅信号相加构成的复合信号s;

设置采样频率Fs=10000,采样间隔T=1/Fs;

分别设置低通、带通、高通滤波器的通、阻带边界频率;

该代码主要的功能之一是对由三路抑制载波调幅信号相加构成的混合信号进行滤波处理,得到低通、带通、高通三种处理后的信号。在处理过程中,使用了椭圆滤波器设计算法,并结合MATLAB中的相关函数实现。最后,通过绘制时域和频域波形图,直观地展示了滤波前后的信号变化。

3.调用滤波器实现函数filter,用三个滤波器分别对信号产生函数mstg产生的信号st进行滤波,分离出st中的三路不同载波频率的调幅信号y1(n)、y2(n)和y3(n), 并绘图显示y1(n)、y2(n)和y3(n)的时域波形,观察分离效果。

(1)代码见程序清单

具体的函数调用代码

  1. fp=280; fs=450;wp=2*fp/Fs;ws=2*fs/Fs; %低通
  2. name='y_1(t)';LHL_filter(wp,ws,name,st,T,'low');
  3. fp_L=440; fp_R=560;fs_L=275; fs_R=900;%带通
  4. wp=[2*fp_L/Fs,2*fp_R/Fs];ws=[2*fs_L/Fs,2*fs_R/Fs];
  5. name='y_2(t)'; LHL_filter(wp,ws,name,st,T,'bandpass');
  6. fp=890; fs=600;wp=2*fp/Fs;ws=2*fs/Fs; %高通
  7. name='y_3(t)';LHL_filter(wp,ws,name,st,T,'high');

(2)所得波形

I 低通y1(n)时域波形

II 带通y2(n)时域波形

III 高通信号y3(n)时域波形

(3)结果分析

在上面的代码中,已经使用椭圆滤波器对信号进行了低通、带通、高通三种不同性质的滤波,并得到了滤波后的三个不同信号y1(t)、y2(t)和y3(t)。

根据滤波后的结果和时域波形图,我们可以看出:

低通滤波器提取的是载波频率最低的调幅信号,所以y1(t)中的调幅信号频率最低;

带通滤波器提取的是载波频率在中间范围内的调幅信号,所以y2(t)中的调幅信号频率居于中间;

高通滤波器提取的是载波频率最高的调幅信号,所以y3(t)中的调幅信号频率最高。

因此,通过这些滤波器的组合,我们可以有效地将复合信号分离出三路不同频率的调幅信号。

实验主程序框图及程序清单

1.实验主程序框图

2. 程序清单

(代码进行了高亮处理)

(1)程序一:产生mstg信号

首先新建mstg.m文件,在该脚本文件中运行function st=mstg

  1.  function st=mstg
    %产生信号st,并显示st的时域波形和频谱
    %st=mstg返回混合信号,长度N=1600
    N=1600  %长度
    Fs=10000;T=1/Fs;Tp=N*T;   %采样频率Fs=10KHz,Tp为采样时间
    t=0:T:(N-1)*T;k=0:N-1;f=k/Tp;
    fc1=Fs/10;     %第1路调幅信号的载波频率fc1=1000Hz?
    fm1=fc1/10;    %第1路调幅信号的调制信号频率fm1=100Hz
    fc2=Fs/20;     %第2路调幅信号的载波频率fc2=500Hz??
    fm2=fc2/10;    %第2路调幅信号的调制信号频率fm2=50Hz
    fc3=Fs/40;     %第3路调幅信号的载波频率fc3=250Hz?
    fm3=fc3/10;    %第3路调幅信号的调制信号频率fm3=25Hz
    xt1=cos(2*pi*fm1*t).*cos(2*pi*fc1*t);%产生第1路调幅信号?
    xt2=cos(2*pi*fm2*t).*cos(2*pi*fc2*t);%产生第2路调幅信号
    xt3=cos(2*pi*fm3*t).*cos(2*pi*fc3*t);%产生第3路调幅信号???
    st=xt1+xt2+xt3;%三路调幅信号相加
    fxt=fft(st,N);     %计算信号st的频谱
    %===============绘图部分============
    subplot(3,1,1)
    plot(t,st);grid;xlabel('t/s');ylabel('s(t)');
    axis([0,Tp/8,min(st),max(st)]);title('(a)s(t)的波形')
    subplot(3,1,2)
    stem(f,abs(fxt)/max(abs(fxt)),'.');grid,title('(b) s(t)的频谱');
    axis([0,Fs/5,0,1.2]);
    xlabel('f/Hz');ylabel('幅度')
    

(2)程序二:低通滤波器

  1.  function st=mstg
    %产生信号st,并显示st的时域波形和频谱
    %st=mstg返回混合信号,长度N=1600
    N=1600  %长度
    Fs=10000;T=1/Fs;Tp=N*T;   %采样频率Fs=10KHz,Tp为采样时间
    t=0:T:(N-1)*T;k=0:N-1;f=k/Tp;
    fc1=Fs/10;     %第1路调幅信号的载波频率fc1=1000Hz?
    fm1=fc1/10;    %第1路调幅信号的调制信号频率fm1=100Hz
    fc2=Fs/20;     %第2路调幅信号的载波频率fc2=500Hz??
    fm2=fc2/10;    %第2路调幅信号的调制信号频率fm2=50Hz
    fc3=Fs/40;     %第3路调幅信号的载波频率fc3=250Hz?
    fm3=fc3/10;    %第3路调幅信号的调制信号频率fm3=25Hz
    xt1=cos(2*pi*fm1*t).*cos(2*pi*fc1*t);%产生第1路调幅信号?
    xt2=cos(2*pi*fm2*t).*cos(2*pi*fc2*t);%产生第2路调幅信号
    xt3=cos(2*pi*fm3*t).*cos(2*pi*fc3*t);%产生第3路调幅信号???
    st=xt1+xt2+xt3;%三路调幅信号相加
    fxt=fft(st,N);     %计算信号st的频谱
    %===============绘图部分============
    subplot(3,1,1)
    plot(t,st);grid;xlabel('t/s');ylabel('s(t)');
    axis([0,Tp/8,min(st),max(st)]);title('(a)s(t)的波形')
    subplot(3,1,2)
    stem(f,abs(fxt)/max(abs(fxt)),'.');grid,title('(b) s(t)的频谱');
    axis([0,Fs/5,0,1.2]);
    xlabel('f/Hz');ylabel('幅度')

(3)程序三:带通滤波器

Fs=10000;T=1/Fs;%采样频率Fs=10KHz,Tp为采样时间
fpl=440;fpu=560;fsl=275;fsu=900;rp=0.1;rs=60;
wp=[2*fpl/Fs,2*fpu/Fs];ws=[2*fsl/Fs,2*fsu/Fs];
[N,wp]=ellipord(wp,ws,rp,rs);
[B,A]=ellip(N,rp,rs,wp);
y2t=filter(B,A,st);
 
figure(4);
[H,w]=freqz(B,A,1000);%[h,w] = freqz(b,a,n)返回数字滤波器的n点频率响应矢量h和相应的角频率矢量w,其中分子和分母多项式系数分别存储在b和a中。
m=abs(H);
plot(w/pi,20*log(m/max(m)));
grid on;title('带通滤波损耗函数曲线');
xlabel('w/pi');ylabel('幅度'); 
figure(5);
t=0:T:(length(y2t)-1)*T;
plot(t,y2t);

(4)程序三:高通滤波器

 Fs=10000;T=1/Fs;%采样频率Fs=10KHz,Tp为采样时间
fp=890;fs=600;Rp=0.1;As=60;%设置参数
wp=2*fp/Fs;ws=2*fs/Fs;%WP,WS是通带截止频率,阻带截止频率的归一化值
[N,wpo]=ellipord(wp,ws,Rp,As,'s')
[B,A]=ellip(N,Rp,As,wpo,'high');
y3t=filter(B,A,st);
 
%=========绘图=============
figure(6);
[H,W]=freqz(B,A,1000);%[h,w] = freqz(b,a,n)返回数字滤波器的n点频率响应矢量h和相应的角频率矢量w,其中分子和分母多项式系数分别存储在b和a中。
m=abs(H);
plot(W/pi,20*log(m/max(m)));grid on;title('高通滤波损耗函数曲线');
xlabel('w/pi');
ylabel('幅度');
% axis([0,1,0,1.2*max(H)])
% % yt='y3(t)';
figure(7);
plot(t,y3t);title('高通滤波后的波形');
xlabel('t/s');ylabel(y3(t));



实验总结

本实验通过调用MATLAB信号处理工具箱中的滤波器设计函数和滤波器实现函数,学习了IIR数字滤波器的设计和实现方法。具体实验步骤包括:生成由三路抑制载波调幅信号相加构成的混合信号,观察其时域和频域波形,并通过椭圆滤波器的低通、带通、高通滤波处理分离出混合信号中的三路单频调幅信号;调用MATLAB的滤波器设计函数ellipord和ellip进行椭圆滤波器的设计,并绘制损耗函数曲线;调用滤波器实现函数filter对混合信号进行滤波,分离出三路单频调幅信号,并绘制其时域波形。

通过利用Matlab对混合信号st的生成、对椭圆滤波器的低通、带通、高通滤波进行处理分离,让我对Matlab的使用更加熟悉,能更加熟练的调用Matlab的内置函数进行滤波器的代码编写。整个编程的过程也让我更深入的理解了滤波器的实现原理,通过生成波形也让旅滤波的过程生动形象的呈现出来。

通过本次实验,我学习了双线性变换法设计IIR数字滤波器的原理和方法,掌握了MATLAB信号处理工具箱中各种IIR数字滤波器设计函数的使用方式和参数设置方法,深入理解了椭圆滤波器的性质和特点。同时,我也感受到在数字信号处理中滤波器的重要性,滤波器能够有效地去除信号中的噪声和干扰,提高信号的质量和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

还在手动下载github项目?想要自动化下载github项目?基于python开发项目自动下载模块帮你实现自动下载存储

GitHub是一个基于Web的代码托管平台和开发者社区。它允许开发者存储、管理和分享他们的代码,并进行版本控制。开发者可以在GitHub上创建仓库来存储项目代码,并使用Git来跟踪和管理代码的变更历史。GitHub提供了一系列协作工具,如问题追踪、Pu…

一波三折|药学博士终获CSC资助赴瑞典隆德大学从事2年博士后研究

我们先为W博士获得美国哈佛大学布列根和妇女医院的邀请函,助其成功获得CSC公派资助,但后被哈佛大学国际中心以可能拒签为由,不予办理DS-2019表格。幸亏我们未雨绸缪先期又申请到瑞典隆德大学的2年博士后邀请函,最终顺利得到CSC改派…

CAS + 自旋 锁底层

多线程安全问题 为什么会出现多线程安全问题? 在多线程并发下, 假设有 A,B 两个线程同时操作 count 0 这个公共变量, 在A线程中count, 在B线程中count, 正常来说结果应该是 count 2, 可是同时在A, B两个线程中拿到 count 0 , 并且都执行count赋值, 结果就变成了 count 1…

【Java可执行命令】(十一)Java 密钥库和证书管理工具keytool:玩转密钥库和证书管理,深入解析keytool工具的应用与技巧~

Java可执行命令之keytool 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 生成证书请求:keytool -certreq3.3 导出证书:keytool -exportcert3.4 生成密钥对:keytool -genkeypair3.5 导入证书或证书链:keytool -importcert3…

基于STM32的直流电机调速系统

目录 基于STM32的直流电机调速系统一、原理图二、部分代码三、视频演示 基于STM32的直流电机调速系统 功能: 1.通过LCD屏幕显示实时两个电机的占空比 2.通过按键调整电机1和2的加减速 3.通过L298N驱动两个直流电机完成调速 一、原理图 二、部分代码 #include &qu…

基于Spring Boot + Vue社区管理系统的设计与实现

1、项目介绍 Spring Boot 是一个用于构建 Java 应用程序的开源框架,它使得开发者可以轻松地创建独立的、生产级别的 Spring 应用程序。Vue.js 是一个流行的 JavaScript 框架,用于构建现代化的、响应式的社区管理系统是一个用于管理社区活动、用户信息和…

Vue发布新版本,强制更新代码的方式

public下新建version.json文件定义版本 {"version":"1.1.0" } util下新建updateVersion.js import axios from axios; import { Loading } from element-ui; var t1; var t2; export async function isNewVersion() {var randomNumberMath.random() co…

[软件工具]左键连发工具左键连点工具使用教程

左键连发软件是一个可以点击一下自动左键连续点击指定次数的软件,比如你设置20次,当你点击一次松开鼠标后,会自动左键连续点击20次。具体使用教程为,我们打开软件 我们可以设置连发次数,默认15次,你可以设置…

Zabbix如何对接Prometheus

一、简介 云原生和容器广泛流行打破传统的技术堡垒,现在Prometheus监控得到越来越多企业应用和探索。对于已经存在Zabbix监控系统的用户又想尝试Prometheus而言,在Zabbix4.2版本及5.0 LTS版本正式发布增加了对Prometheus数据源的接入,后续都…

人机环境系统中的一多分有问题探讨

在一般的事物中,一多关系通常指的是一个事物与多个其他事物之间的关系。一多关系可以带来更多的选择和多样性,使事物更加丰富多样。不同的事物之间相互影响和交融,可以产生新的创意和发展机会;不同事物之间的各种关系需要平衡各自…

leetcode 203.移除链表元素

⭐️ 题目描述 🌟 leetcode链接:移除链表元素 1️⃣ 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*//*思路1:遍历链表,同时用另一个指针记录当…

IDA c++分析辅助插件ida_medigate使用记录

1.下载插件 IDA_medigate 2.将medigate_cpp_plugin.py放到 ida的plugin文件夹中 plugins/ida-referee/referee.py 放置到plugin中 3.将下载的 ida_medigate 放到IDA 内置的python38的Lib\site-packages\目录下 如:D:\IDA_Pro_7.7\python38\Lib\site-packages4.配置插件搜索…

大厂面试官:软件测试员,你的简历,是如何石沉大海的?

引言 俗话说:知己知彼百战百胜,面试如打仗,不是面试官赢,就是求职者胜。站在面试官的维度来跟求职者聊天,让求职者知道面试官的心理。 因为我本身作为一面多年的大厂面试官,相对来说还是有一些面试经验&am…

股价在5年内暴涨了3000%后,Enphase Energy未来还会继续上涨吗?

来源:猛兽财经 作者:猛兽财经 Enphase Energy股票的关键指标 最近很多人都在关注Enphase Energy(ENPH)的关键指标,包括该公司第二季度的指引和最近的股价调整。 2023年4月25日收盘后,Enphase Energy公布了…

leetcode每日一题——80.删除有序数组中的重复项II(面试经典150题)

一、题目描述与要求 80. 删除有序数组中的重复项 II - 力扣(LeetCode) 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用…

NodeJS安装教程(详细)

系列文章 MySQL安装教程(详细) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126037520 MySQL卸载教程(详细) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129279265 …

Linux 内核源代码情景分析(一)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析(一) 文章目录 系列文章目录一、存储管理1、外部设备存储空间的地址映射(1&#xff…

LinK3D论文详解

摘要 特征提取和匹配是许多计算机视觉任务的基本部分,例如二维或三维物体检测、识别和配准。众所周知,二维特征提取和匹配已经取得了很大的成功。遗憾的是,在3D领域,由于描述能力差和效率低,目前的方法无法支持3D激光雷…

uniapp在微信开放平台创建移动应用时,如何生成应用签名的问题

包名在打包的时候是必填项,就不多赘述了… 微信开放平台获取应用签名, 场景: 首先需要在手机或者模拟器上下载签名生成工具,下载地址:下载签名生成工具 然后手机打开, 在这里输入你的app打包时的包名&…

【雕爷学编程】Arduino动手做(148)---MD-PS002压力传感器模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…