Python의 savgol_filter에 대한 자세한 설명

savgol_filter 소개

Savitzky-Golay 필터는 1964년 Savitzky와 Golay가 처음 제안한 것으로 스펙트럼 전처리에서 일반적인 필터링 방법입니다. 핵심 아이디어는 특정 길이 창의 데이터 포인트에 대해 k-차 다항식 피팅을 수행하여 다음을 얻는 것입니다. 적합 결과 . 이를 이산화한 후 S-G 필터링은 실제로 이동 윈도우의 가중 평균 알고리즘이지만 그 가중 계수는 단순한 상수 윈도우가 아니라 슬라이딩 윈도우에서 주어진 고차 다항식에 대한 최소 제곱 알고리즘에 맞게 곱합니다. 이 필터의 가장 큰 특징은 노이즈를 필터링하면서 신호의 모양과 폭을 그대로 유지할 수 있다는 것입니다.

신호에 대한 작업은 시간 영역에서 window_length 내의 데이터에 대해 다항식 피팅을 수행하는 것 입니다 . 주파수 영역의 관점 에서 볼 때 이러한 종류의 피팅은 실제로 저주파 데이터를 통과시키고 고주파 데이터를 필터링합니다.

이러한 종류의 필터링은 실제로 이동 윈도우의 가중 평균 알고리즘 이지만 가중치 계수는 단순한 상수 윈도우가 아니라 슬라이딩 윈도우에서 주어진 고차 다항식의 최소 제곱 피팅에 의해 얻어집니다.

결론적으로 스무딩 필터링은 스펙트럼 분석에서 일반적으로 사용되는 전처리 방법 중 하나입니다. 평활화 및 필터링에 Savitzky-Golay 방법을 사용하면 스펙트럼의 평활도를 개선하고 노이즈의 간섭을 줄일 수 있습니다. SG 스무딩 필터의 효과는 선택한 창 너비에 따라 달라지므로 다양한 경우의 요구를 충족할 수 있습니다.

savgol_filter 원리

식:
scipy.signal.savgol_filter(x, window_length, polyorder)

자세한 표현과 정의는 다음 링크에서 찾을 수 있습니다:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.savgol_filter.html

매개변수의 의미:

1. x는 필터링할 신호입니다.

2. window_length는 창 길이이며 값은 홀수이며 len(x)를 초과할 수 없습니다. 크기가 클수록 스무딩 효과가 더 두드러지고 작을수록 원래 곡선에 더 가깝습니다.

3. polyorder는 다항식 피팅의 순서입니다. 작을수록 평활화 효과가 더 두드러지고, 클수록 원래 곡선에 더 가깝습니다.

매개변수 window_length가 스무딩에 미치는 영향

import os
import matplotlib.pyplot as plt
import scipy.signal
import numpy as np

def main():
    # 项目目录
    dir = "D:\\a_user_file\\8_data"
    filename = '1.csv'
    path = os.path.join(dir, filename)
    with open(path, "r") as fname:
        data = fname.read()
        lines = data.split("\n")
        lines = lines[1:5000]
        raw_data = []
        for i in range(len(lines)):
            line_i = lines[i].split(",")
            raw_data.append(int(line_i[4]))
    #sig = denoise(raw_data)
    sig = raw_data
    tmp_smooth1 = scipy.signal.savgol_filter(sig, 21, 3)
    tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)
    plt.subplot(3,1,1)
    plt.plot(sig)
    # plt.semilogx(sig, label='mic')
    plt.subplot(3,1,2)
    plt.plot(tmp_smooth1 * 0.5, label='mic'  + '拟合曲线-21', color='red')
    plt.subplot(3,1,3)
    plt.plot(tmp_smooth2 * 0.5, label='mic'  + '拟合曲线-53', color='green')
    plt.show()

main()

그 결과는 다음과 같다:
여기에 이미지 설명 삽입
window_length의 값이 작을수록 곡선이 실제 곡선에 가깝고, window_length의 값이 클수록 평활화 효과가 강함을 알 수 있다.

매개변수 polyorder의 스무딩 효과

아래와 같이 코드 쇼:

import os
import matplotlib.pyplot as plt
import scipy.signal
import numpy as np

def main():
    # 项目目录
    dir = "D:\\a_user_file\\8_data"
    filename = '1.csv'
    path = os.path.join(dir, filename)
    with open(path, "r") as fname:
        data = fname.read()
        lines = data.split("\n")
        lines = lines[1:5000]
        raw_data = []
        for i in range(len(lines)):
            line_i = lines[i].split(",")
            raw_data.append(int(line_i[4]))
    #sig = denoise(raw_data)
    sig = raw_data
    tmp_smooth1 = scipy.signal.savgol_filter(sig, 53, 9)
    tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)
    plt.subplot(3,1,1)
    plt.plot(sig)
    # plt.semilogx(sig, label='mic')
    plt.subplot(3,1,2)
    plt.plot(tmp_smooth1 * 0.5, label='mic'  + '拟合曲线-21', color='red')
    plt.subplot(3,1,3)
    plt.plot(tmp_smooth2 * 0.5, label='mic'  + '拟合曲线-53', color='green')
    plt.show()

main()

표시되는 효과는 다음과 같습니다:
여기에 이미지 설명 삽입
매개변수 폴리오더(polynomial order)가 클수록 곡선이 실제 곡선에 가까워지고, 폴리오더 값이 작을수록 곡선이 더 부드러워지는 것을 볼 수 있습니다.

참고: polyorder 값이 크면 창 길이 제한으로 인해 피팅에 문제가 발생하고 고주파수 곡선이 직선이 됩니다.

참고:
https://blog.csdn.net/sinat_21258931/article/details/79298478
https://blog.csdn.net/weixin_43821212/article/details/100016021
https://blog.csdn.net/kaever details/105520941

Supongo que te gusta

Origin blog.csdn.net/ximu__l/article/details/129179388
Recomendado
Clasificación