이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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')

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

m = (framelen-1)/2;

B = sgolay(order,framelen);

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

plot(steady)
legend('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

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

Fs=7418Hz로 샘플링된 음성 신호를 불러옵니다. 이 파일에는 "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

계산을 반복합니다. 하지만 이번에는 카이저 윈도우를 가중 벡터로 사용합니다. 형태 인자를 β=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

입력 인수

모두 축소

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

데이터형: single | double

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

데이터형: single | double

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

데이터형: single | double

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

데이터형: single | double

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

데이터형: single | double

출력 인수

모두 축소

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

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

사비츠키-골레이 필터는 다항식을 잡음이 있는 데이터의 프레임에 피팅하는 데 있어 최소제곱 오차를 최소화한다는 의미로 최적입니다.

참고 문헌

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

확장 기능

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

참고 항목

| | |

R2006a 이전에 개발됨