写在前面的话:

由滤波器系数得到传输函数:

使用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 and Nb are not provided. Specified using FilterOrder. 关于滤波其的阶数
  • 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 bandpassSpecs = fdesign.bandpass(___,Fs) provides the sample rate in Hz of the signal to be filtered. 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设计的滤波器中,两种方法查看设计的滤波器,任意一种都可以;

  1. 点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器,
  2. 或者采用如下图操作,从左到右三个按键

双击可以看到滤波器的内部结构,如图显示为两个二阶滤波器级联:

放大其中一个滤波器如下

简单作了标记如下

并给出其对应的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带通滤波器相关推荐

  1. 【MATLAB】利用Simulink自带模块Analog Filter Design逼近设计

    Simulink自带了一个名为"Analog Filter Design"的模块,可以用于设计模拟滤波器.这个模块基于MATLAB的filterDesigner工具,提供了一些滤波 ...

  2. 使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)

    简单低通滤波器 以下是一个使用C++语言编写的基本低通滤波器的示例代码,它可以对输入信号进行滤波以降低高频成分: #include <iostream> #include <vect ...

  3. FDATool设计FIR低通滤波器

    (一) 设计一个低通滤波器 采样频率 Fs = 50Hz   Fpass = 10Hz   Fstop = 20Hz 打开matlab,键入fdatool后,会弹出该工具的对话框.然后按照下图设置相关 ...

  4. matlab波形相似系数,如何用matlab计算波形相似系数

    . 低通采样定理实验 1.1 实验目的 1.了解数字信号处理系统的一般构成: 2.掌握奈奎斯特抽样定理. 1.2 实验仪器 1.YBLD智能综合信号源测试仪 1台 2.双踪示波器 1台 3.MCOM- ...

  5. matlab soble滤波,MATLAB 图像滤波去噪分析及其应用

    MATLAB 图像滤波去噪分析及其应用 第1章 图像颜色空间相互转换与MATLAB实现 1.1 图像颜色空间原理 1.1.1 RGB颜色空间 1.1.2 YCbCr颜色空间 1.1.3 YUV颜色空间 ...

  6. 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <嵌入式Linux开发实战> [从数据采样到滤波 ...

  7. butter滤波器matlab设计,详解滤波器设计命令之二:butter命令使用实例

    下面结合实际介绍butter命令的用法. 例1  设计低通滤波器 由于计算机采样频率可以高达为44100Hz,语音的最高频率为20000 H以上,是一种极宽带的语音,实际上有一部分频率为超声波,人耳几 ...

  8. matlab课程设计报告题目,课程设计报告

    <课程设计报告>由会员分享,可在线阅读,更多相关<课程设计报告(6页珍藏版)>请在人人文库网上搜索. 1.课程设计报告(文章一):课程设计报告 课程设计报告 题 目: 语音信号 ...

  9. Matlab 菲涅尔系数计算

    1 简介 Matlab 菲涅尔系数计算​ 2 部分代码 function varargout = Fresnel(varargin) % FRESNEL MATLAB code for Fresnel ...

  10. 自控matlab设计,自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真

    自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真 < 自动控制原理 >课程设计说 明 书日期: 2012.5.21-2012.6.1 自动控制原理 课程设计评阅书题目 基于 ...

最新文章

  1. 2022-2028年中国中空玻璃聚硫密封胶行业市场研究及前瞻分析报告
  2. controller与servlet区别
  3. 关于Android制作.9.png图片
  4. python数组和列表_Python-01矩阵、数组和列表等的总结
  5. DataGridView中实现点击单元格Cell动态添加自定义控件
  6. Activiti工作流框架学习(一)环境的搭建和数据表的了解
  7. 演练 类的定义 java 1615134691
  8. 加了定位后div不显示了_FANUC主轴定位(M19)后诊断参数445不显示怎么办?
  9. 根据序列选择自回归模型(AR、ARMA、VAR、VMA、VECH)
  10. su插件打开显示html,如何让自己的su从工具变成神器?你需要这些插件
  11. 半车模型悬架系统的simulink仿真
  12. 51单片机程序下载失败原因排查
  13. 冷门短视频带货玩法,零门槛赚钱项目
  14. SaaS第一,股价暴涨,25年的金蝶迎来第二春
  15. Linux如何检查是否支持SNI,WDCP下的纯Nginx支持多域名ssl证书(TLS SNI support disabled)解决方案...
  16. MySQL数据库与JDBC编程
  17. C - C语言实验——求两个整数之中较大者
  18. iOS锁屏界面音频播放控制
  19. Gdevops北京站归来
  20. 喵喵机和咕咕机哪个好,打印效果大评测!喵喵机p2 VS咕咕机GT1

热门文章

  1. java的第一个代码模型,简单的java类
  2. 机器视觉实用工具集NO.15——利用图像放射变换做类似文件扫描仪效果工具
  3. 盘盘在项目中你常用的那些数组API
  4. 黑鲨重装计算机安装无法继续,一键重装失败不要怕,黑鲨教你解决一键重装系统失败问题...
  5. 在校大学生关于程序员培训机构的想法
  6. nginx反向代理解封电信80端口
  7. 对JS中this的理解
  8. 罗永浩发声:我的努力很可能失败 但好产品一定要赢
  9. 程序员删库跑路,开源开发者的出路在哪里
  10. 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN