Eu tenho tentado elaborar a lógica para esta tarefa e planejo usar o pacote de origem KissFFT para executar a transformação rápida de fourier. Informe-me se isso parecer correto:
- Aloque uma estrutura FFT, ie.
kiss_fft_alloc(N,0,NULL,NULL)
OndeN
está o tamanho da janela que estou usando. O buffer de entrada será uma matriz deN
elementos do tipokiss_fft_scalar
. O buffer de saída será uma matriz deN/2 + 1
elementos do tipokiss_fft_cpx
. - Decodifique
N
(tamanho da janela) o número de amostras PCM. - Para cada amostra PCM, calcule a média da amplitude de cada canal (amostras não assinadas) e a escala de 0 a 2 (divida por 65536,0), armazenando o resultado no buffer de entrada.
- Execute a janela (ou seja, Hanning) no buffer de entrada.
- Execute uma transformação rápida de Fourier no buffer de entrada, armazenando no buffer de saída. Desde que eu estou usando valores reais como entrada, eu posso usar
kiss_fftr()
. - Para os
N/2
valores de saída, obtenha a magnitude ao quadrado dos dados transformados e converta os valores na escala de dB com a seguinte fórmula:10 * log10 (re * re + im * im)
- Plote os
N/2
valores da etapa 6. - Descarte a primeira metade do buffer de entrada, decodificando as próximas amostras de PCM (tamanho da janela / 2) e realizando a escala e a janelagem dos dados. Isso deve deslizar efetivamente a janela de entrada e evitar a necessidade de refazer a matemática nas amostras processadas de PCM.
- Passe para a etapa 5, repetindo essas etapas até que todas as amostras sejam processadas.
- Libere a memória usada de
kiss_fft_alloc()
.
Foi sugerido que eu subtraísse um valor da janela de entrada antes de executar a FFT, para que o valor DC resultante tenha uma magnitude zero. Devo subtrair a média ou a média dos dados de entrada?
Além disso, quais são as coisas que preciso considerar ao escolher o tamanho da janela? Além disso, ele deve ser um número par, de acordo com as instruções do KissFFT, existe um benefício em usar um tamanho de janela pequeno, ou seja. fornecerá um gráfico melhor? Presumo que um tamanho de janela grande reduz o número de FFTs que devem ser executadas; esse é o único benefício em usar um tamanho de janela grande?
Por fim, quando chego ao ponto em que os dados estão prontos para plotar, como faço para plotá-los? Quando eu trabalhei em alguma lógica gráfica de forma de onda no passado, apenas plotei 3 valores para cada pixel ao longo do eixo (amplitude mínima, amplitude máxima, amplitude RMS), mas não sei o que devo fazer com dados do espectrograma.
Agradecemos antecipadamente por toda e qualquer orientação que você possa fornecer.