用FDATOOL生成的fir滤波器实现框图模型,怎么查看内部结构框图?

  除了采用编程的方法实现滤波器之外,Matlab中自带工具箱FDATool也能很方便快速的实现滤波器的设计。另外FPGA、DSP等实现数字滤波器算法时,经常要用到滤波器系数,采用FDATool工具箱也能快速的得到滤波器系数。
二、实验平台
  Matlab7.1
三、实现步骤
3.1&滤波器指标
若需要设计一个16阶的FIR滤波器(h(0)=0),给定的参数如下:
(1)&低通滤波器
(2)&采样频率Fs为48kHz,滤波器Fc为10.8kHz
(3)&输入序列位宽为9位(最高位为符号位)
在此利用MATLAB来完成FIR滤波器系数的确定。
3.2&打开MATLAB的FDATool
MATLAB集成了一套功能强大的滤波器设计工具FDATool(Filter&Design&&&Analysis&Tool),可以完成多种滤波器的设计、分析和性能评估。
单击MATLAB主窗口下方的&Start&按钮,如图B.1所示,选择菜单&ToolBox&&&&Filter&Design&&&&Filter&Design&&&Analysis&Tool(FDATool)&命令,打开FDATool,如图B.2所示。
                    图B.1&FDATool的启动
                    图B.2&FDATool的主界面
另外,在MATLAB主命令窗口内键入&fdatool&,同样可打开FDATool程序界面。
3.3&选择Design&Filter
FDATool界面左下侧排列了一组工具按钮,其功能分别如下所述:
●&创建多速率滤波器(Create&a&Multirate&Filter)
●&滤波器转换(TransForm&Filter)
●&设置量化参数(Set&Quantization&Parameters)
●&实现模型(Realize&Model)
●&零极点编辑器(Pole-zero&Editor)
●&导入滤波器(Import&Filter)
●&设计滤波器(Design&Filter)
选择其中的按钮,进入设计滤波器界面,进行下列选择,如图B.3所示。
                  图B.3&FDATool设计FIR滤波器
●&滤波器类型(Filer&Type)为低通(Low&Pass)
●&设计方法(Design&Method)为FIR,采用窗函数法(Window)
●&滤波器阶数(Filter&order)定制为15
●&窗口类型为Kaiser,Beta为0.5
●&Fs为48kHz,Fc为10.8kHz
最后单击Design&Filter图标,让MATLAB计算FIR滤波器系数并作相关分析。
其系统函数H(z)可用下式来表示:
显然上式可以写成:
即可以看成是一个15阶的FIR滤波器的输出结果经过了一个单位延时单元,所以在FDATool中,把它看成15阶FIR滤波器来计算参数。
因此,设置滤波器阶数时,要比要求的小1。
3.4&滤波器分析
计算完FIR滤波器系数以后,往往需要对设计好的FIR滤波器进行相关的性能分析,以便了解该滤波器是否满足设计要求。分析操作步骤如下:
选择FDATool的菜单&Analysis&&&Magnitude&Response&,启动幅频响应分析如图B.4所示,x轴为频率,y轴为幅度值(单位为dB)。
            图B.4&FIR滤波器幅频响应
在图的左侧列出了当前滤波器的相关信息:
●&滤波器类型为Direct&Form&FIR(直接I型FIR滤波器)
●&滤波器阶数为15
选择菜单&Analysis&&&Phase&Response&,启动相频响应分析,如图B.5所示。由该图可以看到设计的FIR滤波器在通带内其相位响应为线性的,即该滤波器是一个线性相位的滤波器。
              图B.5&滤波器相频响应
图B.6显示了滤波器幅频特性与相频特性的比较,这可以通过菜单&Analysis&&&Magnitude&and&Phase&Response&来启动分析。
              图B.6&滤波器幅频和相频响应
选择菜单&Analysis&&&Group&Delay&Response&,启动群时延分析。
FDATool还提供了以下几种分析工具:
●&群时延响应分析。
●&冲激响应分析(Impulse&Response),如图B.7所示。
●&阶跃响应分析(Step&Response),如图B.8所示。
●&零极点图分析(Pole/Zero&Plot),如图B.9所示。
              图B.7&冲激响应
              图B.8&阶跃响应
              图B.9&零极点图
求出的FIR滤波器的系数可以通过选择菜单&Analysis&&&Filter&Coefficients&来观察。如图B.10所示,图中列出了FDATool计算的15阶直接I型FIR滤波器的部分系数。
              图B.10&滤波器系数
可以看到,FDATool计算出的值是一个有符号的小数,如果建立的FIR滤波器模型需要一个整数作为滤波器系数,就必须进行量化,并对得到的系数进行归一化。为此,单击FDATool左下侧的工具按钮进行量化参数设置。量化参数有三种方式:双精度、单精度和定点。在使用定点量化前,必须确保MATLAB中已经安装定点工具箱并有相应的授权。
3.6&导出滤波器系数
为导出设计好的滤波器系数,选择FDATool菜单的&File&&&Export&命令,打开Export(导出)对话框,如图B.11所示。
图B.11&滤波器系数Export对话框
在该窗口中,选择导出到工作区(Workplace)。这时滤波器系数就存入到一个一维变量Num中了。不过这时Num中的元素是以小数形式出现的:
Columns&1&through&9
-0.9&&0.4&&-0.0873&&-0.5&&0.3
Columns&10&through&16
0.1805&&-0.0484&&-0.4&&0.9&&-0.0369
阅读(...) 评论() &在simulink环境下如何将fdatool设计的滤波器文件.fda导入Digital Filter Design模块中?
[问题点数:100分,结帖人mingtianyouyu]
在simulink环境下如何将fdatool设计的滤波器文件.fda导入Digital Filter Design模块中?
[问题点数:100分,结帖人mingtianyouyu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年3月 扩充话题大版内专家分月排行榜第三
2013年11月 挨踢职涯大版内专家分月排行榜第二2010年7月 挨踢职涯大版内专家分月排行榜第二2010年5月 挨踢职涯大版内专家分月排行榜第二2010年4月 挨踢职涯大版内专家分月排行榜第二2010年3月 扩充话题大版内专家分月排行榜第二
2010年3月 挨踢职涯大版内专家分月排行榜第三
2010年1月 扩充话题大版内专家分月排行榜第二
2010年2月 扩充话题大版内专家分月排行榜第三2009年10月 扩充话题大版内专家分月排行榜第三
2013年11月 挨踢职涯大版内专家分月排行榜第二2010年7月 挨踢职涯大版内专家分月排行榜第二2010年5月 挨踢职涯大版内专家分月排行榜第二2010年4月 挨踢职涯大版内专家分月排行榜第二2010年3月 扩充话题大版内专家分月排行榜第二
2010年3月 挨踢职涯大版内专家分月排行榜第三
匿名用户不能发表回复!|matlab怎么调用fdatool的滤波器_百度知道
matlab怎么调用fdatool的滤波器
就是我用fdatool设计了一个滤波器 但是在matlab的主界面上怎么使用它 就是比如说有一个函数y=sin(x)加入噪声之后的函数叫A,怎么让A通过这个滤波器得到我想要的波形 答得好加分
我有更好的答案
1. 在Matlab中键入fdatool运行Filter Design and Analysis Tool。具体使用请参见Matlab Help中的Signal Processing Toolbox-&FDATool。2. 在fdatool工具中应该注意的几个问题:(a)Fstop(阻带截止频率)不能大于或等于采样频率Fs/2,这是由于数字滤波器设计的方式决定的。(b)将设计好的滤波器导出,可以采用两种方式Export the filter either as filter coefficients variables or as a dfilt or mfilt filter object variable。(详细说明参见Matlab Help中的Signal Processing Toolbox-&FDATool-&Exporting a Filter Design。
导出:File---Export弹出EXPORT对话框,选择“Export As”为“Objects”,“Varable Names”可以更改,默认为Hd。3. (a)如果导出的是dfilt or mfilt filter object variable,则可以用[b, a] = tf(Hd)将dfilt filter object转换为转移函数形式
采纳率:79%
来自团队:
看你用Fdatool设计的是FIR滤波器还是IIR。若是前者,则需要在Fdatool界面的File下选择Export,注意输出的变量名默认为Num,此时需要这样设置,b=Num,a=1;而后滤波,filteredA=filter(b,a,A);若是后者,同样选择Export,并注意输出变量名(注意大小写),并调用[b,a]=sos2tf(SOS,G);而后滤波,filteredA=filter(b,a,A);
filteredA=filter(b,a,A);输入这个之后怎么让他出现滤波之后的波形啊
figuresubplot(121)plot(A)subplot(122)plot(filteredA)
本回答被提问者和网友采纳
首先在command window中输入fdatool,回车,出现下图所示界面根据你的要求设计滤波器,然后点下方的design filter,导出滤波器系数方法File-Export,格式可以自己选择,然后将你要滤波的信号与该滤波器系数做卷积conv,就可以得到你想要的波形了。
这里说的很明白了。
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
matlab的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。【原创】【安富莱——DSP教程】第40章 IIR滤波器的实现 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 7536|回复: 9
【原创】【安富莱——DSP教程】第40章 IIR滤波器的实现
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:
第40章 IIR滤波器的实现
& & 本章节讲解IIR滤波器直接I型的低通,高通,带通和带阻滤波器的实现。& & 40.1 IIR滤波器介绍& & 40.2 Matlab工具箱fdatool生成IIR滤波器系数& & 40.3 IIR低通滤波器设计& & 40.4 IIR高通滤波器设计& & 40.5 IIR带通滤波器设计& & 40.6 IIR带阻滤波器设计& & 40.7 总结
40.1 IIR滤波器介绍& & ARM官方提供的直接I型IIR库支持Q7,Q15,Q31和浮点四种数据类型。其中Q15和Q31提供了基于Cortex-M3和Cortex-M4的快速版本。& & 直接I型IIR滤波器是基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成:y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]& & 直接I型算法每个阶段需要5个系数和4个状态变量。
40.1.png (17.25 KB, 下载次数: 3)
10:04 上传
& & 这里有一点要特别的注意,有些滤波器系数生成工具是采用的下面公式实现:y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]& & 比如matlab就是使用上面的公式实现的,所以在使用fdatool工具箱生成的a系数需要取反才能用于直接I型IIR滤波器的函数中。& & 高阶IIR滤波器的实现是采用二阶Biquad级联的方式来实现的。其中参数numStages就是用来做指定二阶Biquad的个数。比如8阶IIR滤波器就可以采用numStages=4个二阶Biquad来实现。
40.2.png (14.57 KB, 下载次数: 8)
10:04 上传
如果要实现9阶IIR滤波器就需要将numStages=5,这时就需要其中一个Biquad配置成一阶滤波器(也就是b2=0,a2=0)。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.2 Matlab工具箱fdatool生成IIR滤波器系数& & 前面介绍FIR滤波器的时候,我们讲解了如何使用fdatool生成C头文件,从而获得滤波器系数。这里不能再使用这种方法了,主要是因为通过C头文件获取的滤波器系数需要通过ARM官方的IIR函数调用多次才能获得滤波结果,所以我们这里换另外一种方法。& & 下面我们讲解如何通过fdatool工具箱生成滤波器系数。首先在matlab的命令窗口输入fdatool就能打开这个工具箱:
40.3.png (3.45 KB, 下载次数: 5)
10:12 上传
fdatool界面打开效果如下:
40.4.png (41.4 KB, 下载次数: 4)
10:12 上传
IIR滤波器的低通,高通,带通,带阻滤波的设置会在下面一一讲解,这里说一下设置后相应参数后如何生成滤波器系数。参数设置好以后点击如下按钮:
40.5.png (41.08 KB, 下载次数: 1)
10:12 上传
点击Design Filter之后,注意左上角生成的滤波器结构:
40.6.png (45.78 KB, 下载次数: 1)
10:12 上传
默认生成的IIR滤波器类型是Direct-Form II, Second-Order Sections(直接II型,每个Section是一个二阶滤波器)。这里我们需要将其转换成Direct-Form I, Second-Order Sections,因为本章使用的IIR滤波器函数是Direct-Form I的结构。& & 转换方法,点击Edit-&Convert Structure,界面如下,这里我们选择第一项,并点击OK:
40.7.png (13.27 KB, 下载次数: 1)
10:12 上传
转换好以后再点击File-Export,第一项选择Coefficient File(ASCII):
40.8.png (13.45 KB, 下载次数: 1)
10:12 上传
第一项选择好以后,第二项选择Decimal:
40.9.png (10.29 KB, 下载次数: 1)
10:12 上传
两个选项都选择好以后,点击Export进行导出,导出后保存即可:
40.10.png (22.25 KB, 下载次数: 2)
10:12 上传
保存后Matlab会自动打开untitled.fcf文件,可以看到生成的系数:%
% Generated by MATLAB(R) 7.14 and the Signal Processing Toolbox 6.17.
%
% Generated on: 30-Dec-:50
%
% Coefficient Format: Decimal
% Discrete-Time IIR Filter (real)& && && && && && && && && &
% -------------------------------& && && && && && && && && &
% Filter Structure& & : Direct-Form II, Second-Order Sections
% Number of Sections&&: 2& && && && && && && && && && && && &
% Stable& && && && &&&: Yes& && && && && && && && && && && &
% Linear Phase& && &&&: No& && && && && && && && && && && &&&
& && && && && && && && && && && && && && && && && && && && &
SOS Matrix:& && && && && && && && && && && && && && && && &&&
1&&2&&1&&1&&-1.3479& &0.95477& && &&&
1&&2&&1&&1&&-0.175& && &&&
& && && && && && && && && && && && && && && && && && && && &
Scale Values:& && && && && && && && && && && && && && && && &
0.15171& && && && && && && && && && && && && && &
0.34613复制代码由于咱们前面选择的是4阶IIR滤波,生成的结果就是由两组二阶IIR滤波系数组成,系数的对应顺序如下:SOS Matrix:& && && && && && && && && && && && && && && && &&&
1& &2& &1& &1& &-1.3479& &0.95477& && &&&
b0&&b1&&b2&&a0& && &&&a1& && && && && && && & a2
1 2& &1& &1& &-0.175& && &&&
b0&&b1&&b2&&a0& && &&&a1& && && && && && && & a2复制代码注意,实际使用ARM官方的IIR函数调用的时候要将a1和a2取反。另外下面两组是每个二阶滤波器的增益,滤波后的结果要乘以这两个增益数值才是实际结果:0.15171& && && && && && && && && && && && && && &
0.34613复制代码实际的滤波系数调用方法,看下面的例子即可。
在线时间718 小时
ST金币1137
该用户从未签到主题帖子精华
沙发,支持原创
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.3 IIR低通滤波器设计& & 本章使用的IIR滤波器函数是arm_biquad_cascade_df1_f32。下面使用此函数设计IIR低通,高通,带通和带阻滤波器。40.3.1 函数arm_biquad_cascade_df1_f32说明函数定义如下:& & void arm_biquad_cascade_df1_f32(& && && && &const arm_biquad_casd_df1_inst_f32 * S,& && && && &float32_t * pSrc,& && && && &float32_t * pDst,& && && &&&uint32_t blockSize)参数定义:& && & [in]&&*S& && && &points to an instance of the floating-point Biquad cascade structure.& & & && & [in]&&*pSrc& && &points to the block of input data.& & & && &[out] *pDst& && &points to the block of output data.& & & && &[in]&&blockSize&&number of samples to process per call.& & & && &return& &&&none.& & 注意事项:结构arm_fir_instance_f32的定义如下(在文件arm_math.h文件):& && &typedef struct& && &{& && &/**& number of 2nd order stages in the filter.
Overall order is 2*numStages. */& && &uint32_t numS& && && & /**& Points to the array of state coefficients.
The array is of length 4*numStages. */& && &float32_t *pS & && &/**& Points to the array of coefficients.&&The array is of length 5*numStages. */& && && & float32_t *pC & && &} arm_biquad_casd_df1_inst_f32;特别注意,参数pState指向的数组大小要是4倍的numStages,pCoeffs指向的数组大小要是5倍的numStages。1. 参数pCoeffs指向滤波因数,滤波因数数组长度为numTaps。但要注意pCoeffs指向的滤波因数应该按照如下的顺序进行排列:& && & {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} & & 先放第一个二阶Biquad系数,然后放第二个,以此类推。2. pState指向状态变量数组。3. blockSize 这个参数的大小没有特殊要求,用户只需保证大于1且小于等于采样点个数即可。
40.3.2 fdatool获取低通滤波器系数& & 设计一个如下的例子:& & 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器低通滤波器,采用直接I型,截止频率80Hz,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
40.11.png (47.89 KB, 下载次数: 10)
10:21 上传
配置好低通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。
40.3.3 低通滤波器实现 & & 通过工具箱fdatool获得低通滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试低通滤波器的效果。#define numStages&&2& && && && && & /* 2阶IIR滤波的个数 */
#define TEST_LENGTH_SAMPLES&&400& & /* 采样点数 */
static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];& && && && && &/* 滤波后的输出 */
static float32_t IIRStateF32[4*numStages];& && && && && && && & /* 状态缓存,大小numTaps + blockSize - 1*/
& && && && && && && && && && && && && && && && && && && && && && && && && &&&
/* 巴特沃斯低通滤波器系数 80Hz*/& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
const float32_t IIRCoeffs32LP[5*numStages] = {
1.0f,&&2.0f,&&1.0f, 1.2167f,&&-0.86178f,& && &&&
1.0f,&&2.0f,&&1.0f, 1.2184f,&&-0.55354f& && && && && && && && &&&
};
/*
*********************************************************************************************************
*& & & & 函 数 名: arm_iir_f32_lp
*& & & & 功能说明: 调用函数arm_iir_f32_lp实现低通滤波器
*& & & & 形& & 参:无
*& & & & 返 回 值: 无
*********************************************************************************************************
*/
static void arm_iir_f32_lp(void)
{
uint32_
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleV
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP[0], (float32_t
*)&IIRStateF32[0]);
/* IIR滤波 */
& & & & arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
/*放缩系数 */
ScaleValue = 0.161221f * 0.58381f
/* 打印滤波后结果 */
for(i=0; i&TEST_LENGTH_SAMPLES; i++)
{
printf(&%f\r\n&, testOutput[i]*ScaleValue);
}
}复制代码运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。& & 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:fs=1000;& && && && &&&%设置采样频率 1K
N=400;& && && && && &%采样点数& && &
n=0:N-1;
t=n/& && && && && & %时间序列
f=n*fs/N;& && && && &&&%频率序列
x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);& &&&%50Hz和200Hz正弦波
subplot(211);
plot(t, x1);
title('滤波后的理想波形');
subplot(212);
plot(t, sampledata);
title('ARM官方库滤波后的波形');
复制代码Matlab计算结果如下:
40.12.png (10.43 KB, 下载次数: 5)
10:21 上传
从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:fs=1000;& && && && && & %设置采样频率 1K
N=400;& && && && && &&&%采样点数& && &
n=0:N-1;
t=n/& && && && && && &%时间序列
f=n*fs/N;& && && && && & %频率序列
x = sin(2*pi*50*t) + sin(2*pi*200*t);& && &%50Hz和200Hz正弦波合成
&&
subplot(211);
y=fft(x, N);& && && && && & %对信号x做FFT& &
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
y3=fft(sampledata, N);& & %经过IIR滤波器后得到的信号做FFT
subplot(212);& && && && && && && && && && &
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('IIR滤波后信号FFT');
复制代码Matlab计算结果如下:
40.13.png (9.69 KB, 下载次数: 7)
10:21 上传
上面波形变换前的FFT和变换后FFT可以看出,200Hz的正弦波基本被滤除。
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.4 IIR高通滤波器设计
40.4.1 fdatool获取高通滤波器系数& & 设计一个如下的例子:& & 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器高通滤波器,采用直接I型,截止频率140Hz,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
40.14.png (48.67 KB, 下载次数: 3)
10:27 上传
配置好高通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。
40.4.2 高通滤波器实现 & & 通过工具箱fdatool获得高通滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试高通滤波器的效果。#define numStages&&2& && && && && & /* 2阶IIR滤波的个数 */
#define TEST_LENGTH_SAMPLES&&400& & /* 采样点数 */
static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];& && && && && &/* 滤波后的输出 */
static float32_t IIRStateF32[4*numStages];& && && && && && && & /* 状态缓存,大小numTaps + blockSize - 1*/
& && && && && && && && && && && && && && && && && && && && && && && && && &&&
/* 巴特沃斯高通滤波器系数 140Hz */& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
const float32_t IIRCoeffs32HP[5*numStages] = {
1.0f,&&-2.0f,&&1.0f,&&0.1518f,& &-0.81642f,& && &
1.0f,&&-2.0f,&&1.0f,&&0.32121f,&&-0.97309f,& && && && && && && && && && &&&
};
/*
*********************************************************************************************************
*& & & & 函 数 名: arm_iir_f32_hp
*& & & & 功能说明: 调用函数arm_iir_f32_hp实现高通滤波器
*& & & & 形& & 参:无
*& & & & 返 回 值: 无
*********************************************************************************************************
*/
static void arm_iir_f32_hp(void)
{
uint32_
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleV
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32HP[0], (float32_t
*)&IIRStateF32[0]);
/* IIR滤波 */
& & & & arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
& &
/*放缩系数 */& &
ScaleValue = 0.99203f * 0.07356f;&&
/* 打印滤波后结果 */
for(i=0; i&TEST_LENGTH_SAMPLES; i++)
{
printf(&%f\r\n&, testOutput[i]*ScaleValue);
}
}复制代码运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。& & 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:fs=1000;& && && && &&&%设置采样频率 1K
N=400;& && && && && &%采样点数& && &
n=0:N-1;
t=n/& && && && && & %时间序列
f=n*fs/N;& && && && &&&%频率序列
x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);& &&&%50Hz和200Hz正弦波
subplot(211);
plot(t, x2);
title('滤波后的理想波形');
subplot(212);
plot(t, sampledata);
title('ARM官方库滤波后的波形');
复制代码Matlab计算结果如下:
40.15.png (9.78 KB, 下载次数: 1)
10:27 上传
从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:fs=1000;& && && && && & %设置采样频率 1K
N=400;& && && && && &&&%采样点数& && &
n=0:N-1;
t=n/& && && && && && &%时间序列
f=n*fs/N;& && && && && & %频率序列
x = sin(2*pi*50*t) + sin(2*pi*200*t);& && &%50Hz和200Hz正弦波合成
&&
subplot(211);
y=fft(x, N);& && && && && & %对信号x做FFT& &
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
y3=fft(sampledata, N);& & %经过IIR滤波器后得到的信号做FFT
subplot(212);& && && && && && && && && && &
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('IIR滤波后信号FFT');
复制代码Matlab计算结果如下:
40.16.png (9.54 KB, 下载次数: 1)
10:27 上传
上面波形变换前的FFT和变换后FFT可以看出,50Hz的正弦波基本被滤除。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.5 IIR带通滤波器设计
40.5.1 fdatool获取低通滤波器系数& & 设计一个如下的例子:& & 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器带通滤波器,采用直接I型,截止频率140Hz和,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
40.17.png (49.2 KB, 下载次数: 1)
10:32 上传
配置好带通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。
40.5.2 带通滤波器实现 & & 通过工具箱fdatool获得带通滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试带通滤波器的效果。#define numStages&&2& && && && && & /* 2阶IIR滤波的个数 */
#define TEST_LENGTH_SAMPLES&&400& & /* 采样点数 */
static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];& && && && && &/* 滤波后的输出 */
static float32_t IIRStateF32[4*numStages];& && && && && && && & /* 状态缓存,大小numTaps + blockSize - 1*/
& && && && && && && && && && && && && && && && && && && && && && && && && &&&
/* 巴特沃斯带通滤波器系数140Hz 400Hz*/& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
const float32_t IIRCoeffs32BP[5*numStages] = {
1.0f,&&0.0f,&&-1.0f,& & -1.1668f,& &-0.53411f,& && &
1.0f,&&0.0f,&&-1.0f,& & 0.04886f,&&-0.68387f& && && && && && && && && && &
/*
*********************************************************************************************************
*& & & & 函 数 名: arm_iir_f32_bp
*& & & & 功能说明: 调用函数arm_iir_f32_hp实现带通滤波器
*& & & & 形& & 参:无
*& & & & 返 回 值: 无
*********************************************************************************************************
*/
static void arm_iir_f32_bp(void)
{
uint32_
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleV
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32BP[0], (float32_t
*)&IIRStateF32[0]);
/* IIR滤波 */
& & & & arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
& &
/*放缩系数 */& &
ScaleValue = 0.77365f * 0.77365f;&&
/* 打印滤波后结果 */
for(i=0; i&TEST_LENGTH_SAMPLES; i++)
{
printf(&%f\r\n&, testOutput[i]*ScaleValue);
}
}复制代码运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。& & 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:fs=1000;& && && && &&&%设置采样频率 1K
N=400;& && && && && &%采样点数& && &
n=0:N-1;
t=n/& && && && && & %时间序列
f=n*fs/N;& && && && &&&%频率序列
x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);& &&&%50Hz和200Hz正弦波
subplot(211);
plot(t, x1);
title('滤波后的理想波形');
subplot(212);
plot(t, sampledata);
title('ARM官方库滤波后的波形');
复制代码Matlab计算结果如下:
40.18.png (9.7 KB, 下载次数: 1)
10:32 上传
从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:fs=1000;& && && && && & %设置采样频率 1K
N=400;& && && && && &&&%采样点数& && &
n=0:N-1;
t=n/& && && && && && &%时间序列
f=n*fs/N;& && && && && & %频率序列
x = sin(2*pi*50*t) + sin(2*pi*200*t);& && &%50Hz和200Hz正弦波合成
&&
subplot(211);
y=fft(x, N);& && && && && & %对信号x做FFT& &
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
y3=fft(sampledata, N);& & %经过IIR滤波器后得到的信号做FFT
subplot(212);& && && && && && && && && && &
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('IIR滤波后信号FFT');
复制代码Matlab计算结果如下:
40.19.png (9.54 KB, 下载次数: 1)
10:32 上传
上面波形变换前的FFT和变换后FFT可以看出,50Hz的正弦波基本被滤除。
在线时间587 小时
ST金币2468
该用户从未签到主题帖子精华
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.6 IIR带阻滤波器设计
40.6.1 fdatool获取带阻滤波器系数& & 设计一个如下的例子:& & 信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个巴特沃斯滤波器带阻滤波器,采用直接I型,截止频率100Hz和325Hz,采样400个数据,滤波器阶数设置为4。fadtool的配置如下:
40.20.png (49.37 KB, 下载次数: 1)
12:45 上传
配置好带阻滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。
40.6.2 带阻滤波器实现 & & 通过工具箱fdatool获得带阻滤波器系数后在开发板上运行函数arm_biquad_cascade_df1_f32来测试带阻滤波器的效果。#define numStages&&2& && && && && & /* 2阶IIR滤波的个数 */
#define TEST_LENGTH_SAMPLES&&400& & /* 采样点数 */
static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];& && && && && &/* 滤波后的输出 */
static float32_t IIRStateF32[4*numStages];& && && && && && && & /* 状态缓存,大小numTaps + blockSize - 1*/
& && && && && && && && && && && && && && && && && && && && && && && && && &&&
/* 巴特沃斯带阻滤波器系数100Hz 325Hz*/& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
const float32_t IIRCoeffs32BS[5*numStages] = {
1.0f,&&-0.35005f,&&1.0f,&&1.7746f,& &-0.21391f,
1.0f,&&-0.35005f,&&1.0f,&&-0.41883f, -0.08849f& && && && && && && && &
/*
*********************************************************************************************************
*& & & & 函 数 名: arm_iir_f32_bs
*& & & & 功能说明: 调用函数arm_iir_f32_bs实现带阻滤波器
*& & & & 形& & 参:无
*& & & & 返 回 值: 无
*********************************************************************************************************
*/
static void arm_iir_f32_bs(void)
{
uint32_
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleV
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32BS[0], (float32_t
*)&IIRStateF32[0]);
/* IIR滤波 */
& & & & arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
& &
/*放缩系数 */& &
ScaleValue = 0.78698f * 0.78698f;&&
/* 打印滤波后结果 */
for(i=0; i&TEST_LENGTH_SAMPLES; i++)
{
printf(&%f\r\n&, testOutput[i]*ScaleValue);
}
}复制代码运行如上函数可以通过串口打印出函数arm_biquad_cascade_df1_f32滤波后的波形数据,下面通过Matlab绘制波形来对比Matlab计算的结果和ARM官方库计算的结果。& & 对比前需要先将串口打印出的一组数据加载到Matlab中, arm_biquad_cascade_df1_f32的计算结果起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:fs=1000;& && && && &&&%设置采样频率 1K
N=400;& && && && && &%采样点数& && &
n=0:N-1;
t=n/& && && && && & %时间序列
f=n*fs/N;& && && && &&&%频率序列
x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);& &&&%50Hz和200Hz正弦波
subplot(211);
plot(t, x1);
title('滤波后的理想波形');
subplot(212);
plot(t, sampledata);
title('ARM官方库滤波后的波形');
复制代码Matlab计算结果如下:
40.21.png (10.4 KB, 下载次数: 1)
12:45 上传
从上面的波形对比来看,matlab和函数arm_biquad_cascade_df1_f32计算的结果基本是一致的。为了更好的说明滤波效果,下面从频域的角度来说明这个问题,Matlab上面运行如下代码:fs=1000;& && && && && & %设置采样频率 1K
N=400;& && && && && &&&%采样点数& && &
n=0:N-1;
t=n/& && && && && && &%时间序列
f=n*fs/N;& && && && && & %频率序列
x = sin(2*pi*50*t) + sin(2*pi*200*t);& && &%50Hz和200Hz正弦波合成
&&
subplot(211);
y=fft(x, N);& && && && && & %对信号x做FFT& &
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
y3=fft(sampledata, N);& & %经过IIR滤波器后得到的信号做FFT
subplot(212);& && && && && && && && && && &
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('IIR滤波后信号FFT');
复制代码Matlab计算结果如下:
40.22.png (9.63 KB, 下载次数: 1)
12:45 上传
上面波形变换前的FFT和变换后FFT可以看出,200Hz的正弦波基本被滤除。
在线时间169 小时
ST金币2053
该用户从未签到主题帖子精华
金牌会员, 积分 2349, 距离下一级还需 2651 积分
40.7 总结& & 本章节主要讲解了巴特沃斯低通,高通,带通和带阻滤波器的实现,有兴趣的可以使用同样的方法实现切比雪夫滤波器的设计。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间4 小时
该用户从未签到主题帖子精华
初级会员, 积分 71, 距离下一级还需 129 积分
不错挺好的!受教了!
站长推荐 /1
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by

我要回帖

更多关于 滤波器模型 的文章

 

随机推荐