GSL中的数字滤波

数字滤波

24.1 介绍

    本章中讨论的滤波器是基于以下以第i个样本为中心的滑动数据窗口:

     这里,H是非负整数,称为窗口半长,表示样本i前后的样本个数,总窗口长度为K = 2H + 1。

24.2 处理端点

    当处理接近输入信号末端的样本时,将没有足够的样本来填充WiH定义的窗口。因此,用户必须指定如何构造靠近端点的窗口。这是通过传递一个类型为gsl_filter_end_t的输入参数来实现的:

gsl_filter_end_t

本数据类型指定如何在端点附近构造窗口,可以从以下选项中进行选择:

GSL_FILTER_END_PADZERO

使用该选项,通过在信号端点附近的窗口中插入零来构造一个长度为K的全窗口。有效地将输入信号修改为,

 确保所有xi有定义良好的窗口。

    GSL_FILTER_END_PADVALUE

使用这个选项,一个长度为K的全窗口将通过填充输入信号中的第一个和最后一个样本来构建。有效地将输入信号修改为,

 GSL_FILTER_END_TRUNCATE

使用此选项,不执行填充,窗口只是在接近端点时被截断。

24.3 线性数字滤波器

24.3.1 高斯滤波器

高斯滤波器将输入信号与高斯核或高斯窗进行卷积。这种滤波器通常用作平滑或降噪滤波器。高斯核定义为:

 其中,−(K−1)/2≤k≤(K−1)/2,K为核的大小。α参数指定在内核中期望的标准偏差σ的数目。例如,设置α = 3将定义一个长度为K,跨越±3σ的高斯窗。构建内核时,通常更方便指定参数α,而不是标准差σ。因为无论K的大小如何变化,对于固定的α值有相同的高斯形状。标准偏差的适当值取决于K,并与α相关。

 下面的例程接受α代替σ作为输入参数。

利用卷积的导数性质,高斯滤波器提供了方便的方法对输入信号进行一次微分和平滑处理。

 输入信号x(t)通过与一个导数高斯核进行卷积,可以同时进行平滑和微分,这可以很容易地根据上面的解析表达式计算。同样的原理也适用于高阶导数。

gsl_fifilter_gaussian_workspace * gsl_filter_gaussian_alloc(const size_t K)

    本函数使用大小为K的核来初始化高斯滤波的工作空间,这里H = K/2。如果K是偶数,它四舍五入到下一个奇数,以确保窗对称。工作空间的大小为O(K)

void gsl_filter_gaussian_free(gsl_fifilter_gaussian_workspace * w)

    本函数释放w占用的内存空间。

int gsl_filter_gaussian(const gsl_fifilter_end_t endtype, const double alpha,

const size_t order, const gsl_vector * x, gsl_vector * y,

gsl_fifilter_gaussian_workspace * w)

本函数对输入向量x应用一个参数为alpha的高斯滤波器,将输出存储在y中。导数的阶数由order指定,0对应一个高斯函数,1对应一个一阶导数高斯函数,以此类推。参数endtype指定如何处理信号端点。过滤器允许x = y。

int gsl_filter_gaussian_kernel(const double alpha, const size_t order,

const int normalize, gsl_vector * kernel)

本函数构造一个用alpha参数化的高斯核,并将输出存储在kernel中。参数order指定了导数的阶数,0对应高斯函数,1对应一阶导数高斯函数,以此类推。如果normalize设置为1,那么内核将在输出时被规范化为和为1。如果normalize设置为0,则不执行normalize。

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/120583269