신호에서 스파이크 제거하기
경우에 따라 데이터에 원치 않는 과도(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')
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