时域方法---Savitzky-Golay 滤波器介绍,光谱分析应用(创新点:自适应窗口大小和多项式阶数的选择能够更好地处理信号的局部变化;改进的边界处理方法减少了边界效应,提高了滤波器的性能)

介绍

Savitzky-Golay 滤波器是一种数字滤波技术,主要用于数据平滑和去噪。其主要特点是能够在保留信号重要特征(如峰值和宽度)的同时,减少噪声的影响。以下是对 Savitzky-Golay 滤波器的详细介绍

原理

Savitzky-Golay 滤波器通过在滑动窗口内对数据进行多项式拟合来实现平滑。具体过程如下:

选择窗口大小:定义滑动窗口的大小(一般为奇数,以确保中心点的对称性)。
多项式拟合:在每个滑动窗口内,使用最小二乘法拟合一个低阶多项式(例如线性、多项式等)。
计算平滑值:用拟合的多项式计算窗口中心点的平滑值

优点

保留信号特征:相比于简单的移动平均滤波,Savitzky-Golay 滤波器在去噪的同时,更好地保留了原始信号的特征。
灵活性高:可以通过调整窗口大小和多项式阶数来控制平滑效果

应用

Savitzky-Golay 滤波器广泛应用于各种科学和工程领域,特别是在光谱分析、生物医学信号处理和化学计量学等领域。例如:

光谱分析:用于平滑光谱数据,以提高信噪比,便于峰值检测和定量分析。
生物医学信号处理:用于平滑心电图(ECG)、脑电图(EEG)等信号,去除高频噪声

实现

Savitzky-Golay 滤波器在许多编程语言和数据分析软件中都有现成的实现。例如,在 Python 中,可以使用 scipy.signal.savgol_filter 函数来应用这一滤波器

本文代码

我们将使用Savitzky-Golay 滤波器用于光谱分析

步骤

自适应窗口大小:根据信号的局部特征自适应调整窗口大小,以更好地处理不同频率成分。
多阶多项式选择:根据信号的局部变化选择多项式阶数,以更好地拟合复杂信号。
边界处理:改进边界处理方法,减少边界效应。

核心代码

adaptive_savgol_filter.m

function y_smooth = adaptive_savgol_filter(y, min_window, max_window, min_order, max_order)
    % 自适应 Savitzky-Golay 滤波器
    % y - 输入信号
    % min_window - 最小窗口大小
    % max_window - 最大窗口大小
    % min_order - 最小多项式阶数
    % max_order - 最大多项式阶数

    n = length(y);
    y_smooth = zeros(size(y));

    for i = 1:n
        % 自适应窗口大小
        window_size = min_window + (max_window - min_window) * adaptive_factor(y, i);


        % 自适应多项式阶数
        poly_order = min_order + round((max_order - min_order) * adaptive_factor(y, i));
        % 边界处理
        if i <= half_window
            % 左边界
            y_segment = y(1:i + half_window);
            x_segment = -i + 1:i + half_window - i;
        elseif i > n - half_window
            % 右边界
            y_segment = y(i - half_window:end);
            x_segment = -half_window:length(y_segment) - half_window - 1;
        else
            % 中间部分
            y_segment = y(i - half_window:i + half_window);
            x_segment = -half_window:half_window;
        end

        % 确保x_segment与y_segment长度一致
        if length(x_segment) ~= length(y_segment)
            error('x_segment and y_segment lengths do not match.');
        end

        % 拟合多项式并计算平滑值
        p = polyfit(x_segment, y_segment, poly_order);
        y_smooth(i) = polyval(p, 0);
    end
end

function factor = adaptive_factor(y, index)
    % 计算自适应因子
    % 这里使用局部信号变化率作为自适应因子,可以根据需要改进
    n = length(y);
    if index == 1
        diff_val = abs(y(index + 1) - y(index));
    elseif index == n
        diff_val = abs(y(index) - y(index - 1));
    else
        diff_val = abs(y(index + 1) - y(index - 1)) / 2;
    end

    max_diff = max(abs(diff(y)));
    factor = diff_val / max_diff;
end


run_adaptive_savgol_filter.m

% 示例数据
x = linspace(0, 2 * pi, 1000);
y = sin(x) + 0.5 * sin(10 * x) + randn(size(x)) * 0.1;

% 参数设置
min_window = 5;
max_window = 21;
min_order = 2;
max_order = 4;

% 应用自适应 Savitzky-Golay 滤波器
y_smooth = adaptive_savgol_filter(y, min_window, max_window, min_order, max_order);

% 可视化
figure;
plot(x, y, 'b-', 'DisplayName', 'Noisy signal');
hold on;
plot(x, y_smooth, 'r-', 'DisplayName', 'Smoothed signal');
legend;
title('Adaptive Savitzky-Golay Filter');
xlabel('x');
ylabel('y');

说明

自适应窗口大小和多项式阶数:根据局部信号变化率调整窗口大小和多项式阶数,使用 adaptive_factor 函数计算自适应因子。
边界处理:通过扩展信号段来处理边界,以减少边界效应。
示例数据和可视化:生成包含噪声的正弦信号,并应用自适应 Savitzky-Golay 滤波器进行平滑,最后进行可视化展示。

创新点

自适应窗口大小和多项式阶数的选择能够更好地处理信号的局部变化。
改进的边界处理方法减少了边界效应,提高了滤波器的性能。

效果

在这里插入图片描述

完整代码获取

微信扫一扫,回复“Savitzky-Golay 滤波器”获取完整代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值