IIR滤波器设计和思想

滤波器简介

matlab使用

https://www.cnblogs.com/21207-iHome/p/7059144.html

c语言设计

https://www.jianshu.com/p/0e246f3d4a7b

以低通滤波器(10hz以上频率滤除)为例:
1:参数生成(结果与matlab相同)

#define PI 3.14159265358979
void iir_lowspass_coefs_generate(float fn, float Q, float *coefs)
{
	//Q=0.707 截止频率衰减3Db fn=10(截止频率)/16000(sample_rate)
    float w0 = 2 * PI*fn;
    float alpha = (float)sin(w0) / (2 * Q);

    float a0 = 1 + alpha;
    float a1 = -2 * (float)cos(w0);
    float a2 = 1 - alpha;
    float b0 = (1 - (float)cos(w0))/2;
    float b1 = 1 - (float)cos(w0);
    float b2 = (1 - (float)cos(w0))/2;

    coefs[0] = 1;
    coefs[1] = a1/a0;
    coefs[2] = a2/a0;
    coefs[3] = b0/a0;
    coefs[4] = b1/a0;
    coefs[5] = b2/a0;
    printf("%f %f %f %f %f %f\n",coefs[0],coefs[1],coefs[2],coefs[3],coefs[4],coefs[5]);
}

IIR滤波器(计算公式)
在这里插入图片描述

float iir_low_pass_10hz(float Value)
{
    const float NUM[3] = {0.000015, 0.000031, 0.000015};
    const float DEN[3] = {1.000000, -1.988891, 0.988953};

    static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0;
    float Out = 0;

    x0 = Value;
    y0 = x0*NUM[0] + x1*NUM[1] + x2*NUM[2] - y1*DEN[1] - y2*DEN[2];//用差分方程计算就好
    y2 = y1;
    y1 = y0;
    x2 = x1;
    x1 = x0;
    Out=y0;
     
    return y0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值