滤波器设计--C语言实现

滤波器设计 专栏收录该内容
4 篇文章 0 订阅

本文简单介绍,在差分方程已知或滤波器框图给出的情况下,使用C语言实现滤波器的方法。

一. 对一个p阶FIR滤波器(无反馈):

差分方程:

这里写图片描述

滤波器框图:

这里写图片描述

float fir_filt(float x, const float *b, float *s, int p)
{
    y = b[0] * x;   //对输出y赋初值

    for(int i = 0; i <= p; i++)   //输出
        y += b[i+1] * s[i];

    for(int i = p; i > 0; i++)   //更新寄存器
        s[i] = s[i-1];

    s[0] = x;

    return y;
}

二. 对于一个IIR滤波器:

差分方程:

这里写图片描述

滤波器框图:

这里写图片描述

float IIR_filt(float x, const float *c, float *s)
{
    float y = c[0] * x + s[0];   //对y赋初值(输出)

    s[0] = s[1] + c[1]*x - c[3] * y;    //更新

    s[1] = c[2] * x - c[4] * y;

    return y;
}   

三. MATLAB中,Filter函数的C语言实现

在MATLAB中,有这样一个函数dsp.ColoredNoise,从名字看出,该函数用来生成不同颜色的噪声,使用方法:

H = dsp.ColoredNoise returns a colored noise generator, H, with default settings. Calling step with the default property settings generates a pink noise signal.

系数取不同值,生成不同色噪:

An InverseFrequencyPower value of 1 generates a pink noise. This is the default value.
An InverseFrequencyPower value of 2 generates a Brownian process.
An InverseFrequencyPower value of 0 generates a white noise process with a flat PSD.
An InverseFrequencyPower value of -1 generates a blue noise process.
An InverseFrequencyPower value of -2 generates a violet (purple) noise process.

当value = 1,生成粉噪,根据粉噪生成的原理,将白噪声通过一个全极点滤波器,即可生成粉噪,这里我们讨论如何设计这个IIR全极点(All-poles)滤波器:

差分方程:

这里写图片描述

滤波器框图:

这里写图片描述

float all-pole(float *x, float *y, float *s, const float *a, int n, int p)
{
y = x - a[0] * s[0];   //对y赋初值

for(int i = 0; i < p; i++)   //输出
    y -= a[i+1] * s[i+1];

for(int i = p; i > 0; i--)   //更新
    s[i] = s[i-1];

s[0] = y;

return y;
}
  • 7
    点赞
  • 3
    评论
  • 33
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值