实用数字滤波器设计小结之IIR和FIR

总时不时接触和用到滤波器设计,现在对它做一个简要的小结,本文仅仅是从应用出发的,实用主义,理论上冗长的详解可网上轻松查到。

1 首先看一下滤波器的基本结构

1.1  Finite Impulse Response (FIR)filters

一般公式如下:


H为系数,x输入,y为输出,通常我们是根据历史数据x和系数H求出y,那么在实时滤波中我们只需根据我们设计的滤波器系数来选择需要存储的个数,然后求出y.

例如:已知:H[4] = {1,2,3,4};x[4] = {a,b,c,d};

 Y = 1*d + 2*c +3*b + 4*d; H[0]与最新采集的x相乘。

求出最新采集数值d滤波后的值y.

1.2 Infinite Impulse Response (IIR) filters


双线性变换:

        S —— Z

s-平面(ωA)和 z-平面(ωD)不成线性关系

实用数字滤波器设计小结之IIR和FIR_第1张图片

利用双线性变换设计IIR滤波器4步:

1 获取S平面滤波器传递函数

实用数字滤波器设计小结之IIR和FIR_第2张图片

2 预变换S平面ωA到Z平面ωD.   fC= 3000,fs = 24000

实用数字滤波器设计小结之IIR和FIR_第3张图片

3 ωA  进行变换


4 S平面到Z平面

实用数字滤波器设计小结之IIR和FIR_第4张图片

2 利用MATLAB fdatool 设计滤波器

很多资料介绍如何设计和填写参数,自不必多讲!

   有几点自己原来没有注意到的加以说明。

   定点参数输出 set quantization parameters 处需要注意,可选择use unsigned representation 和Scale 他和numerator coefficients to fully utilize the entire dynamic range ,但是需要在设计IIR滤波器时,系统是否稳定。

另外Edit菜单下面的convert to single section可以转化为我们方便编程的numerator和Denominator。

还有Export toworkspace仿真,可以输出coefficients Numerators andDenominators, 也可以输出Objects,simulation

Matlabtest code:

freqz(Num,Den);freqz(Hd);%可以看看是否和设计时的结果是否相识;

y= filter(Num,Den,x); y = filter(Hd,x);%y 就是滤波后的输出,可方便查看仿真结果

3 C语言至实际应用

3.1 FIR Filters

在MATLAB中上面已经讲到如何进行convert to fixedpoint,然后乘以2^15次方(正负1范围),转换为整数。

FIR例程摘自例程,这里就不重复了!

实用数字滤波器设计小结之IIR和FIR_第5张图片

3.2 IIRFilters

需要说明一下,并非所有的浮点都可以转换成定点数,有时候会出错。

IIR例程摘自CCS例程…

 

/*****************************************************************************/
/* second_order_IIR_direct_form_I()                                          */
/*---------------------------------------------------------------------------*/
/*                                                                           */
/* Second order direct form I IIR filter implemented by cascading two second */
/* order filters.                                                            */
/*                                                                           */
/* This implementation uses two buffers, one for x[n] and the other for y[n] */
/*                                                                           */
/*****************************************************************************/

signed int second_order_IIR_direct_form_I( const signed int * coefficients, signed int input)
{
  long temp;
  static signed int x[3] = { 0, 0, 0 };  /* x(n), x(n-1), x(n-2). Must be static */
  static signed int y[3] = { 0, 0, 0 };  /* y(n), y(n-1), y(n-2). Must be static */ 

     x[0] = input; /* Copy input to x[0] */
      
     temp =  ( (long) coefficients[B0] * x[0]) ;   /* B0 * x(n)     */
     temp += ( (long) coefficients[B1] * x[1]);    /* B1/2 * x(n-1) */
     temp += ( (long) coefficients[B1] * x[1]);    /* B1/2 * x(n-1) */
     temp += ( (long) coefficients[B2] * x[2]);    /* B2 * x(n-2)   */
     temp -= ( (long) coefficients[A1] * y[1]);    /* A1/2 * y(n-1) */
     temp -= ( (long) coefficients[A1] * y[1]);    /* A1/2 * y(n-1) */
     temp -= ( (long) coefficients[A2] * y[2]);    /* A2 * y(n-2)   */
 
     /* Divide temp by coefficients[A0] to remove fractional part */    
     temp >>= 15;

     y[0] = (short int) ( temp );

     /* Shuffle values along one place for next time */
  
     y[2] = y[1];   /* y(n-2) = y(n-1) */
     y[1] = y[0];   /* y(n-1) = y(n)   */
    
     x[2] = x[1];   /* x(n-2) = x(n-1) */
     x[1] = x[0];   /* x(n-1) = x(n)   */

 return ( (short int) temp ); 
}

 

 

你可能感兴趣的:(Software)