Como analisar a entrada / espectro de áudio corretamente


9

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.


2
Esta pergunta parece estar fora do tópico, pois trata de matrizes Java básicas, tipos de dados e arquivos de leitura.
precisa saber é o seguinte

1
Eles disseram que eu preciso perguntar aqui como é fazer com Signal Processing
user3241507

Apenas a última parte da sua pergunta parece ser sobre o DSP. Tente remover as 2 ou 3 primeiras partes do tópico aqui.
precisa saber é o seguinte

Respostas:


8

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.


5

Se você é bom o suficiente, JAVApode usar o JTRANSFORMS uma biblioteca java para a FFTqual pode ser útil para você

e por sua necessidade, soa como um

insira a descrição da imagem aqui

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 ratedigamos que você esteja usando uma taxa de amostragem 8000 e cada amostra seja 16bit signed little endian, então o quadro de 20ms será 160 amostras

Nota: tente reproduzir um rawarquivo e não um mp3arquivo 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 absolutevalor 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.