打印
[DSP编程]

iir 和 fdatool 生成的系数 怎么对应

[复制链接]
5720|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七颗咖啡豆|  楼主 | 2014-9-4 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************
Filter Structure  : Direct-Form II, Second-Order Sections
Filter Order      : 9                                    
Stable            : Yes                                 
Linear Phase      : No                                   

                                                        
SOS matrix:                                             
1  2  1  1  -1.999613100064790  0.999652383313099        
1  2  1  1  -1.998968806646649  0.998999402319374        
1  2  1  1  -1.998450097795885  0.998467398305476        
1  2  1  1  -1.998114691678256  0.998120306729685        
1  1  0  1  -0.998999394665826  0.000000000000000        
Scale Factors:                                          
0.000009820812077                                       
0.000007648918181                                       
0.000004325127398                                       
0.000001403762857                                       
0.000500302667087                                       
1.000000000000000
*******************************/

y(n) = ? * x(n)  + ? *  x(n-1) + .....+ ? * y(n-1)  +  ? * y(n-2)  +......
?号处应当填写上面生成的那些参数?
求指教:'(

相关帖子

沙发
aresc| | 2014-9-4 22:16 | 只看该作者
本帖最后由 aresc 于 2014-9-4 22:20 编辑

9阶的IIR滤波器,系数是拆成了5((9+1)/2) 个二阶的IIR滤波器级联,最后一个实际上是一个一阶IIR,因为b2和a2都是0.
用第一组为例:
1  2  1  1  -1.999613100064790  0.999652383313099

对应的scalefactor为0.000009820812077, 对应的滤波器系数为
[b0, b1, b2] = 0.000009820812077*[1, 2, 1] , [a0, a1, a2] = [1,  -1.999613100064790,  0.999652383313099 ], a0总是为1. 另外4组二阶IIR是同样的转换。

二阶IIR的差分方程: y(n) =b0*x(n)+b1*x(n-1)+b2*x(n-2) - a1*y(n-1) - a2*y(n-2).

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
七颗咖啡豆 + 1 很给力!
板凳
zhangmangui| | 2014-9-4 23:00 | 只看该作者
FIR的举例说明

1. 参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64pi
窗函数长度:blackman窗的过渡带宽为5.98,单位为2pi/N,而要设计的低通滤波器的过度带宽为2pi*12/50=0.48pi,两者相等,得N=24.9,取25
2. 滤波器的脉冲响应
理想低通滤波器脉冲响应:
h1[n] = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi
窗函数为:
w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
则滤波器脉冲响应为:
h[n] = h1*w[n]    |n|<=12
h[n] = 0               |n|>12
3. 滤波器的差分方程
根据滤波器的脉冲响应计算出h[n],然后将脉冲响应值移位为因果序列,下面将利用matlab计算h[n]的值,具体如下:
>> Window=blackman(25);
>> b=fir1(24,0.64,Window);
>> freqz(b,1)
>> b=roundn(b,-3)    %任意位四舍五入
b =
  Columns 1 through 8
        0      0    0.0010   -0.0020   -0.0020    0.0100   -0.0090   -0.0180
  Columns 9 through 16
    0.0490   -0.0200   -0.1100    0.2800    0.6400    0.2800   -0.1100   -0.0200
  Columns 17 through 24
    0.0490   -0.0180   -0.0090    0.0100   -0.0020   -0.0020    0.0010     0
  Column 25
     0
最后得到滤波器的差分方程为:
y[n] =   0.001x[n-2] - 0.002x[n-3] - 0.002x[n-4] + 0.01x[n-5] - 0.009x[n-6] - 0.018[n-7]
+ 0.049x[n-8] -0.02x[n-9] - 0.11x[n-10] + 0.28x[n-11] + 0.64x[n-12] + 0.28x[n-13] - 0.11[n-14] - 0.02x[n-15] + 0.049x[n-16] - 0.018x[n-17] - 0.009x[n-18] + 0.1x[n-19] - 0.002x[n-20] - 0.002x[n-21] + 0.001x[n-22]

使用特权

评论回复
地板
七颗咖啡豆|  楼主 | 2014-9-5 08:56 | 只看该作者
zhangmangui 发表于 2014-9-4 23:00
FIR的举例说明

1. 参数计算窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50= ...

FIR我会的:)

使用特权

评论回复
5
七颗咖啡豆|  楼主 | 2014-9-5 09:01 | 只看该作者
aresc 发表于 2014-9-4 22:16
9阶的IIR滤波器,系数是拆成了5((9+1)/2) 个二阶的IIR滤波器级联,最后一个实际上是一个一阶IIR,因为b2 ...

int iir(float a)
{
        int i;
        static        float y11, y22, y33, y44, y55;
        static        float y1[3], y2[3], y3[3], y4[], y5[3], x[3];
        for(i=2; i>0; i--)
        {
                x  = x[i-1] ;
                y1 = y1[i-1];
                y2 = y2[i-1];
                y3 = y3[i-1];
                y4 = y4[i-1];
                y5 = y5[i-1];
        }
       
         x[0] = a;
         y1[0] = y11;
         y2[0] = y22;
         y3[0] = y33;
         y4[0] = y44;
         y5[0] = y55;

        y11 = 0.000009820812077 *(1*x[0]  + 2*x[1]  + 1*x[2]  ) + 1.999613100064790 * y1[1] - 0.999652383313099 * y1[2];
        y22 = 0.000007648918181 *(1*y1[0] + 2*y1[1] + 1*y1[2] ) + 1.998968806646649 * y2[1] - 0.998999402319374 * y2[2]);
        y33 = 0.000004325127398 *(1*y2[0] + 2*y2[1] + 1*y2[2] )+ 1.998450097795885 * y3[1] - 0.998467398305476 * y3[2]);
        y44 = 0.000001403762857 *(1*y3[0] + 2*y3[1] + 1*y3[2] )+ 1.998114691678256 * y4[1] - 0.998120306729685 * y4[2]);
        y55 = 0.000500302667087 *(1*y4[0] + 1*y4[1] + 0*y4[2] )+ 0.998999394665826 * y5[1] - 0 * y5[2]);
       
        return y55 ;
}


写的C,话说系数需要转成 INT型的不

使用特权

评论回复
6
aresc| | 2014-9-6 23:24 | 只看该作者
浮点DSP直接可以用浮点格式,如果是定点DSP,对于[-1.0,1.0)之外的数需要注意别被限幅到 [-1.0,1.0)之间了,可以预先除以2的N次方转换到[-1.0,1.0)之间,相应在滤波的累积过程中做反向的左移N位补回去。比如系数1.999613100064790, 可以存成1.999613100064790 / 2,滤波中和y[n-1]相乘后的结果在左移一位。

另外你上面的那个IIR很多错误,完全工作不了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

508

帖子

4

粉丝