그래서 아래로 내려가는 지점과 올라간 지점에서 상어 핀 신호를 부드럽게합니다. 아래 그림에 도시 된 바와 같이, 상어 지느러미 파형 급감 및 상승 시간 2 초에서 4 초 가지고에Matlab의 함수에서 하나의 예리한 모서리를 부드럽게합니다.
알기나 어떻게 영역 라운드 있도록 그 섹션에서 평활 너무 그것은 이런 식으로 뭔가를 보이는 것을 :
그래서 아래로 내려가는 지점과 올라간 지점에서 상어 핀 신호를 부드럽게합니다. 아래 그림에 도시 된 바와 같이, 상어 지느러미 파형 급감 및 상승 시간 2 초에서 4 초 가지고에Matlab의 함수에서 하나의 예리한 모서리를 부드럽게합니다.
알기나 어떻게 영역 라운드 있도록 그 섹션에서 평활 너무 그것은 이런 식으로 뭔가를 보이는 것을 :
가 여기에 두 개의 분리 된 것들입니다 - 당신이 급격한 변화를 감지 할 방법이, 어떻게 당신이 그것을 필터링 않습니다.
차례로 살펴 보겠습니다.
급격한 변화는 큰 곡률을 특징으로하기 때문에 입력 곡선의 diff
을 사용하여 쉽게 감지 할 수 있습니다. 두 번째 매개 변수 = 2를 사용하면 diff
을 두 번 가져오고 두 번째 파생 물과 "비슷합니다"결과가 나오지만 하나씩 상쇄됩니다. 따라서 diff(sharkfin,2)
이 큰 지점을 찾으면 코너 포인트를 얻기 위해 1을 상쇄해야합니다.
다음으로 평활 자체. 많은 기술이 있습니다. 상자 기능으로 간단한 회선을 보여줍니다. 이 작업을 두 번 수행하면 매끄러운 버전의 입력이 제공됩니다. 원래의 "불연속에서 멀리"를 선택하고 "불연속에 가까운"필터링 된 버전을 우리는 당신이 요구했던 것과 정확히 일치시킵니다. 원한다면 포인트를 "블렌드"할 수 있습니다 - 코너 포인트에 얼마나 가깝게 있는지에 따라 필터링되고 필터링되지 않은 가중 버전을 사용하십시오. 나는 명시 적으로 표시되지 않았다하지만 이미 쓴 코드를 확장하는 방법을 쉽게 알 수 있어야한다 :
이% generate a "shark fin" function:
fin = exp(-linspace(0,4,60));
shark = [fin (1-fin+fin(end))];
shark = repmat(shark, [1 3]);
D2 = diff(shark, 2);
roundMe = find(abs(D2)>0.1*max(D2))+1; % offset by 1 because second derivative
figure;
subplot(3,1,1)
plot(shark); title 'shark plot'
hold on;
plot(roundMe, shark(roundMe),'r*')
legend('input','corners found')
% take N points on either side of the sharp corners:
N = 3;
% boxplot filtered version of the curve
boxFilt = ones(1, 2*N+1)/(2*N+1);
smoothShark1 = convn(shark, boxFilt, 'same'); % box plot
% second filter - smoother
smoothShark2 = convn(smoothShark1, boxFilt, 'same');
% plot the filtered results:
subplot(3,1,2)
plot(shark)
hold on
plot(smoothShark1);
hold on
plot(smoothShark2);
xlim([114 126])
ylim([0.8,1.1])
legend('original','box','box x2')
title 'smoothed everywhere'
% Now apply filtering only to points near the discontinuity
smoothMe = zeros(size(shark));
smoothMe(roundMe)=1;
smoothMe = convn(smoothMe, boxFilt, 'same');
smoothMe(smoothMe>0)=1; % this finds N points on either side of the corner
subplot(3,1,3)
plot(shark)
finalPlot=shark;
hold on
smoothIndx = find(smoothMe);
finalPlot(smoothIndx)=smoothShark2(smoothIndx);
plot(finalPlot,'g')
plot(smoothIndx, finalPlot(smoothIndx), 'r*')
xlim([114 126])
ylim([0.8,1.1])
legend('original','smoothed','changed')
title 'smoothed only near discontinuity'
출력 : 당신이 알고리즘을 찾고 그래서
이 답변을 주셔서 감사합니다. 나는 그것을 적절하게 수정하여 사용했다. 정말 잘 작동 :) –
하는 날카로운 감지하기를 신호의 모서리를 둥글게하고 둥글게 만듭니다. 하나 찾았 니? – Anthony
['convex'] (https://en.wikipedia.org/wiki/Convex_function)의 사용이 잘못된 것입니다. 모서리를 부드럽게 만들어도 더 볼록하지는 않습니다. – m7913d
알고리즘 이상으로 단계가 충분합니다. 나는 급격한 상승과 하강을 감안한 이동 평균 필터가 효과적일지도 모른다고 생각합니다. 하지만 여기서 도움을 찾고 있었어. 또는 커브의 작은 부분에만 필터를 구현하는 데 도움이됩니다. –