개별적으로 샘플링 된 1D 신호에서 Savitzky Golay 필터를 사용하여 샘플 간 로컬 극대값을 찾으려면 어떻게해야합니까?


9

지진 신호 y (i)가 있습니다. 여기에 이미지 설명을 입력하십시오

여기에서 나는 하나의 최대 값을 찾았습니다 : i = 152.54, y = 222.29 수동으로 빨간색으로 표시했습니다.

모든 최대 값을 자동으로 찾고 싶습니다.

SGF (Savitzky Golay Filter)를 사용하여 신호와 그 파생물에 대한 평활화 된 추정치를 찾을 수 있으며 SGF의 장점 중 하나는 다른 필터보다 최소값과 최대 값을 훨씬 잘 보존한다는 것입니다. 이것은 내가 사용하기에 좋습니다.

SGF 계수를 생성하는 Matlab 스크립트를 찾았습니다. 그리고 이것을 사용하여 미분에 대한 4 차 SGF 계수를 찾았습니다. 작은 Matlab 스크립트를 코딩했습니다.

  1. 신호의 미분 계수에 대한 4 차 SGF 계수로 신호를 변환하여 신호의 미분을 찾습니다
  2. 미분이 부호가 바뀌는 샘플 쌍 (i, i + 1)을 찾습니다.
  3. i와 i + 1 사이의 선형 보간에 의해 미분의 제로 크로싱을 찾습니다.

스크립트:

function [maxX,maxY] = findLocalMax(y)
% Kernel for 4th order Savitzky-Golay filter for finding derivative:
d4 = [0.0724 -0.1195 -0.1625 -0.1061 0 0.1061 0.1625 0.1195 -0.0724];

dy = conv(y,d4,'same'); % derivative

[m n] = size(dy);
maxX = [];
maxY = [];
for i = 1 : n - 1
  if dy(i) < 0 && dy(i+1) > 0 % max somewhere between i and i+1
    a = dy(i)/(dy(i) - dy(i+1)); % linear interpolation
    mx = i + a;
    maxX = [maxX mx];
    my = y(i)*(1-a) + y(i+1)*a; % linear interpolation
    maxY = [maxY my];
  end
end

필자가 필자가 원하는 결과를 얻을 수있는 함수를 얻기 위해 미분이 양수에서 양수로 변경되는지 테스트해야했지만 혼란 스럽습니다. 최대 값의 미분 값이 양수에서 음수로 바뀌지 않아야합니까? 최대 값과 최소값을 구별하는 더 좋은 방법이 있습니까?

아래는이 함수를 사용하여 신호의 최대 값을 찾는 결과입니다. 여기에 이미지 설명을 입력하십시오

결과는 좋아 보이지만 일부 최대 값을 찾을 수 없습니다. i = 143.13, 190.88, 256.97.

그들이 다른 최대 점에 가까워 야합니까?

가장 가까운 두 최대 값을 어떻게 제어 할 수 있습니까?

모든 답변에 미리 감사드립니다!


필터 출력을 플롯 할 수 있습니까?
Jim Clay

답변:


5

내가 보여준 줄거리를 기준 으로이 특정 유형의 필터에 익숙하지는 않지만 프로세스에서 찾을 수없는 최대 값은 프로세스 고유의 시간 해상도에 맞서고 있다고 생각합니다. 어떤 종류의 "평활화"는 관심있는 신호가 시간에 따라 국지적으로 번지는 것을 의미합니다. 예를 들어 근처에 두 개의 봉우리가 있으면 하나로 합쳐질 수 있습니다. 낮은 차수의 필터는 얻을 수있는 스무딩 양을 희생시키면서이 동작이 적을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.