Eu tenho lido partes e peças on-line, mas não consigo juntar tudo. Eu tenho algum conhecimento de fundo de sinais / material DSP que deve ser pré-requisitos suficientes para isso. Estou interessado em eventualmente codificar esse algoritmo em Java, mas ainda não o entendo completamente, e é por isso que estou aqui (conta como matemática, certo?).
Eis como acho que funciona junto com as lacunas no meu conhecimento.
Comece com sua amostra de fala em áudio, digamos um arquivo .wav, que você possa ler em uma matriz. Chame essa matriz , onde varia de (portanto, amostras). Os valores correspondem à intensidade do áudio, eu acho - amplitudes.n 0 , 1 , … , N - 1 N
Divida o sinal de áudio em "quadros" distintos de 10 ms ou mais, onde você assume que o sinal de fala é "estacionário". Esta é uma forma de quantização. Portanto, se a sua taxa de amostragem for 44,1KHz, 10ms será igual a 441 amostras ou valores de .
Faça uma transformação de Fourier (FFT por causa da computação). Agora isso é feito em todo o sinal ou em cada quadro separado de ? Eu acho que há uma diferença porque, em geral, a transformação de Fourier analisa todos os elementos de um sinal, então juntou a juntou-se a onde são os quadros menores. De qualquer forma, digamos que fazemos algumas FFT e terminemos com pelo resto disso.F ( x [ n ] ) ≠ F ( x 1 [ n ] ) F ( x 2 [ n ] ) … F ( x N [ n ] ) x i [ n ] X [ k ]
Mapeamento para a escala Mel e registro. Eu sei como converter números de frequência regulares para a escala Mel. Para cada de (o "eixo x" se você me permitir), você pode fazer a fórmula aqui: http://en.wikipedia.org/wiki/Mel_scale . Mas e os "valores y" ou as amplitudes de ? Eles apenas permanecem com os mesmos valores, mas mudam para os pontos apropriados no novo eixo Mel (x-)? Vi em algum artigo que havia algo sobre registrar os valores reais de porque, se que um desses sinais é considerado ruído, você não deseja , a operação de log nessa equação transforma o ruído multiplicativo em ruído aditivo, que pode ser filtrado (?).
Agora, o passo final é obter um DCT do seu modificado de cima (no entanto, acabou sendo modificado). Então você toma as amplitudes deste resultado final e essas são suas MFCCs. Eu li algo sobre jogar fora valores de alta frequência.
Então, eu estou tentando entender como calcular esses caras passo a passo, e claramente algumas coisas estão me iludindo de cima.
Além disso, eu ouvi falar sobre o uso de "bancos de filtros" (basicamente, um conjunto de filtros de passagem de banda) e não sei se isso se refere à criação de quadros a partir do sinal original, ou talvez você faça os quadros após a FFT?
Por fim, há algo que eu vi sobre os MFCCs com 13 coeficientes?
fonte
Respostas:
Passo a passo...
1. e 2 . Isto está certo. Observe que os quadros geralmente se sobrepõem, por exemplo, o quadro 0 é uma amostra de 0 a 440; o quadro 1 é amostras 220 a 660; o quadro 2 é das amostras 440 a 880 e assim por diante ... Observe também que uma função de janela é aplicada às amostras no quadro.
3 . A transformação de Fourier é feita para cada quadro. A motivação por trás disso é simples: um sinal de fala varia ao longo do tempo, mas é estacionário em segmentos curtos. Você deseja analisar cada segmento curto individualmente - porque nesses segmentos o sinal é simples o suficiente para ser descrito com eficiência por poucos coeficientes. Pense em alguém dizendo "olá". Você não deseja ver todos os fonemas recolhidos em um único espectro (a FFT coleta informações temporais) analisando todo o som de uma só vez. Você quer ver "hhhhheeeeeeeeeeelloooooooooo" para reconhecer a palavra estágio por estágio, de modo que ela deve ser dividida em segmentos curtos.
4 . "Mapear para a escala Mel" é enganoso e é provavelmente por isso que você está ficando confuso. Uma descrição melhor para esta etapa seria: "Calcule a energia do sinal através de um banco de filtros sintonizados para frequências em escala de mel". Aqui está como isso é feito. Consideramos as frequências (um valor comumente usado é N = 40 ) igualmente espaçadas de acordo com a escala de mel, entre 20 Hz (parte inferior da faixa auditiva) e a frequência de Nyquist. Exemplo prático: o sinal é amostrado em 8kHz e queremos 40 caixas. Como 4kHz (Nyquist) é 2250 mel, as frequências centrais do banco de filtros serão: 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel.N N= 40
Uma vez definidas essas frequências, calculamos uma soma ponderada das magnitudes (ou energias) da FFT em torno de cada uma dessas frequências.
Veja a figura a seguir, representando um banco de filtros com 12 posições:
O 8º compartimento tem uma frequência central de cerca de 2kHz. A energia no 8º compartimento é obtida somando-se as energias ponderadas da FFT entre 1600 e 2800 Hz aproximadamente - com o peso atingindo um pico em torno de 2kHz.
Nota de implementação: Esse monte de somas ponderadas pode ser feito em uma única operação - uma multiplicação da matriz de uma "matriz do banco de filtros" pelo vetor de energias da FFT.
Portanto, nesta fase, "resumimos" o espectro da FFT em um conjunto de 40 (12 na ilustração) valores de energia, cada um correspondendo a uma faixa diferente de frequências. Tomamos o log desses valores.
fonte
39 mel
etapa 4?