Posso usar a FFT para reconhecer notas musicais em um piano?

13

Quero criar uma ferramenta que reconheça algumas notas musicais (sei que isso está reinventando a roda). Então, eu tocava C, D e E do meio em um piano e deveria poder classificar essas notas. Aqui está como eu acho que devo abordá-lo:

  1. Grave uma amostra de mim tocando uma nota
  2. Converta o sinal no domínio da frequência usando a transformação rápida de Fourier
  3. Encontre a frequência mais presente (basicamente argmax dos dados do domínio da frequência)
  4. Suponha que a frequência venha da nota tocada e use-a para classificá-la

Ainda não tentei nada disso, porque não quero seguir o caminho errado. Então, teoricamente, isso funcionará?

michaelsnowden
fonte
Seria bom se você pudesse ser mais específico no título. Tentei incluir um pouco do reconhecimento de afinação de piano, mas meu inglês (não nativo) aparentemente está falhando comigo hoje.
pipe
1
@pipe ok Eu mudei isso #
michaelsnowden
1
Seu "exemplo" de tocar uma nota já deve ser uma forma de onda de amplitude e tempo. Essencialmente, o ponto 2 é redundante. Para uma implementação relativamente simples, as etapas acima devem estar bem.
user2943160
@ user2943160 Adicionei para ser explícito. O som pode ser armazenado em vários formatos e, geralmente, é necessário um pouco de distorção para obter uma amplitude agradável ao longo do tempo.
michaelsnowden
@michaelsnowden: Você está usando o termo "amplitude" errado: a amplitude de uma função sinusoidal éy(t)=UMApecado(ωt) . É o máximo do sinal (tensão, deslocamento, ...) e é uma constante (ou muda lentamente em relação à frequência). O que você quer dizer é apenas o sinal y ( t ) . Caso contrário, eu pensaria por "amplitude ao longo do tempo", você quer dizer o envelope do sinal, mas até onde eu entendo, você não. UMAy(t)
Coalhada

Respostas:

23

O conceito é bom, mas você descobrirá que não é tão simples na prática.

O tom não é simplesmente o tom predominante; portanto, há o problema número 1.

Os compartimentos de frequência da FFT não podem atingir todos os tons (nem mesmo vários) da escala musical simultaneamente.

Sugiro que você reproduza um programa de áudio (por exemplo, Audacity) que inclua um analisador de FFT e um gerador de tons para ter uma ideia do que ele pode (e não pode) fazer antes de tentar implementar uma tarefa específica usando o FFT.

Se você precisar detectar apenas alguns tons específicos, poderá achar o algoritmo Goertzel mais fácil e rápido.

A detecção de afinação é complicada e ainda há pesquisas nesse campo. A detecção de tons é bastante simples, mas pode não ser o que você deseja.

JRE
fonte
Se começarmos com a suposição de que as amostras são de um instrumento específico, o problema pode ser um pouco mais fácil de lidar, certo?
Mkeith 7/08
Isso parece muito bom. Uma pergunta de acompanhamento é: o algoritmo de Goertzel pode ser usado para detectar duas notas que estão sendo tocadas simultaneamente?
22816
Pode ser usado para detectar tons simultâneos. Se isso é suficiente para detectar notas simultâneas é uma questão diferente, e ainda estou trabalhando. Eu tenho um detector de notas de guitarra baseado em Goertzel, com o qual tenho andado de brincadeira há anos.
JRE
2
@mkeith: Mais ou menos. Você pode testar as notas e ver se a detecção do tom predominante é adequada para um instrumento específico (e talvez apenas as notas de interesse). Até onde eu sei, porém, não há uma solução geral para detectar todas as notas de todos os instrumentos.
JRE
3

Eu diria que usar uma janela de observação multimodal do sinal seria melhor. Algo parecido com uma decomposição wavelet do seu sinal de áudio que permitirá identificar as múltiplas conotações dentro da nota. Sim, na verdade Wavelets, eu diria que é o caminho a percorrer.

Esta é uma análise muito generalizada do que são wavelets, mas pense nelas como uma janela de várias soluções que passa sobre o seu sinal como um STFT. Assim, você pode identificar diferentes sinusoidais que ocorrem em diferentes locais temporais dentro do seu sinal. isso também é importante, pois a nota tocada não é um sinal estacionário, ela é reproduzida e decai com o tempo. Não sou músico, no entanto, acredito que a dominância do tom muda ao longo da decadência da nota.

é claro que após a decomposição da wavelet, você precisará implementar algoritmos que identifiquem notas e tons periféricos.

Acho que as wavelets realmente resolvem os problemas que as pessoas têm falado em termos de identificação de afinação.

se você quiser saber como as wavelets funcionam, este é um maravilhoso documento divulgado pela HP sobre o assunto :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf e Introdução às Wavelets

para implementação, o MATLAB possui uma ferramenta wavelet e tenho certeza de que há uma infinidade de outros pacotes disponíveis para plataformas como R, etc.

steve_stackex
fonte
1

Eu acho que você está pensando em notas tocadas no meio da faixa do piano (digamos entre 200 e 500 Hz), mas mesmo nessa faixa, uma única nota terá muitos tons, que não são exatos múltiplos da frequência fundamental e também uma quantidade significativa de ruído de banda larga no início de cada nota e talvez também no final.

Para notas altas na extremidade inferior do intervalo de notas, você encontrará que muito pouco da energia do som (menos de 1%) está realmente no tom fundamental da nota.

Outro problema é que uma interpretação ingênua de uma FFT assume que o sinal que você está tentando detectar tem amplitude constante. Isso não se aplica às notas de piano em que a amplitude realmente segue vários decaimentos exponenciais sobrepostos - a parte inicial do decaimento possui uma constante de tempo relativamente curta, mas a parte posterior possui uma constante de tempo mais longa.

É possível investigar melhor os métodos de transformação de Fourier em escala de tempo curta, por exemplo, a transformação de Gabor ou os métodos baseados em wavelet.

Observe que, como o tom fundamental das notas sucessivas aumenta cerca de 6% para cada nota, você não precisa necessariamente de uma precisão muito alta na identificação das frequências dos harmônicos no áudio. Identificar corretamente as notas musicais não é o mesmo problema que determinar se as notas estão sintonizadas com precisão com uma escala musical, em que as frequências podem precisar ser medidas com precisão superior a 0,1%.

alephzero
fonte
0

Sim, é disso que trata a FFT! Para fornecer o espectro de frequência dos dados que você alimenta. A parte difícil são os detalhes da implementação, como você mencionou.

Dependendo do que você deseja fazer, exatamente, muda a resposta.

Se você deseja apenas analisar sua própria música, já existe um software para fazer isso. Você pode olhar para os equalizadores que mostram a resposta (basicamente a FFT), ou obter um "equalizador musical" que também mostra os tons. Você pode obter áudio para VSTs midi que convertem o que você toca nas notas midi corretas. Se o seu teclado for midi, basta pular os VSTs e gravar o midi diretamente.

Se você quiser aprender a FFT e como ela se relaciona com a música, é melhor obter algo como o Matlab, onde você pode calcular a FFT de qualquer dado. Tem a capacidade de gravar e também reproduzir junto com a leitura de arquivos wav e similares. Estes então serão realmente fáceis de usar. Você pode representar graficamente o áudio e fazer todos os tipos de análise rapidamente, se conhece a sintaxe.

Se você deseja criar um dispositivo para fazer isso, é bastante complexo. Você precisará de um uC / dsp / fpga / etc para fazer os cálculos. A maioria dos dispositivos populares já vem com o código FFT, assim você não precisará codificá-lo por conta própria (também complicado).

Você precisará construir o circuito e tudo mais. Não é difícil, mas dependendo da sua experiência / conhecimento, pode levar algum tempo e possui uma curva de aprendizado acentuada. Também depende da qualidade do produto final.

Matematicamente, uma nota musical ideal consiste em uma série geométrica do "fundamental".

Suponha que F0 é a frequência fundamental, então a maioria das notas musicais será aproximada por F (t) + F0 * soma (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Os a_k são apenas a força dessas frequências mais altas F_k e F_k é apenas um múltiplo de F0. Se a_k = 0 para todo k, então temos um sinusóide puro. O tom disso é fácil de detectar. Basta encontrar o máximo da FFT e essa frequência é o fundamental do tom = a nota musical.

Quando você pega a FFT, você acaba com os dados e apenas faz as contas. É basicamente cálculo.

Tudo isso é relativamente fácil.

Alguns problemas com os quais você terá que lidar. Observe que nem todos esses são "resolvidos".

  1. Latência - Se você fizer qualquer tipo de coisa em tempo real, isso pode se tornar um problema.

  2. Várias notas - É difícil determinar o grupo de notas devido a todos os harmônicos extras. Se tocar A = 440hz e A '= 880hz, a maioria dos harmônicos se sobrepõe. Você pode obter facilmente A = 440hz, mas obter A '= 880hz é mais difícil. Quando você pensa em acordes, execução rápida, etc., pode ser muito difícil obter com precisão todas as informações (notas). Embora tudo seja geralmente matematicamente possível, os dados em si apresentam erros e aberrações, e as equações são sub-definidas em alguns casos.

  3. Ruído - O ruído no sinal pode gerar resultados espúrios. Se ocorrer um ruído musical, pode estragar seus resultados. Algoritmos melhores seriam então necessários = tempo + dinheiro + conhecimento.

ResumoDissonância
fonte