Como extrair informações de frequência de amostras de Portaudio usando FFTW em C
Pergunta
Quero fazer um programa que grave dados de áudio usando o Portaudio (eu fiz essa parte) e, em seguida, exibirá as informações de frequência desse áudio gravado (por enquanto, gostaria de exibir a frequência média de cada grupo de amostras quando eles entram).
De algumas pesquisas que fiz, sei que preciso fazer uma FFT. Então, pesquisei uma biblioteca para fazer isso, em C, e encontrei o FFTW.
No entanto, agora estou um pouco perdido. O que exatamente devo fazer com as amostras que gravei para extrair algumas informações de frequência deles? Que tipo de FFT devo usar (suponho que precisará de um dados real 1D?)?
E uma vez que eu fiz o FFT, como obtenho as informações de frequência dos dados que isso me fornece?
EDIT: Agora encontrei também o algoritmo de autocorrelação. É melhor? Mais simples?
Muito obrigado antecipadamente, e desculpe, não tenho absolutamente nenhuma experiência se isso. Espero que faça pelo menos um pouco de sentido.
Solução
Para converter suas amostras de áudio em um espectro de energia:
- Se seus dados de áudio forem dados inteiros, converta -os em ponto flutuante
- Escolha um tamanho de FFT (por exemplo, n = 1024)
- Aplicar um função da janela para n amostras de seus dados (por exemplo Hanning)
- Use uma FFT real para o complexo de tamanho n para gerar dados de domínio de frequência
- Calcule a magnitude dos seus dados complexos de domínio de frequência (
magnitude = sqrt(re^2 + im^2)
) - Opcionalmente converte magnitude em uma escala de log (dB) (
magnitude_dB = 20*log10(magnitude)
)