MATLAB中的IIR滤波器设计

news2025/2/3 11:34:53

在数字信号处理中,滤波器是消除噪声、提取特征或调整信号频率的核心工具。其中,无限脉冲响应(IIR)滤波器因其低阶数实现陡峭滚降的特性,被广泛应用于音频处理、通信系统和生物医学工程等领域。借助MATLAB强大的工具箱,设计IIR滤波器变得直观且高效。本文将结合MATLAB代码,系统介绍IIR滤波器的设计原理与实现方法。

一、IIR滤波器设计原理

IIR滤波器的核心思想是将模拟滤波器转换为数字滤波器。设计流程通常分为两步:

  1. 选择模拟原型滤波器(如巴特沃斯、切比雪夫等)。

  2. 通过双线性变换或脉冲响应不变法,将模拟滤波器转换为数字滤波器。

相较于FIR滤波器,IIR滤波器的相位非线性是其缺点,但其计算效率高(低阶数实现高性能),尤其适合实时处理场景。

二、MATLAB中的IIR滤波器类型与设计

1. 巴特沃斯滤波器(Butterworth)

特点:通带和阻带均无波纹,过渡带较宽,适合对相位失真不敏感的场景(如音频滤波)。
MATLAB函数butter

% 设计一个5阶低通巴特沃斯滤波器,截止频率100Hz(采样率1000Hz)
fs = 1000;          % 采样率
fc = 100;           % 截止频率
n = 5;              % 阶数
[b, a] = butter(n, fc/(fs/2), 'low'); 
freqz(b, a);        % 绘制频率响应
2. 切比雪夫I型滤波器(Chebyshev Type I)

特点:通带等波纹,阻带单调衰减,适合需要快速过渡但允许通带波动的场景(如雷达信号处理)。
MATLAB函数cheby1

% 设计4阶高通滤波器,通带波纹1dB,截止频率200Hz
rp = 1;             % 通带波纹(dB)
[b, a] = cheby1(4, rp, 200/(fs/2), 'high');
3. 切比雪夫II型滤波器(Chebyshev Type II)

特点:阻带等波纹,通带单调衰减,适合抑制特定频段干扰(如工频噪声消除)。
MATLAB函数cheby2

% 设计6阶带阻滤波器,阻带衰减40dB,阻带范围150-250Hz
rs = 40;            % 阻带衰减(dB)
[b, a] = cheby2(6, rs, [150 250]/(fs/2), 'stop');
4. 椭圆滤波器(Elliptic)

特点:通带和阻带均为等波纹,过渡带最窄,适合对性能要求苛刻的场合(如通信系统中的信道滤波)。
MATLAB函数ellip

% 设计3阶带通椭圆滤波器,通带波纹0.5dB,阻带衰减50dB
rp = 0.5; rs = 50;
[b, a] = ellip(3, rp, rs, [50 150]/(fs/2), 'bandpass');
5. 贝塞尔滤波器(Bessel)

特点:最大程度保持相位线性,但过渡带较宽,适合需要信号波形保真的场景(如心电图信号处理)。
设计步骤:需先设计模拟滤波器,再转换为数字滤波器。

% 设计4阶模拟低通贝塞尔滤波器,转换为数字滤波器
[b_analog, a_analog] = besself(4, 100);  % 模拟设计
[b_digital, a_digital] = bilinear(b_analog, a_analog, fs); % 双线性变换

三、如何选择IIR滤波器?

  • 巴特沃斯:通用场景,平衡性能与复杂度。

  • 切比雪夫I型:需快速过渡且允许通带波纹。

  • 切比雪夫II型:需抑制特定阻带频率。

  • 椭圆滤波器:对过渡带宽度要求极高。

  • 贝塞尔滤波器:重视相位线性,牺牲过渡带性能。

四、Matlab编程实现

% MATLAB程序:模拟信号加入单频噪声,并使用5个低通滤波器进行滤波

% 参数设置
fs = 1000;                % 采样频率 (Hz)
t = 0:1/fs:1-1/fs;        % 时间向量 (1秒)
f_signal = 40;            % 信号频率 (Hz)
f_noise = 250;            % 噪声频率 (Hz)

% 原始信号:一个40Hz的正弦波
signal = sin(2*pi*f_signal*t);

% 添加噪声:一个250Hz的单频噪声
noise = 0.5 * sin(2*pi*f_noise*t);

% 带噪声信号
noisy_signal = signal + noise;

% 设计滤波器:使用巴特沃斯、切比雪夫I型、切比雪夫II型、椭圆和贝塞尔滤波器
% 1. 巴特沃斯滤波器
[b_butter, a_butter] = butter(4, 0.2);  % 低通滤波器,截止频率0.2*fs

% 2. 切比雪夫I型滤波器
[b_cheby1, a_cheby1] = cheby1(4, 0.5, 0.2);  % 通带波纹0.5dB

% 3. 切比雪夫II型滤波器
[b_cheby2, a_cheby2] = cheby2(4, 40, 0.2);  % 阻带衰减40dB

% 4. 椭圆滤波器
[b_ellip, a_ellip] = ellip(4, 0.5, 40, 0.2);  % 通带波纹0.5dB,阻带衰减40dB

% 5. 贝塞尔滤波器
[b_bessel, a_bessel] = besself(4, 0.2);  % 贝塞尔滤波器,最大化相位线性

% 滤波处理
filtered_signal_butter = filter(b_butter, a_butter, noisy_signal);
filtered_signal_cheby1 = filter(b_cheby1, a_cheby1, noisy_signal);
filtered_signal_cheby2 = filter(b_cheby2, a_cheby2, noisy_signal);
filtered_signal_ellip = filter(b_ellip, a_ellip, noisy_signal);
filtered_signal_bessel = filter(b_bessel, a_bessel, noisy_signal);

% 频谱分析:使用FFT计算信号的频谱
n = length(t);                        % 信号长度
f = (0:n-1)*(fs/n);                    % 频率向量
signal_fft = abs(fft(noisy_signal));   % 噪声信号的频谱
butter_fft = abs(fft(filtered_signal_butter));
cheby1_fft = abs(fft(filtered_signal_cheby1));
cheby2_fft = abs(fft(filtered_signal_cheby2));
ellip_fft = abs(fft(filtered_signal_ellip));
bessel_fft = abs(fft(filtered_signal_bessel));

% 绘制结果
figure;

% 时域图:显示原始信号与不同滤波器处理后的信号
subplot(2, 2, 1);
plot(t, noisy_signal, 'k'); hold on;
plot(t, filtered_signal_butter);
title('时域 - 巴特沃斯滤波');
legend('带噪声信号', '巴特沃斯滤波结果');

subplot(2, 2, 2);
plot(t, noisy_signal, 'k'); hold on;
plot(t, filtered_signal_cheby1);
title('时域 - 切比雪夫I型滤波');
legend('带噪声信号', '切比雪夫I型滤波结果');

subplot(2, 2, 3);
plot(t, noisy_signal, 'k'); hold on;
plot(t, filtered_signal_cheby2);
title('时域 - 切比雪夫II型滤波');
legend('带噪声信号', '切比雪夫II型滤波结果');

subplot(2, 2, 4);
plot(t, noisy_signal, 'k'); hold on;
plot(t, filtered_signal_ellip);
title('时域 - 椭圆滤波');
legend('带噪声信号', '椭圆滤波结果');

% 频域图:显示原始信号与不同滤波器处理后的频谱
figure;

subplot(2, 2, 1);
plot(f, signal_fft, 'k'); hold on;
plot(f, butter_fft);
title('频域 - 巴特沃斯滤波');
legend('带噪声信号', '巴特沃斯滤波结果');

subplot(2, 2, 2);
plot(f, signal_fft, 'k'); hold on;
plot(f, cheby1_fft);
title('频域 - 切比雪夫I型滤波');
legend('带噪声信号', '切比雪夫I型滤波结果');

subplot(2, 2, 3);
plot(f, signal_fft, 'k'); hold on;
plot(f, cheby2_fft);
title('频域 - 切比雪夫II型滤波');
legend('带噪声信号', '切比雪夫II型滤波结果');

subplot(2, 2, 4);
plot(f, signal_fft, 'k'); hold on;
plot(f, ellip_fft);
title('频域 - 椭圆滤波');
legend('带噪声信号', '椭圆滤波结果');

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

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

相关文章

vector容器(详解)

本文最后是模拟实现全部讲解,文章穿插有彩色字体,是我总结的技巧和关键 1.vector的介绍及使用 1.1 vector的介绍 https://cplusplus.com/reference/vector/vector/(vector的介绍) 了解 1. vector是表示可变大小数组的序列容器。…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能

近期在做跟毕业设计相关的数据后台管理系统,其中的列表项展示有图片展示,添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能,这里分享个人的实现过程,与大家交流谈论~ 一、准备工作 本次案例使用的…

使用真实 Elasticsearch 进行高级集成测试

作者:来自 Elastic Piotr Przybyl 掌握高级 Elasticsearch 集成测试:更快、更智能、更优化。 在上一篇关于集成测试的文章中,我们介绍了如何通过改变数据初始化策略来缩短依赖于真实 Elasticsearch 的集成测试的执行时间。在本期中&#xff0…

【R语言】函数

一、函数格式 如下所示: hello:函数名;function:定义的R对象是函数而不是其它变量;():函数的输入参数,可以为空,也可以包含参数;{}:函数体,如果…

VSCode插件Live Server

简介:插件Live Server能够实现当我们在VSCode编辑器里修改 HTML、CSS 或者 JavaScript 文件时,它都能自动实时地刷新浏览器页面,让我们实时看到代码变化的效果。再也不用手动刷新浏览器了,节省了大量的开发过程耗时! 1…

50. 正点原子官方系统镜像烧写实验

一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统,然后通过这个系统来完成烧写工作。 切记!使用OTG烧写的时候要先把SD卡拔出来&…

扩散模型(三)

相关阅读: 扩散模型(一) 扩散模型(二) Latent Variable Space 潜在扩散模型(LDM;龙巴赫、布拉特曼等人,2022 年)在潜在空间而非像素空间中运行扩散过程,这…

it基础使用--5---git远程仓库

it基础使用–5—git远程仓库 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念 -git基础使用–3—安装和基本使用 -git基础使用–4—git分支和使用 2. 什么是远程仓库 在第一篇文章中,我们已经讲过了远程仓库,每个本…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代,内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容,帮助用户有效地管理信息流。随着技术的发展,传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性,这促使市场需…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用来与PC进行通信&#xff0c;包括与监控…

Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine&#xff0c;找到 Cinemachine包&#xff0c;点击 Install按钮进行安装。 关闭窗口&#xff0c;新建一个FreeLook Camera&#xff0c;如下。 接着新建一个对象Pos&#xff0c;拖到Player下面…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

小程序-基础加强-自定义组件

前言 这次讲自定义组件 1. 准备今天要用到的项目 2. 初步创建并使用自定义组件 这样就成功在home中引入了test组件 在json中引用了这个组件才能用这个组件 现在我们来实现全局引用组件 在app.json这样使用就可以了 3. 自定义组件的样式 发现页面里面的文本和组件里面的文…

尝试ai生成figma设计

当听到用ai 自动生成figma设计时&#xff0c;不免好奇这个是如何实现的。在查阅了不少资料后&#xff0c;有了一些想法。参考了&#xff1a;在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是&#xff1a;可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…

【周易哲学】生辰八字入门讲解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具02

工具运行前的环境准备 1、登录用户管理员权限确认 工具使用的登录用户(-u后面的用户)&#xff0c;必须具有管理员的权限&#xff0c;因为需要读取系统表 例&#xff1a;Export.bat -s 10.48.111.12 -d db1 -u test -p test -schema dbo      2、Powershell的安全策略确认…

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后&#xff0c;才会执行catch里的代码&#xff0c;程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常&#xff0c;则会强制停止程序&#xff0c;报错 3.finally修饰的代码一定会执行&#xff0c;除…