Eu sou bastante novo em Java e Processamento de Sinais, mas fui designado a um projeto que trata de processamento de áudio. Meu tópico que me foi dado é um jogo que possui um componente de análise de uma música (qualquer música) e gera dados, dependendo da frequência atualmente em execução (tempo real). ou seja: à medida que a música toca, emite a frequência atual (a cada segundo emite a frequência atual).
Foi-me dito no stackoverflow para usar o FFT. eles dizem "apenas faça um FFT", mas isso não significa nada para mim? Como você faz um FFT? Eu li tutoriais e basicamente entendo o que é, mas não tenho idéia de como implementá-lo como em:
- qual é o tipo de dado do arquivo de áudio mais adequado para esse processamento?
- o que exatamente é a entrada da FFT
- como interpreto os resultados
Alguém pode sugerir um tutorial simples de seguir sobre como processar um sinal de áudio? Além disso, se alguém conhece uma boa implementação do FFT para Java, eu apreciaria as sugestões.
Respostas:
Vamos ver. Não tenho idéia sobre classes Java ou que tipo de suporte ele tem para processamento de sinais, mas darei algumas orientações. Os detalhes específicos da implementação no idioma, você precisa descobrir.
Para fazer qualquer tipo de processamento em um arquivo de áudio, você precisa dos dados "brutos", ou seja, um arquivo de áudio que possui amostras de áudio descompactadas. Por exemplo, o formato WAV, que normalmente possui amostras no complemento de 2 bits com assinatura de 16 bits.
Se você estiver usando um computador e processando offline, pode ser uma boa ideia converter esse valor em um dobro (o que na maioria dos processadores hoje significa número de ponto flutuante de 64 bits).
Portanto, você terá um fluxo contínuo de números duplos provenientes do arquivo. Então você precisa definir uma maneira de lidar com os dados contínuos. Uma maneira padrão e amplamente usada é usar um buffer circular (mesmo se estiver offline, presumo que você queira que seu código seja eficiente e carregar o arquivo inteiro na memória como uma matriz não é a melhor solução). Ou isso ou apenas um buffer normal, é sua escolha. O comprimento do buffer deve ser uma potência de 2 (faça com a eficiência do algoritmo Cooley-Tukey radix-2).
Agora você precisa fazer a FFT real. Isso é apenas uma multiplicação do buffer (que matematicamente é um vetor) pela matriz FFT. Como essa operação é realmente executada em Java, não faço ideia. Em C, seria apenas passar o ponteiro para a matriz e o comprimento para uma rotina FFT que, ou retorna um ponteiro para a memória alocada dinamicamente, ou deixa o resultado em uma matriz que você passa para ela.
finalmente, você chega a uma matriz de números complexos M (assumindo que o comprimento da matriz / buffer / vetor com o sinal seja M). E então você faz o que quiser com ele.
Por exemplo, você pode medir a magnitude de cada um dos números complexos e encontrar o máximo para detectar onde a frequência fundamental pode estar (embora muito aproximada).
Extras: técnicas mais avançadas para processar incluiriam um pré-janelamento para evitar vazamentos, preenchimento zero para obter mais resolução no espectro da janela, etc.
Espero que ajude.
fonte
Se você é bom o suficiente,
JAVA
pode usar o JTRANSFORMS uma biblioteca java para aFFT
qual pode ser útil para vocêe por sua necessidade, soa como um
Visualização de música usando a API Java Sound
Visualização de música usando FFT em Ruby na 7Steps
você pode seguir estas etapas simples conforme sua exigência:
* Acostume-se a alguma terminologia de áudio
1. Leia o quadro de reprodução (digamos 20-30ms), o tamanho do quadro depende do seu
sampling rate
digamos que você esteja usando uma taxa de amostragem 8000 e cada amostra seja16bit
signed
little endian
, então o quadro de 20ms será 160 amostrasNota: tente reproduzir um
raw
arquivo e não ummp3
arquivo compactado .2.Pegue o quadro de dados brutos e execute um
FFT
3. Executar adequadamente
Windowing
4.O resultado da sua saída FFT terá dois componentes reais e complexos, tentando obter um gráfico de magnitude que é apenas o
absolute
valor do componente complexo, seu pico fornece a vocêdominant frequency
5. dê uma olhada em tutoriais simples como abaixo
Bom tutorial sobre FFT
Guia de engenheiros para FFT
Tutorial da FFT
Visão geral da FFT
fonte