数字滤波
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。