matlab由滤波的系数得到传输函数 设计带通滤波器 design fdatool设计IIR带通滤波器
写在前面的话:
由滤波器系数得到传输函数:
使用matlab fdatool设计滤波器,得到幅频响应,得到滤波器系数,由系数如何得到滤波器的参数?
我的方法是 使用:点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器或者在 simulink中设计滤波器,双击设计好的滤波器,可以参看其框图,根据框图可以将传输函数写出,即可得到滤波器的参数。
看到一个带通滤波器的设计如下,开始研究是如何设计的
带通滤波器设计matlab代码:
band_low = 0.3;
band_high = 1.2;
fs_origin = 25;
hd_band = design(fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin),'butter'); %带通滤波器
%fvtool(hd_band); % view
measure(hd_band) %Measure the frequency response characteristics of the filter
%filtered = filter(hd_band,x); % 滤波器的使用,输入数组x,输出数组filtered
查看官网MathWorks,找到关于滤波器的设计design,带通滤波器的设计fdesign.bandpass
The fdesign.bandpass
function returns a bandpass
filter design specification object that contains specifications for a filter such as passband frequency, stopband frequency, passband ripple, and filter order. Use the design
function to design the filter from the filter design specifications object.
本处只解析此处滤波器的设计参数,若查看更多,移至官网MathWorks
- N:Filter order for FIR filters. Or both the numerator and denominator orders for IIR filters when
Na
andNb
are not provided. Specified usingFilterOrder
. 关于滤波其的阶数 - F3dB1:Frequency of the 3 dB point below the passband value for the first cutoff, specified in normalized frequency units. Applies to IIR filters.
- F3dB2:Frequency of the 3 dB point below the passband value for the second cutoff, specified in normalized frequency units. Applies to IIR filters.
Fs
provides the sample rate in Hz of the signal to be filtered.bandpassSpecs
= fdesign.bandpass(___,Fs
)Fs
must be specified as a scalar trailing the other numerical values provided. In this case, all frequencies in the specifications are in Hz as well.
上面这句话解释了传入采样频率的必要性。
'N,F3dB1,F3dB2'
|
butter
|
以上参数的设置使用与IIR butter
fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin)
show:
bandpass (具有属性):Response: 'Bandpass'Specification: 'N,F3dB1,F3dB2'Description: {3×1 cell}NormalizedFrequency: 0Fs: 25FilterOrder: 4F3dB1: 0.3000F3dB2: 1.2000
fvtool(hd_band)% 查看幅频特性
measure(hd_band) %Measure the frequency response characteristics of the filter
Sample Rate : 25 Hz
First Stopband Edge : Unknown
First 6-dB Point : 250.7041 mHz
First 3-dB Point : 300 mHz
First Passband Edge : Unknown
Second Passband Edge : Unknown
Second 3-dB Point : 1.2 Hz
Second 6-dB Point : 1.4315 Hz
Second Stopband Edge : Unknown
First Stopband Atten. : Unknown
Passband Ripple : Unknown
Second Stopband Atten. : Unknown
First Transition Width : Unknown
Second Transition Width : Unknown
使用fdatool同样实现此滤波器的设计
设计的滤波器通过File-Export导出到工作区;
也可以在analysis中查看器信息,比如系数、幅频、相频特性。比如查看analysis中点击Filter Information中可以看到fdesign使用的内容:'N,F3dB1,F3dB2'
完成了带通滤波器的设计,就在考虑如何转化为C语言代码,这里有个网站可以进行转化,设计滤波器转为C语言实现,但是结果并没有达到我想要的要求,我的目的是怎样将fdatool中设计的滤波器系数中得到其对应的传递函数H(Z),有了传递函数,就可以自己写C语言实现了。
在上面fdatool设计的滤波器中,两种方法查看设计的滤波器,任意一种都可以;
- 点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器,
- 或者采用如下图操作,从左到右三个按键
双击可以看到滤波器的内部结构,如图显示为两个二阶滤波器级联:
放大其中一个滤波器如下
简单作了标记如下
并给出其对应的C语言实现,此代码无法直接运行只是提取了一部分带通滤波器实现部分
/* IIR fourth-order filter coefficients */
typedef struct
{float(*a)[3];float(*b)[3];float* gain;
} IIR_ORDER4_COEFF_T;/* Save the in-process' data of the second-order filter */
typedef struct
{float m1;float m2;
} FILTER_ORDER2_T;/*三轴信号处理前的滤波:四阶带通(0.3-1.2)Hz)滤波,由两个二阶滤波级联起来*/
float a_raw[2][3] = {{ 1.00, (float)-1.9175958145710057, (float)0.9246554650412394 }, //第一级二阶滤波,分母{ 1.00, (float)-1.7227109782351659, (float)0.7854234338937474 } //第二级二阶滤波,分母
};//分母
float b_raw[2][3] = {{ 1.00, (float)0.00, (float)-1.00 }, //第一级二阶滤波,分子{ 1.00, (float)0.00, (float)-1.00 } //第二级二阶滤波,分子
};//分子
float gain_raw[2] = { (float)0.1048485643154691/*第一级增益*/, (float)0.1048485643154691/*第二级增益*/ };/******************************************************************************/
/** Start, initialize the parameters
* @param[in]
*
* @return
*
*//*
* History :
* 1.Date : 2020/8/28
* Author :
* Modification : Created function*******************************************************************************/
void StartSwim(void)
{/* signal filter parameter initialization */IIR_Raw.a = a_raw;IIR_Raw.b = b_raw;IIR_Raw.gain = gain_raw;
}/*
x: input
m1:保存中间滤波器数据
m2:保存中间滤波器数据
a:滤波器系数
b:滤波器系数
gain:增益,对于只支持定点小数运算的,需要把增益分配到每个二阶IIR滤波器的系数中,使得每次中间的结果都不溢出,即使其频率响应的最大值最接近0dB
*/
float filterOrder2(float* x, float* m_1, float* m_2, float* a, float* b, float* gain){float y, m;//计算没有增益的滤波输出,存于y_m = *x - a[1] * *m_1 - a[2] * *m_2; //求当前m,同时作为求y_的中间步骤y = m + b[1] * *m_1 + b[2] * *m_2;//更新*m_1和*m_2*m_2 = *m_1;*m_1 = m;//返回带增益的滤波输出return y* *gain;
}/******************************************************************************/
/** filter: Fourth-order filter, direct type II
* @param[in]
* filter_state :Store the middle state of the filter
* @return
*
*//*
* History :
* 1.Date : 2020/8/28
* Author :
* Modification : Created function*******************************************************************************/
float FilterOrder4(float data, FILTER_ORDER4_T* filter_state, IIR_ORDER4_COEFF_T* IIR_coeffs)
{float data_filtered;filter_state->first_order2_out = filterOrder2(&data, &filter_state->first_order2.m1, &filter_state->first_order2.m2, IIR_coeffs->a[0], IIR_coeffs->b[0], IIR_coeffs->gain); //第一级二阶滤波data_filtered = filterOrder2(&filter_state->first_order2_out, &filter_state->second_order2.m1, &filter_state->second_order2.m2, IIR_coeffs->a[1], IIR_coeffs->b[1], &IIR_coeffs->gain[1]); //第二级二阶滤波return data_filtered;
}/******************************************************************************/
/** Band-pass filtering for the norm data: 0.25-2Hz
* @param[in] x:norm data
*
* @return filtered data
*
*//*
* History :
* 1.Date : 2020/8/28
* Author :
* Modification : Created function*******************************************************************************/
float BandFilter(float x)
{float y = FilterOrder4(x, &xyz_filter, &IIR_vec);return y;
}
关于fdatool设计的带通滤波器的系数使用
使用Matlab的FDAtool工具可以很方便地设计IIR滤波器。使用File菜单中的export选项可以把滤波器的参数输出到Matlab的工作空间中。若滤波器为IIR型,则输出的变量名为G和SOS。它把高阶的IIR滤波器转换为一系列二阶IIR滤波器的级联。SOS为二阶IIR滤波器的系数(b,a),G为各级的增益系数,可用来调节各级通带的衰减。计算IIR滤波器的输出的时候,先将输入数据乘以G, 然后一一通过SOS中的每个IIR滤波器,就得到最终的结果了。
SOS的每一行表示一级二阶IIR滤波器系[b0,b1,b2,a0,a1,a2],G的每个元素表示相应级的增益系数。也即将G乘上SOS的b0,b1,b2。得到一组新的滤波器系数SOS',可调用MATLAB滤波函数sosfilt对输入信号进行滤波。
但是如果二阶IIR滤波器的程序只支持定点小数运算的话,那么就需要调整一下系数了。因为设计出来的G有时候很小(不知道会不会很大),这样一旦把输入数据乘以G后,就会使得二阶IIR滤波器的输入过小,造成很大的误差。我们需要把G分配到每个二阶IIR滤波器的系数中,使得每次得到的中间结果都刚好不会溢出。若以IIRi表示第i个二阶IIR滤波器的话,则我们需要保证IIR1, IIR1 * IIR2, IIR1 * IIR2 * IIR3, … 的频率响应都不超过0dB,*号表示级联。为了使得输出的精度最好,我们还需要让上面这些滤波器的频率响应中的最大值最接近0dB。
级联型:将系统传递函数H(z)因式分解为多个二阶子系统,系统函数就可以表示为这些二阶子系统传递函数的乘积。实现时将每个二阶子系统用直接型实现,整个系统函数用二阶环节的级联实现。
高阶IIR滤波器的实现是采用二阶滤波器级联的方式来实现的。默认情况下,Filter Coefficients把结果分成多个2阶Section显示,其中还有增益。增益的目的是为了保证计算的精度和系统的稳定性。
简单介绍低通滤波器的使用,其函数参考fdesign官网
如下
简单设计了低通滤波
%% 低通滤波
function filtered = LowFilter(x)
fs_origin=1;
fc=0.03;
N=4;
hd_low = design(fdesign.lowpass('N,F3dB',N,fc, fs_origin),'butter');
filtered = filter(hd_low,x);
end
..
matlab由滤波的系数得到传输函数 设计带通滤波器 design fdatool设计IIR带通滤波器相关推荐
- 【MATLAB】利用Simulink自带模块Analog Filter Design逼近设计
Simulink自带了一个名为"Analog Filter Design"的模块,可以用于设计模拟滤波器.这个模块基于MATLAB的filterDesigner工具,提供了一些滤波 ...
- 使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)
简单低通滤波器 以下是一个使用C++语言编写的基本低通滤波器的示例代码,它可以对输入信号进行滤波以降低高频成分: #include <iostream> #include <vect ...
- FDATool设计FIR低通滤波器
(一) 设计一个低通滤波器 采样频率 Fs = 50Hz Fpass = 10Hz Fstop = 20Hz 打开matlab,键入fdatool后,会弹出该工具的对话框.然后按照下图设置相关 ...
- matlab波形相似系数,如何用matlab计算波形相似系数
. 低通采样定理实验 1.1 实验目的 1.了解数字信号处理系统的一般构成: 2.掌握奈奎斯特抽样定理. 1.2 实验仪器 1.YBLD智能综合信号源测试仪 1台 2.双踪示波器 1台 3.MCOM- ...
- matlab soble滤波,MATLAB 图像滤波去噪分析及其应用
MATLAB 图像滤波去噪分析及其应用 第1章 图像颜色空间相互转换与MATLAB实现 1.1 图像颜色空间原理 1.1.1 RGB颜色空间 1.1.2 YCbCr颜色空间 1.1.3 YUV颜色空间 ...
- 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”
[系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <嵌入式Linux开发实战> [从数据采样到滤波 ...
- butter滤波器matlab设计,详解滤波器设计命令之二:butter命令使用实例
下面结合实际介绍butter命令的用法. 例1 设计低通滤波器 由于计算机采样频率可以高达为44100Hz,语音的最高频率为20000 H以上,是一种极宽带的语音,实际上有一部分频率为超声波,人耳几 ...
- matlab课程设计报告题目,课程设计报告
<课程设计报告>由会员分享,可在线阅读,更多相关<课程设计报告(6页珍藏版)>请在人人文库网上搜索. 1.课程设计报告(文章一):课程设计报告 课程设计报告 题 目: 语音信号 ...
- Matlab 菲涅尔系数计算
1 简介 Matlab 菲涅尔系数计算 2 部分代码 function varargout = Fresnel(varargin) % FRESNEL MATLAB code for Fresnel ...
- 自控matlab设计,自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真
自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真 < 自动控制原理 >课程设计说 明 书日期: 2012.5.21-2012.6.1 自动控制原理 课程设计评阅书题目 基于 ...
最新文章
- 2022-2028年中国中空玻璃聚硫密封胶行业市场研究及前瞻分析报告
- controller与servlet区别
- 关于Android制作.9.png图片
- python数组和列表_Python-01矩阵、数组和列表等的总结
- DataGridView中实现点击单元格Cell动态添加自定义控件
- Activiti工作流框架学习(一)环境的搭建和数据表的了解
- 演练 类的定义 java 1615134691
- 加了定位后div不显示了_FANUC主轴定位(M19)后诊断参数445不显示怎么办?
- 根据序列选择自回归模型(AR、ARMA、VAR、VMA、VECH)
- su插件打开显示html,如何让自己的su从工具变成神器?你需要这些插件
- 半车模型悬架系统的simulink仿真
- 51单片机程序下载失败原因排查
- 冷门短视频带货玩法,零门槛赚钱项目
- SaaS第一,股价暴涨,25年的金蝶迎来第二春
- Linux如何检查是否支持SNI,WDCP下的纯Nginx支持多域名ssl证书(TLS SNI support disabled)解决方案...
- MySQL数据库与JDBC编程
- C - C语言实验——求两个整数之中较大者
- iOS锁屏界面音频播放控制
- Gdevops北京站归来
- 喵喵机和咕咕机哪个好,打印效果大评测!喵喵机p2 VS咕咕机GT1
热门文章
- java的第一个代码模型,简单的java类
- 机器视觉实用工具集NO.15——利用图像放射变换做类似文件扫描仪效果工具
- 盘盘在项目中你常用的那些数组API
- 黑鲨重装计算机安装无法继续,一键重装失败不要怕,黑鲨教你解决一键重装系统失败问题...
- 在校大学生关于程序员培训机构的想法
- nginx反向代理解封电信80端口
- 对JS中this的理解
- 罗永浩发声:我的努力很可能失败 但好产品一定要赢
- 程序员删库跑路,开源开发者的出路在哪里
- 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN