LP滤波器的C实现

信息处理 过滤器 离散信号
2022-02-10 06:46:10

我有以下代码,有人告诉我这是一个低通巴特沃斯滤波器。我如何为此得出频率响应和相位?我只有模拟电子方面的经验,因此无法将其与真实的滤波器响应联系起来。我不确定为什么所有内容都按比例放大 2^16 - 这一定与在计算过程中保持足够的分辨率有关?

#define FILTER_TC(FC, FS) ((411775 * FC) / FS)'

其中TC = (2^16) * 2pi * Fc * FsFc截止频率以 Hz 为单位,Fs采样频率以 Hz 为单位。

#define FILTER_LP(FILTER_OUT, FILTER_IN, FC, FS) \
    (FILTER_OUT += ((signed long)FILTER_TC(FC, FS) * \
    ((signed long)FILTER_IN - (signed long)(FILTER_OUT)) >> 16)'

感谢您对此的任何帮助。

jmv

1个回答

您可以通过稍微重写预处理器宏的主体来计算过滤器的传递函数。让(实际上只是定义滤波器的截止频率)在下面的表达式FILTER_TC(FC, FS)中等于。k

#define FILTER_LP(FILTER_OUT, FILTER_IN, FC, FS) \
    FILTER_OUT = FILTER_OUT + ((signed long) k * ((signed long) FILTER_IN - (signed long) FILTER_OUT)) >> 16)

在上面,我只是将+=运算符扩展为不那么简洁。通过检查,我们可以写出离散时间差分方程:

y[n]=y[n1]+k(x[n]y[n1])y[n]=(1k)y[n1]+kx[n]

其中分别等于在时间索引处。这映射到域传递函数:y[n]x[n]FILTER_OUTFILTER_INnz

H(z)=Y(z)X(z)=k1(1k)z1

这是一个低通滤波器,虽然它不是巴特沃斯滤波器。其频率响应如下图所示k = 0.25

在此处输入图像描述

在上面的频率响应图中,蓝色迹线显示幅度响应,绿色迹线对应于相位响应。它表明您给出的示例不是一个特别好的低通滤波器,即使对于一阶滤波器也是如此。例如,通过使用正确的巴特沃斯结构,您可以在高频衰减方面做得更好。

使用位操作和显式signed long类型转换,因为过滤器是使用定点算术实现的。这是一种使用整数来表示使用固定量化级别的实数的方案。过去,DSP 算法的定点实现几乎无处不在,但浮点处理正变得越来越普遍。我希望今天主要在低功耗或嵌入式环境中找到定点实现。