Main Content

sgolayfilt

사비츠키-골레이 필터링(Savitzky-Golay Filtering)

설명

예제

y = sgolayfilt(x,order,framelen)은 다항식 차수가 order이고 프레임 길이가 framelen인 사비츠키-골레이 유한 임펄스 응답(FIR) 평활화 필터를 벡터 x의 데이터에 적용합니다. x가 행렬이면 sgolayfilt는 각 열에 대해 동작을 수행합니다.

예제

y = sgolayfilt(x,order,framelen,weights)는 최소제곱 최소화에 사용할 가중 벡터를 지정합니다.

y = sgolayfilt(x,order,framelen,weights,dim)은 필터가 동작을 수행할 때 기준이 되는 차원을 지정합니다.

예제

모두 축소

sgolayfilt를 사용하여 랜덤 신호를 생성하고 평활화합니다. 다항식 차수를 3으로, 프레임 길이를 11로 지정합니다. 원래 신호와 평활화된 신호를 플로팅합니다.

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent signal, sgolay.

sgolayfilt 함수는 sgolay의 출력값인 B의 중앙 행을 사용하여 신호에 대해 컨벌루션을 수행함으로써 대부분의 필터링 작업을 수행합니다. 필터링된 신호의 정상 상태 부분이 결과로 반환됩니다. 이 부분을 생성하고 플로팅합니다.

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent signal, sgolay, steady.

신호 경계값에 가까운 샘플은 대칭 윈도우의 중심에 배치될 수 없으므로 다르게 처리되어야 합니다.

시작 부분의 과도 특성을 파악하기 위해 B의 처음 (framelen-1)/2개 행을 신호의 처음 framelen개 샘플로 곱합니다.

ybeg = B(1:m,:)*x(1:framelen);

끝부분의 과도 특성을 파악하기 위해 B의 마지막 (framelen-1)/2개 행을 신호의 마지막 framelen개 샘플로 곱합니다.

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

과도 상태와 정상 상태 부분을 결합하여 완전한 신호를 생성합니다.

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, sgolay, steady, complete.

최소화를 하는 데 가중치를 추가하면 B의 대칭성이 깨지고 올바른 해를 구하기까지 단계가 더 추가됩니다.

Fs=7418 Hz로 샘플링된 음성 신호를 불러옵니다. 이 파일에는 "MATLAB®"이라는 단어를 발음한 여성의 음성이 들어 있습니다.

load mtlb
t = (0:length(mtlb)-1)/Fs;

다항식 차수가 9인 사비츠키-골레이 필터를 길이가 21인 데이터 프레임에 적용하여 신호를 평활화합니다. 원래 신호와 필터링된 신호를 플로팅합니다. 0.02초 간격으로 확대합니다.

rd = 9;
fl = 21;

smtlb = sgolayfilt(mtlb,rd,fl);

subplot(2,1,1)
plot(t,mtlb)
axis([0.2 0.22 -3 2])
title('Original')
grid

subplot(2,1,2)
plot(t,smtlb)
axis([0.2 0.22 -3 2])
title('Filtered')
grid

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains an object of type line.

계산을 반복합니다. 하지만 이번에는 카이저 윈도우를 가중 벡터로 사용합니다. 형태 인자를 β=38로 지정합니다. 필터링된 새 신호를 플로팅합니다.

kmtlb = sgolayfilt(mtlb,rd,fl,kaiser(fl,38));

subplot(2,1,2)
hold on
plot(t,kmtlb)
axis([0.2 0.22 -3 2])
hold off

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains 2 objects of type line.

입력 인수

모두 축소

입력 신호로, 벡터나 행렬로 지정됩니다.

데이터형: single | double

다항식 차수로, 양의 정수로 지정됩니다. orderframelen보다 작아야 합니다. order = framelen – 1이면 필터가 평활화를 생성하지 않습니다.

데이터형: single | double

프레임 길이로, 양의 홀수 정수로 지정됩니다.

데이터형: single | double

가중치 배열로, 길이가 framelen인 양의 실수형 벡터나 행렬로 지정됩니다.

데이터형: single | double

필터를 적용할 차원으로, 양의 정수 스칼라로 지정됩니다. 기본적으로, sgolayfilt는 크기가 1보다 큰 x의 첫 번째 차원을 따라 동작합니다.

데이터형: single | double

출력 인수

모두 축소

필터링된 신호로, 벡터나 행렬로 반환됩니다.

사비츠키-골레이(Savitzky-Golay) 평활화 필터는 잡음이 일부 섞여 있지만 잡음 없는 영역이 주파수 범위의 큰 부분을 차지하는 신호를 "평활화"하는 데 사용됩니다. 이 필터는 디지털 평활화 다항식 필터 또는 최소제곱 평활화 필터라고도 합니다. 일부 응용 사례에서는 표준 평균 FIR 필터보다 사비츠키-골레이 필터가 성능이 더 좋습니다. 표준 평균 FIR 필터는 잡음과 함께 고주파 성분도 필터링하는 경향이 있습니다. 사비츠키-골레이 필터는 고주파 신호 성분을 유지하는 데는 더 효과적이지만 잡음 제거 측면에서는 덜 효과적입니다.

사비츠키-골레이 필터는 다항식을 잡음이 있는 데이터의 프레임에 피팅하는 데 있어 최소제곱 오차를 최소화한다는 의미로 최적입니다. 사비츠키-골레이 알고리즘에 대한 자세한 내용은 sgolay를 참조하십시오.

참고 문헌

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice Hall, 1996.

[2] Schafer, Ronald. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine 28, no. 4 (July 2011): 111–17. https://doi.org/10.1109/MSP.2011.941097.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2006a 이전에 개발됨

참고 항목

| | |