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的取值,需要除以二倍的采样频率; 有问题可以留言,本人尽量解答

相关推荐
蔡蓝4 分钟前
jwt的无感刷新
算法·哈希算法
Bug-Free生活15 分钟前
Go语言入门到入土——一、安装和Hello World
开发语言·后端·golang
PHASELESS41121 分钟前
Java堆结构深度解析:原理、实现与应用全指南
java·开发语言·数据结构
DXM052129 分钟前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记2
开发语言·javascript·笔记·学习·arcgis·ae
啥都鼓捣的小yao40 分钟前
实战5:Python使用循环神经网络生成诗歌
开发语言·人工智能·python·rnn·深度学习
Monly2141 分钟前
Uniapp:列表选择提示框
开发语言·javascript·uni-app
HelloDam1 小时前
912. 排序数组 超级通俗易懂、全面的快速排序教程(优化重复元素、实例有序问题)
后端·算法·排序算法
HelloDam1 小时前
leetcode51.N 皇后 回溯算法求解 + 效率优化
后端·算法
DataFunTalk1 小时前
30位数据科学家集结完毕,揭晓大模型时代数据科学的“晋级之路”
前端·后端·算法
ん贤1 小时前
图论基础理论
c语言·数据结构·c++·算法·图论