Usando a transformada de Fourier para construir um visualizador de música com Python e Arduino

Camila
8 min readJun 19, 2019

--

Por: Camila Stenico dos Santos, 8530952

Em 1822, o matemático Barão Jean-Baptiste-Joseph Fourier desenvolveu a transformada de Fourier, publicada pela primeira vez no livro ‘Théorie Analytique de la Chaleur’. Através do interesse do Barão de saber como o calor flui nos materiais, foi-se descoberto uma importante ferramenta matemática para diferentes áreas da ciência.

Mas porquê Fourier se tornou tão relevante? Simples, tudo no mundo pode ser descrito através de uma forma de onda — uma função do tempo, espaço ou alguma outra variável, como por exemplo, uma música. A Transformada de Fourier é uma maneira única e poderosa de ver essas formas de onda.

Neste artigo, vou dar uma breve introdução sobre a transformada de Fourier, a ideia por trás da Fast-Fourier Transform e vou aplicar uma biblioteca FFT para visualizar uma música através de sua frequência usando um pequeno código em Python, um Arduíno UNO e alguns LEDs.

Todo o código usado no projeto está disponível em https://github.com/cstenico/fft-demo

1. Transformada de Fourier

A transformada de Fourier é uma função originada da série de Fourier que explica exatamente quais frequências estão no sinal original de uma forma de onda qualquer.

Definição de série de Fourier. Fonte: [1]

Dado a série de Fourier, a transformada de Fourier é obtida trazendo duas mudanças fundamentais: os limites de integração são infinitos, tornando o período da função ilimitado e o parâmetro de frequência w aceita todos os valores reais.

Por definição:

Definição da transformada. Fonte: [1]

Em outras palavras, tomando como exemplo três ondas senoidais de diferentes frequências representando três notas musicais distintas, as ondas podem ser combinadas em uma onda, gerando uma nota musical de forma não períodica, pouco parecida com as senóides originais. O resultado da descoberta de Fourier permite que, independente da complexidade da forma de onda final, é possível representá-la como uma combinação de senóides, sabendo-se exatamente as frequências que devem ser combinadas e qual a frequência final apresentada.

Voltando a definição, f(x) representa a tal onda complexa. O exponencial representa as senóides originadoras e a integral permite a escolha da frequência de cada senóide necessária para representar o sinal. O resultado final da equação, F(w) é a magnitude e o tempo de atraso de cada sinal gerador que será combinado.

2. Transformada Discreta de Fourier (DFT) e Fast Fourier Transform (FFT)

2.1. DFT

A transformada de Fourier é uma ótima ferramenta quando se considera funções contínuas, mas em aplicações digitais é impossível falar em continuidade. Para a análise de sinais conhecidos apenas em instantes separados por tempos de amostragem (dados discretos), é usado a variação da transformada conhecida como Transformada Discreta de Fourier (DFT).

Definição da Transformada Discreta de Fourier (DFT). Fonte: [1]
Tabela comparativas das formas de Fourier. Fonte: [4]

2.2. FFT

A Transformada Rápida de Fourier (FFT) é um algoritmo que calcula a Transformada Discreta de Fourier (DFT), tendo como princípio que qualquer sinal (mesmo os não periódicos) pode ser reconstruído com bastante precisão, adicionando sinais sinusoidais junto com diferentes frequências e amplitudes. Quanto mais sinais sinusoidais juntarmos, mais o nosso sinal reconstruído se parecerá com o original. Teoricamente falando, com uma quantidade infinita de sinais sinusoidais, obtemos um sinal idêntico ao original [3].

A transformação de Fourier. Fonte: [3]

O algoritmo FFT usa esse princípio e essencialmente permite que você veja quais frequências estão presentes em qualquer sinal analógico e também veja quais dessas freqüências são as mais dominantes. Isso é muito útil em uma enorme quantidade de aplicações.

Gráficos como o azul com apenas picos no GIF acima é o que você normalmente obtém depois de executar um FFT.

O eixo x é a frequência — quanto mais alto neste eixo, maior a frequência.

O eixo y é a amplitude — quanto mais alto este eixo, maior a amplitude.

O que você normalmente obtém nesse gráfico é um ou mais picos. Um pico alto significa que essa frequência particular é dominante no sinal (guarde essa informação, ela será útil na aplicação a ser desenvolvida das próximas seções).

O FFT tem seu algoritmo resumido em 3 passos [5]:

  1. Decompor um ponto N no domínio do tempo em vários sinais, contendo cada um valor.
  2. Achar o espectro de cada ponto de N
  3. Sintetizar o espectro de N em um valor de frequência

3. Aplicações em áudio

Agora que já definimos o algoritmo FFT, o foco se torna suas aplicações em áudio digital. Tudo começa uma música qualquer. A música inicialmente gravada é um arquivo completo sem perdas. Cada frequência é preservada da gravação, da mixagem até a faixa final. Aplicando a transformada de Fourier em um trecho da música original, é possível concluir que alguns componentes de freqüência que são incrivelmente dominantes e outros que mal se registram. O resultado dessa descoberta permite que os arquivos originais, de grande tamanho computacional possam ser compactados sem perda, surgindo o formato .mp3 [2].

A ideia do algoritmo de compactação é analisar cada pequeno espaço do áudio, separar os componentes de freqüência quase imperceptíveis para economizar espaço, bem como alguns dos que estão na extremidade superior do nosso alcance auditivo, determinando os componentes de frequência importantes, eliminando os que não são importantes, até que o restultado seja um arquivo de tamanho chegando a 10% do tamanho original, com a qualidade preservada de forma integra aos ouvidos humanos.

Dentro da área de filtros, o FFT permite a remoção de determinadas frequências de áudios. Um exemplo clássico vem da Copa do Mundo de 2010, ou a copa das vuvuzelas. Através de um filtro na frequência das vuvuzelas, foi possível a transmissão do áudio sem o som dos instrumentos presentes no estádio.

Nas próximas seções, será demonstrado como o FFT aplicado a entrada de áudio do computador consegue extrair os picos máximos de frequência, permitindo a visualização de músicas em uma sequência de LEDs conectadas a um Arduíno.

4. Projeto

4.1. Arduino

Arduino é um microcontrolador de baixo custo, criado para pequenos projetos open-source e para fácil desenvolvimento. Neste projeto, o Arduino será ligado a uma protoboard (base para projetos eletrônicos), onde 9 luzes de LEDs estarão ligadas a saída digital do Arduino. A placa é responsável por receber o comando dado pelo programa em Python (apresentado a seguir), e deverá acender as luzes conforme o pico de frequência passado pelo audio.py. Quanto mais alto o pico, mais luzes acesas.

Receita para construção:

  1. Arduino UNO ou outra placa de sua preferência
  2. 9 LEDs 5v Vermelhos
  3. Muitos conectores
  4. 9 Resistores de 330 Ω
  5. Cabo USB / Serial
Montagem do Arduino + protoboard visto de cima

4.2. Python

Atenção: esse exemplo utiliza Python 3.7.3

O código audio.py é responsável por:
1. Captar áudio pelo microfone do computador executando o código (funcionalidade da biblioteca pyaudio)
2. A cada pequeno trecho de áudio o FFT é aplicado, extraindo o maior pico de frequência (Como dito na seção do FFT).
3. Dependendo do valor do pico, o número de LEDs a serem acesos é enviado ao Arduíno pela serial (funcionalidade da biblioteca serial).
4. A cada iteração do loop principal, o valor do pico de frequência será impresso em Hz no terminal do computador.

4.3. Programação do Arduino

O Arduino pode ser programado através de sua IDE, disponível em https://www.arduino.cc/en/Main/Software

No código do Arduino, deve-se ler o valor recebido na serial e no loop principal a função music() acende os LEDs correspondentes ao número recebido do Python.

5. Resultado

5.1. Execução de audio.py no terminal do MacOS

O programa de captação de áudio é executado no terminal pelo comando python audio.py enquanto o computador reproduz na caixa de som a música "Sua Cara, Anitta feat. Pabllo Vittar". No GIF a seguir, é possível acompanhar a execução e as primeiras respostas do FFT.

Gif mostrando a execução do audio.py no Terminal do MacOS, enquanto o Spotify reproduz uma música na caixa de som. O microfone do computador capta o áudio e o FFT analisa cada trecho para calcular o maior pico de frequência.

5.2. Execução no Arduino

Ao executar o programa em Python, o Arduino deve estar conectado ao USB do computador, para que haja a comunicação entre Python e placa. Ao receber os dados enviados por audio.py, o Arduíno controla os LEDs de forma a executar o visualizador de música, baseado no pico de frequência de cada pequeno trecho captado. A seguir, o resultado pode ser visualizado com êxito através de vídeos (ligue o som para uma melhor experiência).

Demonstração do projeto

Playlist:
1. No One Knows, Queens of the Stone Age
2. Não Existe Amor em SP, Criolo
3. Bulls on Parade, Rage Against the Machine
4. Do I Wanna Know, Arctic Monkeys
5. Nutcracker Suit Op.71a, Thaikovsky
6. Umbrella, Rihanna feat. Jay-Z
7. Bad Romance, Lady Gaga
8. Closer, Magnificence

Algumas melhoras podem ser feitas aos níveis de frequência representados pelos LEDs. Em alguns casos, como em 'Nutcracker Suit', a variação de sons dentro da música clássica gera uma grande distância entre as frequências, variando entre 200Hz e 3000Hz. Já nas músicas do gênero pop e rock, a variação é bem menor, sendo bem representada pelos atuais níveis.

6. Conclusão

O uso de Fourier na área de ciências de computação é muita ampla. Devido a gama de aplicações, Fourier tem sido uma das principais ferramentas para o avanço de processamento de sinais digitais. Ao focar em processamento de áudio digital, foi demonstrado como as ondas no domínio do tempo são transformadas para o domínio da frequência. A análise resultante permite pequenos projetos, como o visualizador de música, até a possibilidade de transmitir músicas pela Internet gastando-se pouco espaço de memória, remoção de ruídos, manipulação de áudio e reconhecimento de voz (base para as assistentes pessoais como a Siri, da Apple).

7. Referências

[1] Cl.cam.ac.uk. (2019). [online] Available at: https://www.cl.cam.ac.uk/teaching/1213/MathMforCS/MathMforCSPartAslides.pdf [Accessed 19 Jun. 2019].

[2] Gizmodo.com. (2019). [online] Available at: https://gizmodo.com/digital-music-couldnt-exist-without-the-fourier-transfo-1699155287 [Accessed 19 Jun. 2019].

[3] Norwegiancreations.com. (2019). What Is FFT and How Can You Implement It on an Arduino?. [online] Available at: https://www.norwegiancreations.com/2017/08/what-is-fft-and-how-can-you-implement-it-on-an-arduino/ [Accessed 19 Jun. 2019].

[4] Sho Nakagome. (2019). Fourier Transform 101 — Part 4: Discrete Fourier Transform. [online] Available at: https://medium.com/sho-jp/fourier-transform-101-part-4-discrete-fourier-transform-8fc3fbb763f3 [Accessed 19 Jun. 2019].

[5] Dspguide.com. (2019). How the FFT works. [online] Available at: https://www.dspguide.com/ch12/2.htm [Accessed 19 Jun. 2019].

Os códigos foram baseados nos seguintes projetos:
https://www.swharden.com/wp/2016-07-19-realtime-audio-visualization-in-python/
https://github.com/DevonCrawford/LED-Music-Visualizer

--

--