当前位置:首页 > 嵌入式 > 嵌入式客栈
[导读][导读]:前面一篇文章关于IIR/移动平均滤波器设计的文章。本文来聊一聊陷波滤波器,该滤波器在混入谐波干扰时非常有用,算法简单,实现代价低。本文来一探其在机理、应用场景。 注:尽量在每篇文章写写摘要,方便阅读。信息时代,大家时间都很宝贵,如此亦可

[导读]:前面一篇文章关于IIR/移动平均滤波器设计的文章。本文来聊一聊陷波滤波器,该滤波器在混入谐波干扰时非常有用,算法简单,实现代价低。本文来一探其在机理、应用场景。

注:尽量在每篇文章写写摘要,方便阅读。信息时代,大家时间都很宝贵,如此亦可节约粉丝们的宝贵时间。

前文所说学习的倡导2W1H原则,思来想来并不全面,本文决定从What Why Where When How几个维度展开。我称之为4W1H学习法,借鉴管理学领域中的5W1H,起源于1932年,美国政治学家拉斯维尔提出“5W分析法”,后延伸出5W1H法。有兴趣的可以找来阅读,题外话技术人员读一些方法论管理学方面的书籍于做人做事个人认为是非常有益的。

梳状滤波器之What?

在信号处理中,梳状滤波器是通过向其自身添加信号的延迟而实现的,从而造成增强或削弱干扰的滤波器。梳状滤波器的频率响应由一系列规则间隔的凹口组成,从而呈现出梳状外观。其大体拓扑形式如下:

梳状滤波器有着大量不同形式的传递函数,其作用是对周期性信号增强或削弱周期性信号,本文主要介绍其中一种形式的Z传递函数

其中:

其信号流图如下:

梳状滤波器英文称为comb(梳子) filter,这个名字真是无与伦比的绝!为何?谈到滤波器一定会重点关注其对幅频响应曲线,梳状滤波器,正是描述其幅频响应的。而幅频响应从本质上讲是描述系统各频率能量的放大或者衰减。本文中谈到的滤波器就是一个系统,对其输入能量按频率不同进行放大或者衰减,从而起到过滤作用。

梳状滤波器之Why?

前面说到梳状滤波器其幅频响应样子和梳子长的很像,为啥长的像,来一探究竟:

其频率响应为:

现以采样率20000Hz,10阶,阻带带宽50Hz为例。其幅频响应曲线如下:

相频响应曲线为:

从幅频响应曲线可看出,其形状真是如梳子形状,当阶数越大,其齿数越多。这种形式的梳状滤波器对于2KHz,4KHz,6KHz,8KHz,10KHz信号是衰减作用,也即阻止该频率通过,阻带宽度为50Hz。前面谈到了我们可以对某些频率信号加强,而其他的信号衰减吸收。这里引申出其互补滤波器,其Z传递函数刚好有一点形式上的对称性:

其中b为:

此互补滤波器其幅频响应曲线为:

这两个滤波器其幅频响应曲线刚好是互补对称的。至此,从原理上已基本明了为什么称其为梳状滤波器。

梳状滤波器就其本质也是一种IIR滤波器,因为滤波器的输出反馈参与了滤波运算。

梳状滤波器之Where?

费这么大劲研究梳状滤波器,须的知道在什么地方可以去使用它,事实上梳状滤波器有着大量的应用场合:

  • 级联积分梳状(CIC)滤波器,通常用于插值和抽取操作期间的抗混叠,这些操作会更改离散时间系统的采样率。
  • PAL和NTSC电视解码器的芯片(也可能是软件滤波)实现的2D和3D梳状滤波器用以降低网点伪影干扰。
  • 音频信号处理,包括延迟,镶边和数字波导合成中大量应用。例如,如果将延迟设置为几毫秒,则可以使用梳状滤波器对圆柱空腔或振动弦中的声驻波的影响进行建模。
  • 在天文学中,天体梳滤波器有望将现有光谱仪的精度提高近一百倍。
  • 在声学方面,梳齿滤波会以某些不需要的方式出现。例如,当两个扬声器在距收听者不同距离处播放同一信号时,会对信号产生梳状滤波效果。在任何封闭的空间中,听众会听到直接声音和反射声音的混合声音。由于反射的声音路径较长,因此构成了直接声音的延迟版本,并创建了一个梳状滤波器,使两者在听众处合并。
  • 仪器仪表也常用梳状滤波器消除谐波干扰,或者选频放大。
  • ......

梳状滤波器之When?

个人观点:
  • 如遇到谐波干扰,在硬件很难解决时就可以考虑。

  • 在做图像处理时也可以考虑使用该滤波器进行精准重建。

  • 普通单片机系统

  • DSP仪器仪表系统中

接下来就是究竟怎么用C语言以及MATLAB实现的干货了,请继续......

梳状滤波器之How?

本文依然借助于matlab的fdatool进行设计示例:

将其重要设置标注如上,其他的与IIR一文类似,就不罗嗦举例了。将重要参数输入,点击设计就轻松设计出相应的滤波器参数了。这里以1000Hz采样率,40Hz带宽,20阶为例,设计出滤波器参数如下:

Generated by MATLAB(R) 8.4 and the Signal Processing Toolbox 6.22.
% Generated on: 05-Apr-2020 13:40:29

% Coefficient Format: Decimal

% Discrete-Time IIR Filter (real)     
% -------------------------------     
% Filter Structure    : Direct-Form II
% Numerator Length    : 21            
% Denominator Length  : 21            
% Stable              : Yes           
% Linear Phase        : No            

                                     
Numerator:                            
 0.38970091175151578                  
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
 0                                    
-0.38970091175151578                  
Denominator:                          
1                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0                                     
0.22059817649696845                            

C语言实现非常简单,由于梳状滤波器本质上是IIR滤波器,所以也可以直接利用前文ARM的库函数实现部署。由前面Z传递函数,很容易推导出其差分方程如下:

其互补滤波器差分方程为:

依据上面公式非常容易设计出C代码,这里将浮点数实现共享,如需定点实现也非常容易,代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>

/*长度应为阶数+1*/
#define CMF_RANK  20
typedef double E_SAMPLE;

typedef enum _E_CMF_TYPE{
    CMF_TYPE_STOP_BANDS,
    CMF_TYPE_PASS_BANDS
}E_CMF_TYPE;
/*定义移动平均寄存器历史状态*/
typedef struct _t_CMF
{

    E_SAMPLE x[CMF_RANK];
    E_SAMPLE y[CMF_RANK];
    double b;
    double r;
    E_CMF_TYPE type;
    int index;
}t_CMF;

void comb_filter_init(t_CMF * pCmf,double rho,E_CMF_TYPE type)
{
    memset(pCmf,0,sizeof(t_CMF));
    pCmf->index = CMF_RANK-1;
    pCmf->r = rho;
    pCmf->type = type;

    if(type==CMF_TYPE_STOP_BANDS)
        pCmf->b = (1+rho)/2;
    else
        pCmf->b = (1-rho)/2;
}

E_SAMPLE comb_filter(t_CMF * pCmf,E_SAMPLE xn)
{
    E_SAMPLE yn=0;
    int n_N;
    int i=0;

    n_N = pCmf->index;
    if(pCmf->type == CMF_TYPE_STOP_BANDS)
    {
        /*y[n] = bx[n]-bx[n-N]+ry[n-N]*/
        yn = pCmf->b*(xn-pCmf->x[n_N])+pCmf->r*pCmf->y[n_N];
    }
    else
    {
        /*y[n] = bx[n]+bx[n-N]+ry[n-N]*/
        yn = pCmf->b*(xn+pCmf->x[n_N])+pCmf->r*pCmf->y[n_N];
    }

    /*存储yn为下次迭代准备*/
    pCmf->y[n_N] = yn;
    pCmf->x[n_N] = xn;


    if(pCmf->index==0)
        pCmf->index = CMF_RANK-1;
    else
        pCmf->index--;

    return yn;
}

#define SAMPLE_RATE 1000.0f
#define SAMPLE_SIZE 512
#define PI 3.415926f
int main()
{
    E_SAMPLE rawSin[SAMPLE_SIZE];
    E_SAMPLE outSin[SAMPLE_SIZE];

    t_CMF cmf;

    FILE *pFile=fopen("./simulationSin.csv","wt+");
    if(pFile==NULL)
    {
        printf("simulationSin.csv opened failed");
        return -1;
    }

    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        rawSin[i]  = 10*sin(2*PI*25*i/SAMPLE_RATE);//+rand()%10;
        rawSin[i] += 10*sin(2*PI*50*i/SAMPLE_RATE);
    }

    /*初始化*/
    comb_filter_init(&cmf,-0.22059817649696845,CMF_TYPE_STOP_BANDS);
    /*滤波*/
    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        outSin[i]=comb_filter(&cmf,rawSin[i]);
    }

    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        fprintf(pFile,"%f,",rawSin[i]);
    }

    fprintf(pFile,"\n");
    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        fprintf(pFile,"%f,",outSin[i]);
    }

    /*初始化*/
    comb_filter_init(&cmf,-0.22059817649696845,CMF_TYPE_PASS_BANDS);
    /*滤波*/
    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        outSin[i]=comb_filter(&cmf,rawSin[i]);
    }

    /*存储数据*/
    fprintf(pFile,"\n");
    for(int i=0;i<SAMPLE_SIZE;i++)
    {
        fprintf(pFile,"%f,",outSin[i]);
    }
    fclose(pFile);

    return 0;
}

同样利用excel,生成波形如下:

可见,经过梳状滤波器过滤后,50Hz谐波已经被过滤掉,25Hz 保留下来,而经过其互补滤波器后,25Hz被过滤,其50Hz被保留。如看时域波形不直观,可利用Python代码进行FFT展开分析:

梳妆滤波后FFT谱线图:

互补梳状滤波器过滤后FFT谱线图:

总结:

  • 梳妆滤波器本质上是一种IIR滤波器
  • 梳妆滤波器在滤除谐波上,利用极小代价就可以比较好的滤除谐波干扰
  • 其互补滤波器在时域时会失真,使用时需要考虑
  • 如需要考虑计算效率,可以考虑定点优化,但精度会下降。
  • 梳妆滤波器在2D/3D图像处理广为应用,如有兴趣可深入研究
  • 如需FFT的python代码,加作者微信领取


点击留言/查看留言


END

果喜欢右下点个在看,也会让我倍感鼓舞

往期精彩推荐




▲深度解析U-Boot网络实现(长篇好文)
读U-Boot源码-C语言编程大法总结篇一
读U-Boot源码-C语言编程技巧总结篇二
基于Buildroot的Linux系统构建之根文件系统
手把手教系列之移动平均滤波器C实现
手把手教系列之IIR数字滤波器设计实现

关注置顶:扫描左下二维码关注公众号加星

讨论加群:扫描右下二维码添加,发送“加群”

关注

加群

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭