Main Content

sgolayfilt

萨维茨基-戈雷滤波

说明

示例

y = sgolayfilt(x,order,framelen) 对向量 x 中的数据应用多项式阶数为 order、帧长度为 framelen 的萨维茨基-戈雷有限冲激响应 (FIR) 平滑滤波器。如果 x 是矩阵,则 sgolayfilt 对每列进行运算。

示例

y = sgolayfilt(x,order,framelen,weights) 指定在最小二乘最小化过程中要使用的加权向量。

y = sgolayfilt(x,order,framelen,weights,dim) 指定滤波器沿其运算的维度。

示例

全部折叠

生成一个随机信号并使用 sgolayfilt 对其进行平滑处理。指定多项式阶数为 3,帧长度为 11。绘制原始信号和经过平滑处理的信号。

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

sgolayfilt 函数通过将信号与 sgolay 的输出 B的中间行进行卷积来执行大部分滤波。这将得到滤波信号的稳态部分。生成并绘制此部分。

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

靠近信号边缘的采样无法放在对称窗的中心,必须区别对待。

为了确定启动瞬变,对 B 的前 (framelen-1)/2 行与信号的前 framelen 个采样执行矩阵乘法。

ybeg = B(1:m,:)*x(1:framelen);

为了确定终止瞬变,对 B 的最后 (framelen-1)/2 行与信号的最后 framelen 个采样执行矩阵乘法。

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

将瞬变部分与稳态部分连接起来以生成完整信号。

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

向最小二乘最小化方法添加权重会破坏 B 的对称性,并且需要额外的步骤才能获得合适的解决方案。

加载以 Fs=7418 Hz 采样的语音信号。该文件包含女声读“MATLAB®”的录音。

load mtlb
t = (0:length(mtlb)-1)/Fs;

通过对长度为 21 的数据帧应用 9 阶多项式的萨维茨基-戈雷滤波器来平滑信号。绘制原始信号和滤波后的信号。放大到 0.02 秒的间隔。

rd = 9;
fl = 21;

smtlb = sgolayfilt(mtlb,rd,fl);

subplot(2,1,1)
plot(t,mtlb)
axis([0.2 0.22 -3 2])
title('Original')
grid

subplot(2,1,2)
plot(t,smtlb)
axis([0.2 0.22 -3 2])
title('Filtered')
grid

重复计算,但现在使用凯塞窗作为加权向量。指定形状因子 β=38。绘制新的滤波后的信号。

kmtlb = sgolayfilt(mtlb,rd,fl,kaiser(fl,38));

subplot(2,1,2)
hold on
plot(t,kmtlb)
axis([0.2 0.22 -3 2])
hold off

输入参数

全部折叠

输入信号,指定为向量或矩阵。

数据类型: single | double

多项式阶数,指定为正整数。order 必须小于 framelen。如果 order = framelen - 1,则滤波器不会产生平滑效果。

数据类型: single | double

帧长度,指定为正奇数。

数据类型: single | double

加权数组,指定为长度为 framelen 的正实数向量或矩阵。

数据类型: single | double

要沿其滤波的维度,指定为正整数标量。默认情况下,sgolayfilt 沿 x 的大小大于 1 的第一个维度进行运算。

数据类型: single | double

输出参量

全部折叠

滤波后的信号,以向量或矩阵形式返回。

提示

萨维茨基-戈雷平滑滤波器通常用于“平滑”频率跨度(无噪声)较大的含噪信号。它们也被称为数字平滑多项式滤波器或最小二乘平滑滤波器。在某些应用中,萨维茨基-戈雷滤波器的性能优于标准平均值 FIR 滤波器,后者往往会将高频成分随噪声一起滤除。萨维茨基-戈雷滤波器在保留高频信号分量方面更为有效,但在抑制噪声方面不太成功。

萨维茨基-戈雷滤波器在对含噪数据帧进行多项式拟合时能够最小化最小二乘误差,从这个意义上而言,它们是最优的滤波器。有关萨维茨基-戈雷算法的详细信息,请参阅 sgolay

参考

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice Hall, 1996.

[2] Schafer, Ronald. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine 28, no. 4 (July 2011): 111–17. https://doi.org/10.1109/MSP.2011.941097.

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2006a 之前推出

另请参阅

| | |