MFCC 계산 / 이해에 도움 : Mel-Frequency Cepstrum Coefficients


17

온라인에서 비트와 조각을 읽었지만 모두 함께 조각 할 수는 없습니다. 신호 / DSP에 대한 배경 지식이있어 충분한 전제 조건이되어야합니다. 결국이 알고리즘을 Java로 코딩하는 데 관심이 있지만 아직 완전히 이해하지 못하므로 여기에 있습니다 (수학으로 계산됩니다).

내 지식의 격차와 함께 작동한다고 생각합니다.

  1. 배열로 읽을 수있는 오디오 음성 샘플 (예 : .wav 파일)로 시작하십시오. 이 배열을 부릅니다 . 여기서 범위는 ( 샘플)입니다. 값은 내가 생각하는 오디오 강도-진폭에 해당합니다.n은 0 , 1 , ... , N - 1 Nx[n]n0,1,,N1N

  2. 음성 신호가 "정적"인 것으로 가정하면 오디오 신호를 10ms 정도의 별개의 "프레임"으로 분할하십시오. 이것은 양자화의 한 형태입니다. 따라서 샘플 속도가 44.1KHz 인 경우 10ms는 441 샘플 또는 값과 같습니다 .x[n]

  3. 푸리에 변환 (FFT)을 수행하십시오. 이제 이것은 전체 신호 또는 의 각 개별 프레임에서 수행 됩니까? I는 일반적으로 푸리에 변환은 신호의 모든 요소에 보이는 변환 때문에 차이가 있다고 생각 때문에 와 결합 를 와 결합했습니다. 여기서 은 더 작은 프레임입니다. 어쨌든 FFT를 수행 하고 나머지는 로 끝납니다 .F ( x [ n ] ) F ( x 1 [ n ] ) F ( x 2 [ n ] ) F ( x N [ n ] ) x i [ n ] X [ k ]x[n]F(x[n])F(x1[n])F(x2[n])F(x[])엑스나는[]X[k]

  4. Mel scale에 매핑 및 로깅 정규 주파수 숫자를 Mel 스케일로 변환하는 방법을 알고 있습니다. 의 각 (나를 허용 할 경우 "x 축")에 대해 http://en.wikipedia.org/wiki/Mel_scale 에서 공식을 수행 할 수 있습니다 . 그러나 "y- 값"또는 의 진폭은 어떻습니까? 그것들은 단지 동일한 값을 유지하지만 새로운 Mel (x-) 축의 적절한 지점으로 이동 되었습니까? 나는의 실제 값 로깅에 대해 뭔가가 있었다 일부 신문에서 보았다 다음 경우 때문에 그 신호 중 하나가 추정되는 경우 소음으로 원하지 않는이 이 방정식에 대한 로그 연산은 곱셈 노이즈를 가산 노이즈로 바꾸어 희망적으로 필터링 할 수 있습니다 (?).kX[k]X[k]X[k]X[k]=A[k]B[k]

  5. 이제 마지막 단계는 위에서 수정 한 의 DCT를 가져 오는 것입니다 (그러나 결국 수정되었습니다). 그런 다음이 최종 결과의 진폭을 가져와 이것이 MFCC입니다. 고주파수를 버리는 것에 대해 읽었습니다.X[k]

그래서 나는이 녀석을 단계별로 계산하는 방법을 실제로 철분하려고 노력하고 있으며, 분명히 어떤 것들이 위에서 나를 피하고 있습니다.

또한 "필터 뱅크"(기본적으로 대역 통과 필터 배열)를 사용하는 것에 대해 들었고 이것이 원래 신호에서 프레임을 만드는지 또는 FFT 후에 프레임을 만드는지 알 수 있습니까?

마지막으로 계수가 13 인 MFCC에 대해 보았던 것이 있습니까?


1
이것은 좋은 질문이지만 여기에 대답 할 것이 많이 있습니다. 나는 이것을 2-3 가지 다른 질문으로 나누는 것이 좋습니다 (연속성을 유지하려면 다른 질문을 참조 할 수 있음).
jonsca

이전에 math.SE에 대해 동일한 질문을했으며 (dsp.SE가 더 좋은 곳이라고 권고되었으므로) math.SE에 대한 질문을 삭제해야합니다.
Dilip Sarwate

math.SE
YoungMoney

매우 훌륭하고 유익한 튜토리얼 thankssssssssssssss

1
Hey u는 귀하의 질문에 "Mel scale에 매핑하고 로깅합니다. 일반 주파수 숫자를 Mel scale로 변환하는 방법을 알고 있습니다." 이 부분을 계산하는 데 도움을 줄 수 있습니까? x [k] = 1 * 184의 FFt 출력을 갖지만 삼각 대역 통과 필터는 20 * 3으로 설정됩니다. 그런 다음 어떻게 둘 다 곱할 수 있습니까? 제발 ASAp
Ayush Agrawal

답변:


25

단계별 ...

1. & 2 . 맞습니다. 프레임은 일반적으로 겹칩니다. 예를 들어 프레임 0은 샘플 0 ~ 440입니다. 프레임 1은 샘플 220 내지 660이며; 프레임 2는 샘플 440 ~ 880 등입니다. 또한 윈도우 기능 이 프레임의 샘플에 적용됩니다.

3 . 푸리에 변환은 각 프레임마다 수행됩니다. 이것에 대한 동기는 간단하다 : 음성 신호는 시간에 따라 변하지 만 짧은 세그먼트에 대해서는 고정되어있다. 각 짧은 세그먼트를 개별적으로 분석하려고합니다.이 세그먼트에서는 신호가 몇 개의 계수로 효율적으로 설명 될 수있을만큼 단순하기 때문입니다. "안녕하세요"라고 말하는 사람을 생각해보십시오. 모든 소리를 한 번에 분석하여 모든 음소가 하나의 단일 스펙트럼으로 축소되는 것을보고 싶지 않습니다 (FFT가 시간 정보를 축소). 단계별로 단어를 인식하려면 "hhhhheeeeeeeeeeelloooooooooo"를보고 싶으므로 짧은 세그먼트로 나누어야합니다.

4 . "Mel scale에 매핑"은 오해의 소지가 있으므로 아마도 혼란 스러울 것입니다. 이 단계에 대한 더 나은 설명은 "멜-스케일 주파수로 튜닝 된 필터 뱅크를 통해 신호 에너지를 계산하는 것"입니다. 이 작업을 수행하는 방법은 다음과 같습니다. 우리는 20Hz (청각 범위의 하단)와 나이 퀴 스트 주파수 사이의 멜 스케일에 따라 주파수 (일반적으로 사용되는 값은 N = 40 )를 동일하게 고려합니다. 실제 예 : 신호는 8kHz로 샘플링되며 40 개의 빈이 필요합니다. 4kHz (Nyquist)가 2250 mel이므로 필터 뱅크 중심 주파수는 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel입니다.NN=40

이러한 주파수가 정의되면 각 주파수 주변의 FFT 크기 (또는 에너지)의 가중치 합계를 계산합니다.

12 개의 출력 함이있는 필터 뱅크를 나타내는 다음 그림을보십시오.

12 채널의 멜 주파수 필터 뱅크

8 번째 빈의 중심 주파수는 약 2kHz입니다. 8 번째 빈의 에너지는 약 1600kHz에서 2800Hz로 가중 된 FFT 에너지를 대략 2kHz에서 정점으로 합산함으로써 얻어진다.

구현 노트 :이 가중치 합은 단일 작업으로 수행 될 수 있습니다. FFT 에너지 벡터에 의해 "필터 뱅크 행렬"의 행렬 곱셈입니다.

따라서이 단계에서 FFT 스펙트럼을 각각 다른 주파수 범위에 해당하는 40 (그림의 12) 에너지 값으로 "요약"했습니다. 이러한 값의 로그를 가져옵니다.

KK=13


Mel 필터 뱅크에 대한 간단한 질문 – 1.8-2의 높이 / 진폭 범위는 이것이 중요합니까 아니면 단위 (1) 높이 일 수 있습니까?
YoungMoney

1
이것은 중요하지 않습니다. 최대 사용 효과 1.0 대 2.0에서의 진폭은 단계 4에서 상수만큼 로그 에너지를 이동시킬 뿐이므로 단계 5에서 첫 번째 계수에만 영향을 미칩니다 (종종 어쨌든 폐기 됨). 일부 구현에서는 필터가 넓을수록 피크 진폭이 낮아질 수 있도록 에너지 정규화를 사용합니다 ( i.imgur.com/IOaLa.gif ). 인식 응용 프로그램에서 약간의 성능 변경이 발생할 수 있습니다. 사용중인 MFCC 구현을 살펴보면 실제로 각 단계마다 많은 작은 변형이 있습니다. bit.ly/ULatdL
pichenettes

여기는 오래된 주제이지만 그래프에 대해 물어볼 것이 있습니다. 나이 퀴 스트가 4kHz 인 경우 왜 대역 제한 필터가 포인트 4kHz를 초과합니까? MFCC도 괜찮습니다. 일반적으로 나이키 스트를 통과하는 필터를 원하지 않습니까? 내가 맞아?
Celdor

2
N = 40 멜 필터 뱅크 주파수 (또는 내가 본 다른 공통 값인 26)가 사용 되는지에 대한 참조 가 있습니까?
James Owers

1
39 mel4 단계 는 어디에서 왔습니까?
Gert Kommer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.