matlab设计FIR滤波器

2023-11-01

方法1:通过fir1()函数进行设计

        B = fir1(N,Wn)设计FIR低通滤波器,返回的滤波器参数保存在长度为N+1的数组B中。Wn为归一化截止频率,范围为0~1。截止频率用于区分过渡带和阻带。1处对应的是采样频率的一半。滤波器系数B是实的且有线性相位。

B=fir1(N,Wn,'high'); %表示N阶高通滤波器   B=fir1(N,Wn,'low'); %表示N阶低通滤波器;

如果Wn=[W1, W2]; B=fir1(N,Wn,'bandpass');  %N阶带通滤波器 B=fir1(N,Wn,'stop'); %N阶带阻滤波器。

freqz(B);%绘制滤波器的频域波形

sin_signal_filter = filter(filter_lowpass,1,sin_signal); %滤波函数,参数1为滤波器系数,参数2为行数(这里没有使用矩阵)故为1,参数3为输入信号。

测试代码1:

%%%%%%%%%%%%%%%%%%% 低通滤波器仿真程序 %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%% File: fir_sim.m   %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%% Date:2023-5-5 Author:侯永明 %%%%%%%%%%%%%
%%%%%*******************程序说明**********************%%%%%%%
%本程序完成了对于单音信号和双音信号的低通滤波仿真
%版本信息:MATLAB 2017a

%%%%%*******************程序主体**********************%%%%%%%
clear clc
close all;

%%%%参数设置
time=1:1000; %信号长度
fre1 =50;    %单音信号1的频率
fre2 =500;   %单音信号2的频率
fs=8000;     %采样频率

sin_signal1 = sin(2*pi*fre1*time/fs);
sin_signal2 = sin(2*pi*fre2*time/fs);
sin_signal = sin_signal1+sin_signal2;

%%%%%观察单音信号和双音信号的时域图和频域图
figure(1)
plot(sin_signal1);
title('单音信号1的时域图');

figure(2)
plot(sin_signal2);
title('单音信号2的时域图');

figure(3)
plot(sin_signal);
title('双音信号的时域图');

figure(4)
plot(abs(fft(sin_signal1)));
title('单音信号1的频域图');

figure(5)
plot(abs(fft(sin_signal2)));
title('单音信号2的频域图');

figure(6)
plot(abs(fft(sin_signal)));
title('双音信号的频域图');

%%%%%设计低通滤波器
filter_lowpass = fir1(128,550/8000); %归一化截止频率的公式:w=fc*2/fs
                                     %128为滤波阶数 fir1是滤波器的构造函数
figure(7)
freqz(filter_lowpass);               %freqz是求频域图形的函数
title('滤波器频域响应图');

%%%%%对双音信号进行滤波
sin_signal_filter = filter(filter_lowpass,1,sin_signal);

%%%%%观察滤波之后的时域图和频域图
figure(8)
plot(sin_signal_filter);
title('滤波之后信号的时域图');

figure(9)
plot(abs(fft(sin_signal_filter)));
title('滤波之后信号的频域图');         
%%%%%*******************程序结束**********************%%%%%%%

测试代码2:

clear all;
close all;
clc;

%滤波器长度
N=41;
%采样频率
fs=2000;

%各种滤波器的频率特征
fc_lpf = 200;
fc_hpf = 200;
fp_bandpass = [200 400];
fc_stop = [200 400];

%以采样频率的一半,对频率进行归一化
wn_lpf = fc_lpf*2/fs;
wn_hpf = fc_hpf*2/fs;
wn_bandpass = fp_bandpass*2/fs;
wn_stop = fc_stop*2/fs;

%采用fir1函数设计fir滤波器
b_lpf = fir1(N-1,wn_lpf);
b_hpf = fir1(N-1,wn_hpf,'high');
b_bandpass = fir1(N-1,wn_bandpass, 'bandpass');
b_stop = fir1(N-1,wn_stop,'stop');

%求幅频响应
m_lpf = 20*log(abs(fft(b_lpf)))/log(10);
m_hpf = 20*log(abs(fft(b_hpf)))/log(10);
m_bandpass = 20*log(abs(fft(b_bandpass)))/log(10);
m_stop = 20*log(abs(fft(b_stop)))/log(10);

%设置频率响应单位的横坐标为Hz
x_f = 0:(fs/length(m_lpf)):fs/2;        %???

%绘制单位脉冲响应
subplot(4,2,1); stem(b_lpf);xlabel('n');ylabel('h(n)');legend('lpf'); %stem绘制b_lpf的离散序列图 legend函数为数据创建图例
subplot(4,2,3); stem(b_hpf);xlabel('n');ylabel('h(n)');legend('hpf');
subplot(4,2,5); stem(b_bandpass);xlabel('n');ylabel('h(n)');legend('bandpass');
subplot(4,2,7); stem(b_stop);xlabel('n');ylabel('h(n)');legend('stop');

%绘制幅频响应
subplot(4,2,2); plot(x_f,m_lpf(1:length(x_f))); xlabel('频率(Hz)');ylabel('幅度(dB)','fontsize',8); legend('lpf');
subplot(4,2,4); plot(x_f,m_hpf(1:length(x_f))); xlabel('频率(Hz)');ylabel('幅度(dB)','fontsize',8); legend('hpf');
subplot(4,2,6); plot(x_f,m_bandpass(1:length(x_f))); xlabel('频率(Hz)');ylabel('幅度(dB)','fontsize',8); legend('bandpass');
subplot(4,2,8); plot(x_f,m_stop(1:length(x_f))); xlabel('频率(Hz)');ylabel('幅度(dB)','fontsize',8); legend('stop');

测试代码3:

%%低通,过渡带为1~1.5KHz,采样频率8kHz,通带最大波纹0.01,阻带最大波纹0.05

%获取凯赛窗参数,后续fir1要设计凯赛窗的低通滤波器

fs=8000;           %采样频率
fc=[1000,1500];    %过渡带; 1000-1500过渡带. 通带:0~(1000*2/fs),阻带:(1500*2/fs)
mag=[1 0];         %理想幅值 0~(1000*2/fs)是1,1500*2/fs~1是0
dev=[0.01,0.05];   %波纹
[n,wn,beta,ftype] = kaiserord(fc,mag,dev,fs); %获取凯赛窗参数,根据据过渡带幅值返回ftype类型

%fir1设计凯赛窗和汉明窗滤波器
h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta));
h_hamm=fir1(n,fc(2)*2/fs);

%设计最优滤波器
fpm=[0 fc(1)*2/fs fc(2)*2/fs 1]; %firmp频段向量,归一化[0 1]
magpm =[1 1 0 0]; %firpm幅值向量
h_pm= firpm(n,fpm,magpm); %设计低通滤波器

%幅值
m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10);
m_hamm=20*log(abs(fft(h_hamm,1024)))/log(10);
m_pm=20*log(abs(fft(h_pm,1024)));

%设置幅频响应的横坐标为Hz
x_f=[0:1:length(m_kaiser)/2]*fs/length(m_kaiser);

%只显示正频率部分
m1=m_kaiser(1:length(x_f));
m2=m_hamm(1:length(x_f));
m3=m_pm(1:length(x_f));

%绘制幅频曲线
plot(x_f,m1, '-',x_f,m2,'-.',x_f,m3,'--');
xlabel('频率(Hz)');
ylabel('幅度(dB)');
legend('凯赛窗','汉明窗','最优滤波');
grid;

  2.方法2:通过fdatool(filter designer)来实现滤波器的设计。

在工具箱弹窗中直接进行参数的选择和设置,可以选择滤波器类型、设计方法、阶数、通带阻带频率、采样频率及幅值。

 设置完成之后,点击下图的文件->生成matlab代码->滤波器设计函数进行.m文件保存

 可以生成 .m文件,需要注意把第一行函数头手动注释掉,代码如下:

%function Hd = ditong2
%DITONG2 Returns a discrete-time filter object.

% MATLAB Code
% Generated by MATLAB(R) 9.2 and the Signal Processing Toolbox 7.4.
% Generated on: 05-May-2023 14:26:21

% Equiripple Lowpass filter designed using the FIRPM function.

% All frequency values are in Hz.
Fs = 1000;  % Sampling Frequency

Fpass = 150;             % Passband Frequency                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
Fstop = 200;             % Stopband Frequency
Dpass = 0.057501127785;  % Passband Ripple
Dstop = 0.0001;          % Stopband Attenuation
dens  = 20;              % Density Factor

% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);

% [EOF]

 Run一下生成的滤波器函数.m文件,会生成滤波器系数矩阵Hd,然后就可以调用filter函数对输入信号进行滤波了。

%%
y1 = rand(50,1);
subplot(4,1,1);
plot(y1);
title("滤波前波形");
subplot(4,1,2);
plot(abs(fft(y1)));
title("滤波前频谱");
%%
y2 = filter(Hd,y1);
subplot(4,1,3);
plot(abs(fft(y2)));
title("滤波后频谱");
subplot(4,1,4);
plot(y2);
title("滤波后波形");

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab设计FIR滤波器 的相关文章

  • 在 MATLAB 中一次为元胞数组分配不同的值

    我需要有关在 MATLAB 中创建元胞数组的帮助 其中每个元胞都是不同大小的数组 例如 假设我有这个简单的数组和值 A 5 3 8 7 0 4 1 B 10 元胞数组C必须创建为 C 10 20 30 40 50 10 20 30 10 2
  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos
  • 从彩色背景中提取黑色对象

    人眼很容易辨别black来自其他颜色 但是计算机呢 我在普通的A4纸上打印了一些色块 由于组成彩色图像有青色 品红色和黄色三种墨水 所以我设置每个块的颜色C 20 C 30 C 40 C 50 以及其余两种颜色是 0 这是我的源图像的第一列
  • 我的 matlab 图中需要不同的颜色

    这是我的情节代码 问题是我的图中的两条线具有相同的颜色 我需要为图中的每条线 总共 4 条线 分配一个特殊的颜色 for i 1 nFolderContents data hdrload folderContents i if size f
  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • 如何在matlab中绘制彩色一维直方图

    我有一个一维数组 X 其中包含相关系数的统计数据 我想绘制一个彩色直方图 我使用以下代码 histogram X 10 它可以创建具有单色的直方图 现在我想绘制一个直方图 其中每个条形都有不同的颜色 但 FaceColor 选项只能调整整个
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • 如何在Matlab脚本中将泰勒级数系数存储到数组中

    这个问题是在 m 脚本的上下文中 我知道如何获取函数的泰勒级数 但我没有看到任何命令允许将级数的系数存储到数组中 sym2poly似乎不起作用 如何将系数存储到数组中 例如这个函数 syms x f 1 x 2 4 x 9 我们怎样才能得到
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 将 Android 应用程序与服务器上的 Matlab 应用程序连接

    我正在 Android 上开发一个应用程序 它将获取图像输入 并将该输入传递到安装 MATLAB 应用程序的服务器 MATLAB 应用程序将计算结果并将其返回到该 Android 应用程序 我想知道我可以使用哪个服务器 如何将 MATLAB
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案

随机推荐

  • 脚本病毒---实验十二:脚本病毒

    目录 一 实验目的及要求 二 实验原理 三 实验环境 四 实验步骤及内容 实验步骤一 vbs virus病毒生成器的了解与操作 实现脚本病毒的源码生成 实验步骤二 复制病毒副本地启动菜单 实验步骤三 禁止显示桌面所有图标 五 实验总结 六
  • Android开发-Intent使用Serializable和Parcelable方式传递数据

    前 言 在Android中一个Activity跳转至另一个Activity或者启动Service 发送广播等都需要Intent 可以说Intent在Android中用途比较广泛 我们还可以通过Intent在跳转至下一个界面或者启动另一个组件
  • 0.net-跨线程使用CSocket

    CSocket断言错误 ASSERT pState gt m hSocketWindow NULL 起因 在套接字处于连接或者发送状态时 试图关闭套接字 于是在这个断言语句处发生中断 原因分析 微软官方解释如下 http support m
  • 论文笔记: 深度学习速度模型构建的层次迁移学习方法 (未完)

    摘要 分享对论文的理解 原文见 J rome Simon Gabriel Fabien Ouellet Erwan Gloaguen and Ishan Khurjekar Hierarchical transfer learning fo
  • echarts自学笔记

    学习echarts的总结 一 图表的实现 1 首先将echarts js引入为echarts提供一个DOM容器 具有宽高 为echarts配置参数 第一步 初始化DOM容器 用echarts init 函数第二步 配置数据选项var opt
  • [机器学习与scikit-learn-33]:算法-回归-通过PolynomialFeatures实现数据的升维

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123591729 目录 前言 第1章
  • Android 10(Android Q) 适配

    官方网站 沙盒存储 Android Q 中的隐私权 重大隐私权变更 官方网站 展示时间敏感的通知 1 设备硬件信息读取限制 在Android10中 系统不允许普通App请求android permission READ PHONE STAT
  • 已解决:attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

    在运行yolov5时 报错 attributeerror FreeTypeFont object has no attribute getsize 在网上搜索的结果大部分给出字体不对 之类的答案 但通过仔细研究 发现该报错的报错原因不是字体
  • CSS3+Html5 学习笔记之css 样式加载顺序

    有时候在写CSS的过程中 某些限制总是不起作用 这就涉及了CSS样式覆盖的问题 如下 navigator height 100 width 200 position absolute left 0 border solid 2 EEE cu
  • 003 数据结构_无头单向非循环链表的详细分解——“C”

    引入 前言 本文介绍的是无头单向非循环链表 这种链表结构简单 一般不会单独用来存数据 实际中更多是作为其他数据结构的子结构 如哈希桶 图的邻接表等等 另外这种结构在笔试面试中出现很多 链表是什么 常见的链表包括 单向链表 singly li
  • IDEA Git回退到指定历史版本

    1 找到要回退的版本号 右击项目 gt Git gt Show History gt 选中要回退的版本 gt Copy Revision Number 2 打开idea的Terminal 输入命令 git reset hard 139dcf
  • Dockerfile解析

    Dockerfile是什么 Dockerfile是用来构建Docker镜像的文本文件 是由一条条构建镜像所需的指令和参数构成的脚本 概述 官网 https docs docker com engine reference builder 构
  • 【CV】第 8 章:语义分割和神经风格迁移

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 传统制造型企业数字化转型面临的问题以及解决方案介绍

    传统制造业数字化转型面临的问题 一直都在关注数字化很久了 就是迟迟不敢动手 这大概是很多企业经营者的心里话 传统制造企业遇到的问题 关键还是在于数字化基础薄弱 1 工业信息化平台与软件繁多 方向和功能也各不同 对于不同的行业类别 生产工艺
  • 为什么基类的析构函数是虚函数

    点击链接查看更多C 技巧 Effective C 考虑以下继承结构 派生类 Derived 中申请了一块内存 使用指针 i ptr 管理 并在析构的时候释放掉 class Base 基类 class Derived public Base
  • 栈溢出基本原理的简单讲解

    栈溢出基本原理的简单讲解 新手上路 大牛还请自行跳过 不足之处 欢迎批评指正 一 预备知识 缓冲区溢出简单介绍 缓冲区溢出 简单的说 缓冲区溢出就是超长的数据向小缓冲区复制 导致数据超出了小缓冲区 导致缓冲区其他的数据遭到破坏 这就是缓冲区
  • 如何记忆和使用PNP和NPN?

    常用的NPN三极管型号 C1815 baiC945 S9013 S9014 S8050 2SD880 D882 2N5401 实物怎么判断PNP还是NPN 1 用万用表来进行判断 如果是指针是万用表 黑笔是电池正极 数字表相反 将指针拨到电
  • Linux下Ptread_create崩溃问题

    今天写了一个简单的Pthread函数在Linux Ubuntu20 4中qt运行 结果一运行就崩溃 百思不得其解 代码如下 include
  • 对于STM32编译出现“The size of this image (34208 bytes)...“此类问题解决办法

    自创立博客以来 就没怎么用过 感觉很对不起CSDN这个学习氛围如此浓厚的大佬论坛 闲话少说 近期忙于工作项目 在昨晚收到通知毕设要加紧进度 这才放下手中的活 毕设做的半球系统 用的mdk开发环境 当程序写好准备编译时 出现 The code
  • matlab设计FIR滤波器

    方法1 通过fir1 函数进行设计 B fir1 N Wn 设计FIR低通滤波器 返回的滤波器参数保存在长度为N 1的数组B中 Wn为归一化截止频率 范围为0 1 截止频率用于区分过渡带和阻带 1处对应的是采样频率的一半 滤波器系数B是实的