Main Content

신호에서 스파이크 제거하기

경우에 따라 데이터에 원치 않는 과도(Transient)나 스파이크가 나타납니다. 중앙값 필터링은 이를 자연스럽게 제거할 수 있는 방법입니다.

60Hz 전력 공급선으로부터 잡음의 영향을 받고 있는 아날로그 기기의 입력에서 개루프 전압을 고려해 보겠습니다. 샘플 레이트는 1kHz입니다.

load openloop60hertz

fs = 1000;
t = (0:numel(openLoopVoltage) - 1)/fs;

임의 점에서 임의 부호를 가지는 과도를 추가하여 신호를 손상시킵니다. 재현이 가능하도록 난수 생성기를 재설정합니다.

rng default

spikeSignal = zeros(size(openLoopVoltage));
spks = 10:100:1990;
spikeSignal(spks+round(2*randn(size(spks)))) = sign(randn(size(spks)));

noisyLoopVoltage = openLoopVoltage + spikeSignal;

plot(t,noisyLoopVoltage)

xlabel('Time (s)')
ylabel('Voltage (V)')
title('Open-Loop Voltage with Added Spikes')

Figure contains an axes object. The axes object with title Open-Loop Voltage with Added Spikes, xlabel Time (s), ylabel Voltage (V) contains an object of type line.

yax = ylim;

함수 medfilt1은 신호의 모든 점을 해당 점의 중앙값과 지정된 개수의 인접한 점으로 대체합니다. 이에 따라, 중앙값 필터링은 주변과 극단적으로 차이가 있는 점을 삭제합니다. 중앙값을 계산하기 위해 세 개의 인접한 점 세트를 사용하여 신호에 필터를 적용합니다. 스파이크가 어떻게 사라지는지 확인합니다.

medfiltLoopVoltage = medfilt1(noisyLoopVoltage,3);

plot(t,medfiltLoopVoltage)

xlabel('Time (s)')
ylabel('Voltage (V)')
title('Open-Loop Voltage After Median Filtering')
ylim(yax)
grid

Figure contains an axes object. The axes object with title Open-Loop Voltage After Median Filtering, xlabel Time (s), ylabel Voltage (V) contains an object of type line.

참고 항목

관련 항목