주요 콘텐츠

mfcc

오디오 신호의 MFCC, 로그 에너지, 델타, 델타-델타 추출

설명

coeffs = mfcc(audioIn,fs)는 주파수 fsHz로 샘플링된 오디오 입력에 대한 멜 주파수 켑스트럼 계수(MFCC)를 반환합니다.

예제

coeffs = mfcc(___,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다.

예: coeffs = mfcc(audioIn,fs,LogEnergy="replace")fsHz로 샘플링된 오디오 입력 신호에 대한 멜 주파수 켑스트럼 계수를 반환합니다. coeffs 벡터의 첫 번째 계수는 로그 에너지 값으로 대체됩니다.

예제

[coeffs,delta,deltaDelta,loc] = mfcc(___)는 델타, 델타-델타 및 데이터의 각 윈도우에 대응하는 샘플의 위치도 반환합니다. 위에 열거된 모든 구문에 나와 있는 입력을 조합하여 지정할 수 있습니다.

예제

mfcc(___)에 출력 인수를 지정하지 않으면 멜 주파수 켑스트럼 계수가 플로팅됩니다. 플로팅하기 전에 계수는 평균 0 및 표준편차 1을 갖도록 정규화됩니다.

  • 입력값이 시간 영역에 있는 경우 계수는 시간에 대해 플로팅됩니다.

  • 입력값이 주파수 영역에 있는 경우 계수는 프레임 번호에 대해 플로팅됩니다.

  • 로그 에너지가 추출되면 이 로그 에너지도 플로팅됩니다.

예제

예제

모두 축소

mfcc 함수를 사용하여 음성 신호의 멜 주파수 켑스트럼 계수를 계산합니다. 이 함수는 계수의 변화인 delta와 델타 값의 변화인 deltaDelta를 반환합니다. 이 함수가 계산하는 로그 에너지 값은 계수 벡터 앞에 추가되거나 계수 벡터의 첫 번째 요소를 대체할 수 있습니다. 이 동작은 LogEnergy 인수를 "append"로 설정하는지 아니면 "replace"로 설정하는지에 따라 결정됩니다.

audioread 함수를 사용하여 Counting-16-44p1-mono-15secs.wav 파일에서 오디오 신호를 읽어옵니다. mfcc 함수는 전체 음성 데이터를 일괄 처리합니다. 입력 행 개수, 윈도우 길이, 중첩 길이를 기반으로 mfcc는 음성을 1551개 프레임으로 분할하고 각 프레임에 대한 켑스트럼 특징을 계산합니다. coeffs 행렬의 각 행은 음성 파일의 대응하는 프레임에 대한 13개의 멜 주파수 켑스트럼 계수 앞에 오는 로그 에너지 값에 대응합니다. 이 함수는 각 입력 프레임의 마지막 샘플 위치인 loc도 계산합니다.

[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");
[coeffs,delta,deltaDelta,loc] = mfcc(audioIn,fs);

정규화된 계수를 플로팅합니다.

mfcc(audioIn,fs)

Figure contains an axes object. The axes object with xlabel Time (s), ylabel MFCC contains an object of type image.

오디오 파일을 읽어온 후 주파수 표현으로 변환합니다.

[audioIn,fs] = audioread("Rainbow-16-8-mono-114secs.wav");

win = hann(1024,"periodic");
S = stft(audioIn,"Window",win,"OverlapLength",512,"Centered",false);

주파수 영역 오디오를 사용하여 mfcc를 호출해서 멜 주파수 켑스트럼 계수를 추출합니다. 로그 에너지를 무시합니다.

coeffs = mfcc(S,fs,"LogEnergy","Ignore");

많은 응용 분야에서 MFCC 관측값은 분류 작업에 사용할 요약 통계량으로 변환됩니다. 멜 주파수 켑스트럼 계수 중 하나에 대한 확률 밀도 함수를 플로팅하여 분포를 관찰합니다.

nbins = 60;
coefficientToAnalyze = 4;

histogram(coeffs(:,coefficientToAnalyze+1),nbins,"Normalization","pdf")
title(sprintf("Coefficient %d",coefficientToAnalyze))

Figure contains an axes object. The axes object with title Coefficient 4 contains an object of type histogram.

입력 인수

모두 축소

입력 신호로, 벡터, 행렬 또는 3차원 배열로 지정됩니다.

  • audioIn이 실수인 경우 이는 시간 영역 신호로 해석되며 열 벡터이거나 행렬이어야 합니다. 행렬의 열은 독립적인 오디오 채널로 취급됩니다.

  • audioIn이 복소수인 경우 이는 주파수 영역 신호로 해석됩니다. 이 경우 audioInL×M×N 배열이어야 합니다. 여기서 L은 DFT 점의 개수, M은 개별 스펙트럼 수, N은 개별 채널 개수입니다.

데이터형: single | double
복소수 지원 여부:

입력 신호의 샘플 레이트(단위: Hz)로, 양의 스칼라로 지정됩니다.

데이터형: single | double

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: [coeffs,delta,deltaDelta,loc] = mfcc(audioIn,fs,LogEnergy="replace",DeltaWindowLength=5)fsHz로 샘플링된 오디오 입력 신호에 대한 멜 주파수 켑스트럼 계수를 반환합니다. coeffs 벡터의 첫 번째 계수는 로그 에너지 값으로 대체됩니다. 켑스트럼 계수 5개로 구성된 집합이 델타 값과 델타-델타 값을 계산하는 데 사용됩니다.

시간 영역에 적용되는 윈도우로, 실수형 벡터로 지정됩니다. 벡터의 요소 개수는 범위 [1,size(audioIn,1)] 내에 있어야 합니다. 또한 벡터의 요소 개수는 OverlapLength보다 커야 합니다.

데이터형: single | double

인접 윈도우 간의 중첩된 샘플 수로, [0, numel(Window)) 범위의 정수로 지정됩니다. 지정되지 않은 경우, OverlapLength는 기본적으로 round(0.02*fs)로 지정됩니다.

데이터형: single | double

각 데이터 윈도우에 대해 반환되는 계수의 개수로, [2 v] 범위의 정수로 지정됩니다. 여기서 v는 유효한 통과대역의 수입니다.

유효한 통과대역의 수는 sum(BandEdges <= floor(fs/2))-2로 정의됩니다. 통과대역은 경계가 fs/2 아래에 속하는 경우 유효합니다. 여기서 fs는 입력 오디오 신호의 샘플 레이트로, 두 번째 인수 fs로 지정됩니다.

데이터형: single | double

필터 뱅크의 대역 경계(단위: Hz)로, [0, fs/2] 범위의 음이 아닌 단조 증가하는 행 벡터로 지정됩니다. 대역 경계의 수는 범위 [4, 160] 내에 있어야 합니다. mfcc 함수는 BandEdges를 기반으로 절반이 중첩된 삼각 필터를 설계합니다. 이는 첫 번째와 마지막 대역 경계를 제외한 모든 대역 경계가 설계한 대역통과 필터의 중심 주파수이기도 함을 의미합니다.

기본적으로 BandEdges는 요소를 42개 가진 벡터입니다. 이 경우 약 133Hz~6864Hz 범위에 걸쳐 40대역 필터 뱅크가 생성됩니다. 디폴트 대역은 [2]에서 설명된 대로 간격이 지정됩니다.

데이터형: single | double

윈도우가 적용된 입력 샘플의 이산 푸리에 변환(DFT)을 계산하는 데 사용되는 Bin 개수. FFT 길이는 Window의 요소 개수보다 크거나 같아야 합니다.

데이터형: single | double

이산 코사인 변환 전에 적용되는 비선형 정류 유형으로, "log" 또는 "cubic-root"로 지정됩니다.

데이터형: char | string

델타 값과 델타-델타 값을 계산하는 데 사용되는 계수의 개수로, 2보다 큰 홀수 정수로 지정됩니다. 지정되지 않은 경우, DeltaWindowLength는 기본적으로 9로 지정됩니다.

델타는 audioDelta 함수를 사용하여 계산됩니다.

데이터형: single | double

계수 벡터 출력값에 로그 에너지가 표시되는 방법으로, 다음과 같이 지정됩니다.

  • "append" –– 함수가 계수 벡터 앞에 로그 에너지를 추가합니다. 계수 벡터의 길이는 1 + NumCoeffs입니다.

  • "replace" –– 함수가 첫 번째 계수를 신호의 로그 에너지로 대체합니다. 계수 벡터의 길이는 NumCoeffs입니다.

  • "ignore" –– 객체가 로그 에너지를 계산하거나 반환하지 않습니다.

데이터형: char | string

출력 인수

모두 축소

멜 주파수 켑스트럼 계수로, L×M 행렬이나 L×M×N 배열로 반환됩니다. 여기서,

  • L –– 오디오 신호가 분할되는 분석 윈도우의 개수. 입력 크기, Window, OverlapLength가 다음 차원을 제어합니다. L = floor((size(audioIn,1) − numel(Window)))/(numel(Window)OverlapLength) + 1

  • M –– 프레임당 반환되는 계수의 개수. 이 값은 NumCoeffsLogEnergy에 의해 결정됩니다.

    LogEnergy 설정의 결과는 다음과 같습니다.

    • "append" –– 함수가 계수 벡터 앞에 로그 에너지 값을 추가합니다. 계수 벡터의 길이는 1 + NumCoeffs입니다.

    • "replace" –– 함수가 첫 번째 계수를 신호의 로그 에너지로 대체합니다. 계수 벡터의 길이는 NumCoeffs입니다.

    • "ignore" –– 함수가 로그 에너지를 계산하거나 반환하지 않습니다. 계수 벡터의 길이는 NumCoeffs입니다.

  • N –– 입력 채널(열)의 개수. 이 값은 size(audioIn,2)입니다.

데이터형: single | double

데이터의 한 프레임에서 다른 프레임으로의 계수 변화로, L×M 행렬이나 L×M×N 배열로 반환됩니다. delta 배열은 coeffs 배열과 크기와 데이터형이 동일합니다.

데이터형: single | double

데이터의 한 프레임에서 다른 프레임으로의 delta 값 변화로, L×M 행렬이나 L×M×N 배열로 반환됩니다. deltaDelta 배열은 coeffs 배열 및 delta 배열과 크기와 데이터형이 동일합니다.

데이터형: single | double

각 분석 윈도우의 마지막 샘플 위치로, coeffs와 행 개수가 동일한 열 벡터로 반환됩니다.

데이터형: single | double

알고리즘

모두 축소

참고 문헌

[1] Rabiner, Lawrence R., and Ronald W. Schafer. Theory and Applications of Digital Speech Processing. Upper Saddle River, NJ: Pearson, 2010.

확장 기능

모두 확장

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

GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.

GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.

버전 내역

R2018a에 개발됨

모두 확장