matlab(实例):滤波器(低通、带通、高通,使用butter函数、filter函数)

一、题目:已知一个时域信号,包含三个频率(50Hz、150Hz、300Hz),分别设计并使用低通滤波器、带通滤波器、高通滤波器,对其进行滤波,画出滤波信号的时域图和频谱图。

二、解题过程:

①函数介绍:

本次编码使用函数butter函数和filter函数

1、butter()

用于计算滤波器系数

语法:

b,a\] = butter(n,Wn) \[b,a\] = butter(n,Wn,ftype) \[z,p,k\] = butter(___) \[A,B,C,D\] = butter(___) \[___\] = butter(___,'s') 输入参数 n - 滤波器阶数 整数标量 Wn - 截止频率,注意:Wn = fc_low/(fs/2) 标量 \| 二元素向量 ftype - 滤波器类型 'low' \| 'bandpass' \| 'high' \| 'stop' 输出参数 b,a - 传递函数系数 行向量 z,p,k - 零点、极点和增益 列向量、标量 A,B,C,D - 状态空间矩阵 矩阵 **2、filter()** **使用滤波器对信号进行滤波** 语法 y = filter(b,a,x) y = filter(b,a,x,zi) y = filter(b,a,x,zi,dim) \[y,zf\] = filter(___) 输入参数 b - 有理传递函数的分子系数 向量 a - 有理传递函数的分母系数 向量 x - 输入数据 向量 \| 矩阵 \| 多维数组 zi - 滤波器延迟的初始条件 \[\] (默认值) \| 向量 \| 矩阵 \| 多维数组 dim - 沿其运算的维度 正整数标量 输出参数 y - 滤波后的数据 向量 \| 矩阵 \| 多维数组 zf - 滤波器延迟的最终条件 向量 \| 矩阵 \| 多维数组 #### ②代码 1、低通滤波器 ```Matlab clc clear close all % 创建一个测试信号 fs = 1000; % 采样频率 t = 0:1/fs:1; % 时间向量 x = sin(2*pi*50*t) + sin(2*pi*150*t) + 0.5*sin(2*pi*300*t); % 包含50Hz、150Hz和300Hz成分的信号 fc_low = 100; % 低截止频率 fc_high = 200; % 高截止频率 N = 7; % 滤波器阶数 [b, a] = butter(N, fc_low/(fs/2), 'low'); % 计算低通滤波器系数 % [b, a] = butter(N, [fc_low/(fs/2), fc_high/(fs/2)], 'bandpass'); % 计算中通滤波器系数 % [b, a] = butter(N, fc_high/(fs/2), 'high'); % 计算中高通滤波器系数 % 使用中通滤波器对信号进行滤波 y = filter(b, a, x); % 绘制原始信号和滤波后的信号 figure; subplot(2,1,1); plot(t, x); title('原始信号'); xlabel('t/s'); ylabel('幅值'); subplot(2,1,2); plot(t, y); title('滤波信号'); xlabel('t/s'); ylabel('幅值'); % 傅里叶变换,画频谱图 Ns = 100; % 傅里叶变换采样点数 delta_f = fs/Ns; % 频率分辨率 x_f = (0:Ns-1)*delta_f; % 频域信号横轴 S_f = fft(x(1:Ns)); figure(2) subplot(2,1,1) stem(x_f, abs(S_f), 'filled'); title('原信号频谱') xlabel('f/Hz') ylabel('幅值') y_f = (0:Ns-1)*delta_f; % 频域信号横轴 Y_f = fft(y(1:Ns)); subplot(2,1,2) stem(y_f, abs(Y_f), 'filled'); title('滤波信号频谱') xlabel('f/Hz') ylabel('幅值') ``` ![](https://img-blog.csdnimg.cn/direct/c8f01ae10ebb4edaac7302c490008c40.png) ![](https://img-blog.csdnimg.cn/direct/6d6394e124cf4fcebf3286675a85d170.png) 2、带通滤波器 ```Matlab clc clear close all % 创建一个测试信号 fs = 1000; % 采样频率 t = 0:1/fs:1; % 时间向量 x = sin(2*pi*50*t) + sin(2*pi*150*t) + 0.5*sin(2*pi*300*t); % 包含50Hz、150Hz和300Hz成分的信号 fc_low = 100; % 低截止频率 fc_high = 200; % 高截止频率 N = 7; % 滤波器阶数 % [b, a] = butter(N, fc_low/(fs/2), 'low'); % 计算低通滤波器系数 [b, a] = butter(N, [fc_low/(fs/2), fc_high/(fs/2)], 'bandpass'); % 计算中通滤波器系数 % [b, a] = butter(N, fc_high/(fs/2), 'high'); % 计算中高通滤波器系数 % 使用中通滤波器对信号进行滤波 y = filter(b, a, x); % 绘制原始信号和滤波后的信号 figure; subplot(2,1,1); plot(t, x); title('原始信号'); xlabel('t/s'); ylabel('幅值'); subplot(2,1,2); plot(t, y); title('滤波信号'); xlabel('t/s'); ylabel('幅值'); % 傅里叶变换,画频谱图 Ns = 100; % 傅里叶变换采样点数 delta_f = fs/Ns; % 频率分辨率 x_f = (0:Ns-1)*delta_f; % 频域信号横轴 S_f = fft(x(1:Ns)); figure(2) subplot(2,1,1) stem(x_f, abs(S_f), 'filled'); title('原信号频谱') xlabel('f/Hz') ylabel('幅值') y_f = (0:Ns-1)*delta_f; % 频域信号横轴 Y_f = fft(y(1:Ns)); subplot(2,1,2) stem(y_f, abs(Y_f), 'filled'); title('滤波信号频谱') xlabel('f/Hz') ylabel('幅值') ``` ![](https://img-blog.csdnimg.cn/direct/2828d83d4bb74356a79b358acaf15e5b.png) 3、高通滤波器 ```Matlab clc clear close all % 创建一个测试信号 fs = 1000; % 采样频率 t = 0:1/fs:1; % 时间向量 x = sin(2*pi*50*t) + sin(2*pi*150*t) + 0.5*sin(2*pi*300*t); % 包含50Hz、150Hz和300Hz成分的信号 fc_low = 100; % 低截止频率 fc_high = 200; % 高截止频率 N = 7; % 滤波器阶数 % [b, a] = butter(N, fc_low/(fs/2), 'low'); % 计算低通滤波器系数 % [b, a] = butter(N, [fc_low/(fs/2), fc_high/(fs/2)], 'bandpass'); % 计算中通滤波器系数 [b, a] = butter(N, fc_high/(fs/2), 'high'); % 计算中高通滤波器系数 % 使用中通滤波器对信号进行滤波 y = filter(b, a, x); % 绘制原始信号和滤波后的信号 figure; subplot(2,1,1); plot(t, x); title('原始信号'); xlabel('t/s'); ylabel('幅值'); subplot(2,1,2); plot(t, y); title('滤波信号'); xlabel('t/s'); ylabel('幅值'); % 傅里叶变换,画频谱图 Ns = 100; % 傅里叶变换采样点数 delta_f = fs/Ns; % 频率分辨率 x_f = (0:Ns-1)*delta_f; % 频域信号横轴 S_f = fft(x(1:Ns)); figure(2) subplot(2,1,1) stem(x_f, abs(S_f), 'filled'); title('原信号频谱') xlabel('f/Hz') ylabel('幅值') y_f = (0:Ns-1)*delta_f; % 频域信号横轴 Y_f = fft(y(1:Ns)); subplot(2,1,2) stem(y_f, abs(Y_f), 'filled'); title('滤波信号频谱') xlabel('f/Hz') ylabel('幅值') ``` ![](https://img-blog.csdnimg.cn/direct/62be61746a2c4b059149a49dea5385e8.png) ### 三、结语 对于傅里叶变换,本文不再赘述,可看本人之前的文章; 要注意截止频率Wn的取值,需要除以二倍的采样频率; 有问题可以留言,本人尽量解答

相关推荐
亦陈不染12 分钟前
c#入门详解(刘铁锰)06 - 数据持久化:TXT文本保存、序列化与反序列化(附详细源码)
开发语言·计算机视觉·c#·wpf
WWZZ202525 分钟前
快速上手大模型:机器学习6(过拟合、正则化)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
ceclar12333 分钟前
C++Lambda表达式
开发语言·c++·算法
2401_8414956441 分钟前
【强化学习】动态规划算法
人工智能·python·算法·动态规划·强化学习·策略迭代·价值迭代
WWZZ202542 分钟前
快速上手大模型:机器学习5(逻辑回归及其代价函数)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
二进制coder1 小时前
深入浅出:I²C多路复用器PCA9546详解 - 解决地址冲突,扩展你的I²C总线
c语言·开发语言·单片机
DuHz1 小时前
基于频率分集阵列的MIMO雷达联合距离角度估计——论文阅读
论文阅读·算法·汽车·信息与通信·毫米波雷达
INGNIGHT1 小时前
单词搜索 II · Word Search II
数据结构·c++·算法
楼田莉子2 小时前
C++学习:C++11关于类型的处理
开发语言·c++·后端·学习
程高兴2 小时前
LCC-S型磁耦合谐振无线电传输系统实现恒压输出simulink
matlab