Main Content

LPC 계수를 사용하여 형성음(formant) 추정하기

이 예제에서는 LPC(선형 예측 코딩)를 사용하여 모음 형성음(formant) 주파수를 추정하는 방법을 보여줍니다. 형성음 주파수는 예측 다항식의 근을 구하여 얻을 수 있습니다.

이 예제에서는 Signal Processing Toolbox™에 포함된 음성 샘플 mtlb.mat를 사용합니다. 음성에는 저역통과 필터가 적용되었습니다. 이 음성 샘플은 샘플링 주파수가 낮기 때문에 이 예제에 이상적이지는 않습니다. 낮은 샘플링 주파수는 데이터에 피팅할 수 있는 자기회귀 모델의 차수를 제한하기 때문입니다. 이런 제약이 있음에도 이 예제에서는 LPC 계수를 사용하여 모음 형성음을 확인하는 기법을 잘 보여줍니다.

음성 신호를 불러옵니다. 이 음성 신호는 한 여성이 "MATLAB®"이라고 말한 것을 녹음한 것입니다. 샘플링 주파수는 7418Hz입니다.

load mtlb

MAT 파일에는 음성 파형 mtlb와 샘플링 주파수 Fs가 들어 있습니다.

spectrogram 함수를 사용하여, 분석할 음성 세그먼트를 식별합니다.

segmentlen = 100;
noverlap = 90;
NFFT = 128;

spectrogram(mtlb,segmentlen,noverlap,NFFT,Fs,'yaxis')
title('Signal Spectrogram')

Figure contains an axes object. The axes object with title Signal Spectrogram, xlabel Time (ms), ylabel Frequency (kHz) contains an object of type image.

0.1초~0.25초의 세그먼트를 분석용으로 추출합니다. 추출되는 세그먼트는 대략 "MATLAB"의 첫 번째 모음 /ae/에 해당합니다.

dt = 1/Fs;
I0 = round(0.1/dt);
Iend = round(0.25/dt);
x = mtlb(I0:Iend);

선형 예측 코딩 전에 음성 파형에 일반적으로 적용되는 두 가지 전처리 단계는 윈도우 적용과 프리엠퍼시스(고역통과) 필터링입니다.

해밍 윈도우를 사용하여 음성 세그먼트에 윈도우를 적용합니다.

x1 = x.*hamming(length(x));

프리엠퍼시스 필터를 적용합니다. 프리엠퍼시스 필터는 고역통과 전극점(AR(1)) 필터입니다.

preemph = [1 0.63];
x1 = filter(1,preemph,x1);

선형 예측 계수를 구합니다. 모델 차수를 지정하려면, 일반적으로 적용되는 규칙으로서 예상 형성음 개수의 두 배에 2를 더한 값을 사용하십시오. 주파수 범위 [0,|Fs|/2]에서 예상되는 형성음 개수는 3개입니다. 따라서 모델 차수를 8로 설정합니다. lpc에서 반환되는 예측 다항식의 근을 구합니다.

A = lpc(x1,8);
rts = roots(A);

LPC 계수가 실수 값이기 때문에 근이 켤레 복소수 쌍이 됩니다. 허수부에 대해 한 가지 부호의 근만 유지하고 그 근에 해당하는 각을 구합니다.

rts = rts(imag(rts)>=0);
angz = atan2(imag(rts),real(rts));

각도로 표현된 각주파수(단위: rad/sample)를 헤르츠로 변환하고 형성음의 대역폭을 계산합니다.

형성음 대역폭은 단위원에서 예측 다항식 영점까지의 거리와 같습니다.

[frqs,indices] = sort(angz.*(Fs/(2*pi)));
bw = -1/2*(Fs/(2*pi))*log(abs(rts(indices)));

형성음 주파수는 90Hz보다 커야 하고 대역폭은 400Hz 미만이어야 한다는 기준을 사용하여 형성음을 결정합니다.

nn = 1;
for kk = 1:length(frqs)
    if (frqs(kk) > 90 && bw(kk) <400)
        formants(nn) = frqs(kk);
        nn = nn+1;
    end
end
formants
formants = 1×3
103 ×

    0.8697    2.0265    2.7380

처음 세 개의 형성음은 869.70Hz, 2026.49Hz, 2737.95Hz입니다.

참고 문헌

[1] Snell, Roy C., and Fausto Milinazzo. "Formant location from LPC analysis data." IEEE® Transactions on Speech and Audio Processing. Vol. 1, Number 2, 1993, pp. 129-134.

[2] Loizou, Philipos C. "COLEA: A MATLAB Software Tool for Speech Analysis."