지진 신호 y (i)가 있습니다.
여기에서 나는 하나의 최대 값을 찾았습니다 : i = 152.54, y = 222.29 수동으로 빨간색으로 표시했습니다.
모든 최대 값을 자동으로 찾고 싶습니다.
SGF (Savitzky Golay Filter)를 사용하여 신호와 그 파생물에 대한 평활화 된 추정치를 찾을 수 있으며 SGF의 장점 중 하나는 다른 필터보다 최소값과 최대 값을 훨씬 잘 보존한다는 것입니다. 이것은 내가 사용하기에 좋습니다.
SGF 계수를 생성하는 Matlab 스크립트를 찾았습니다. 그리고 이것을 사용하여 미분에 대한 4 차 SGF 계수를 찾았습니다. 작은 Matlab 스크립트를 코딩했습니다.
- 신호의 미분 계수에 대한 4 차 SGF 계수로 신호를 변환하여 신호의 미분을 찾습니다
- 미분이 부호가 바뀌는 샘플 쌍 (i, i + 1)을 찾습니다.
- 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.
그들이 다른 최대 점에 가까워 야합니까?
가장 가까운 두 최대 값을 어떻게 제어 할 수 있습니까?
모든 답변에 미리 감사드립니다!