当前位置: 首页 > article >正文

基于脉冲响应不变法的IIR滤波器设计与MATLAB实现

一、设计原理

脉冲响应不变法是一种将模拟滤波器转换为数字滤波器的经典方法。其核心思想是通过对模拟滤波器的冲激响应进行等间隔采样来获得数字滤波器的单位脉冲响应。

设计步骤

  1. 确定数字滤波器性能指标

  2. 将数字指标转换为等效的模拟滤波器指标

  3. 设计对应的模拟滤波器

  4. 将模拟滤波器转换为数字滤波器

二、MATLAB实现关键函数

  • butter(): 巴特沃斯滤波器设计

  • impinvar(): 脉冲响应不变法转换

  • freqz(): 数字滤波器频率响应分析

  • impz(): 数字滤波器脉冲响应分析

三、完整实现代码

%% IIR滤波器设计 - 脉冲响应不变法
clc; clear; close all;

% 设计参数
Fs = 1000;          % 采样频率(Hz)
Fc = 100;           % 截止频率(Hz)
N = 4;              % 滤波器阶数

% 数字滤波器指标
Omega_c = 2*pi*Fc;  % 模拟截止角频率(rad/s)
T = 1/Fs;           % 采样间隔

% 设计模拟巴特沃斯滤波器
[bs, as] = butter(N, Omega_c, 's');

% 脉冲响应不变法转换
[bz, az] = impinvar(bs, as, Fs);

% 频率响应分析
figure;
freqz(bz, az, 1024, Fs);
title('数字滤波器频率响应');

% 脉冲响应对比
t = 0:T:0.1;
ha = impulse(tf(bs, as), t);
hd = impz(bz, az, length(t));

figure;
plot(t, ha, 'r', t, hd, 'b--');
legend('模拟滤波器','数字滤波器');
xlabel('时间(s)'); ylabel('幅度');
title('脉冲响应对比');
grid on;

% 幅频特性对比
[hs, ws] = freqs(bs, as, 1024);
[hz, wz] = freqz(bz, az, 1024);

figure;
subplot(2,1,1);
semilogx(ws/(2*pi), 20*log10(abs(hs)), 'r');
hold on;
semilogx(wz*Fs/(2*pi), 20*log10(abs(hz)), 'b');
xlabel('频率(Hz)'); ylabel('幅度(dB)');
title('幅频特性对比');
legend('模拟','数字');
axis([1 Fs/2 -100 5]);
grid on;

subplot(2,1,2);
semilogx(ws/(2*pi), unwrap(angle(hs)), 'r');
hold on;
semilogx(wz*Fs/(2*pi), unwrap(angle(hz)), 'b');
xlabel('频率(Hz)'); ylabel('相位(rad)');
title('相频特性对比');
grid on;

四、代码解析

  1. 参数设置

    • 采样频率Fs = 1000Hz

    • 截止频率Fc = 100Hz

    • 4阶巴特沃斯滤波器

  2. 设计流程

    • 先设计模拟巴特沃斯滤波器

    • 使用impinvar函数进行数字转换

    • 对比分析模拟/数字滤波器的频率响应和时域特性

五、运行结果分析

  1. 频率响应

    • 数字滤波器在100Hz处呈现-3dB衰减

    • 阻带衰减特性与模拟滤波器基本一致

    • 高频段出现混叠效应(脉冲响应不变法固有特性)

  2. 时域特性

    • 数字滤波器脉冲响应与模拟滤波器采样值良好匹配

    • 验证了脉冲响应不变法的时域等价性

 


http://www.kler.cn/a/531644.html

相关文章:

  • 深度解读 Docker Swarm
  • Docker 系列之 docker-compose 容器编排详解
  • 基于vue船运物流管理系统设计与实现(源码+数据库+文档)
  • Unity Shader Graph 2D - 角色身体电流覆盖效果
  • Golang 应用的 Docker 部署方式介绍及使用详解
  • OpenEuler学习笔记(十四):在OpenEuler上搭建.NET运行环境
  • 10.8 LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践
  • 【R语言】环境空间
  • 【最后203篇系列】006 -使用ollama运行deepseek-r1前后端搭建
  • Java中的常见对象类型解析
  • 想学习Python编程,应该如何去学习呢
  • ChatGPT怎么回事?
  • Linux环境下的Java项目部署技巧:Nginx 详解
  • powershell编写一个简易的http服务器httpServer
  • 《基于deepseek R1开源大模型的电子数据取证技术发展研究》
  • 计算机组成原理——存储系统(二)
  • 大一计算机的自学总结:数据结构设计相关题
  • 浅谈知识蒸馏技术
  • 【玩转 Postman 接口测试与开发2_014】第11章:测试现成的 API 接口(下)——自动化接口测试脚本实战演练 + 测试集合共享
  • Immutable设计 SimpleDateFormat DateTimeFormatter
  • 如何用一年时间如何能掌握 C++ ?
  • lstm部分代码解释1.0
  • MySQL锁详解
  • 深入探究 Spring 中 FactoryBean 注册服务的实现与原理
  • 【智力测试——二分、前缀和、乘法逆元、组合计数】
  • 【C++】P5734 【深基6.例6】文字处理软件