Processamento Digital de Sinais de Áudio Utilizando Javascript

Processamento Digital de Sinais de Áudio Utilizando Javascript

Processamento Digital de Sinais de Áudio Utilizando Javascript

Processamento digital de sinais é a área da computação que estuda a representação matemática de sinais de qualquer natureza, onde sinais podem assumir qualquer forma, sejam eles analógicos ou digitais. Confira o artigo completo.

Tempo de Leitura: 4 minutos

O Sinal Digital

Inicialmente, precisa-se desenvolver o conceito de frequência, que é definida como o número de oscilações em um intervalo de tempo determinado. Ou seja, a frequência é o número de vezes que um sinal oscila por segundo.

No caso da frequência elétrica, o sinal oscila a cada vez que ocorre uma alteração de alta para baixa ou de baixa para alta. A frequência mais utilizada para as transmissões de telecomunicações é a 60 Hz (Hertz).

Continue a leitura para entender mais!

Conheça a Casa do Desenvolvedor

Outros conceitos importantes são:

Amplitude:

Conhecida também por intensidade, é o afastamento da forma de onda a partir da origem, na direção vertical, ou seja, quanto mais potente uma onda mais energia ela carrega e, consequentemente, maior o volume do som.

Período:

O período é o tempo que o sinal leva para se repetir.

Fase:

A fase é o deslocamento que o sinal sofre em relação ao ponto de oscilação inicial.

Onda:

Uma onda é a representação gráfica do sinal.

Para melhor compreender, veja a imagem abaixo:

Como vimos, a amplitude é a diferença entre o valor máximo (V P ) e o valor mínimo (V N ), o período é o tempo que o sinal leva para se repetir (T), a fase é o deslocamento que o sinal sofre em relação ao ponto inicial (Φ) e a onda é a representação gráfica do sinal.

Agora que já sabemos o conceito de frequência, amplitude, período, fase e onda, vamos analisar o conceito de sinal digital.

O sinal digital é o sinal que pode assumir somente dois estados: alta ou baixa ou 1 ou 0.

Portanto, o sinal digital não pode apresentar diferentes valores como ocorre com o sinal analógico. Por exemplo, um sinal analógico pode assumir valores de 0,5 V, 1 V, 1,5 V e assim por diante. No entanto, um sinal digital pode assumir apenas os valores de 0 e 1.

Quando um sinal analógico é convertido para um sinal digital, a amplitude de cada sinal analógico é dividida em partes iguais e cada uma dessas partes é comparada com o sinal digital.

As partes que forem maiores que o sinal digital assume o valor 0 e as que forem menores assumem o valor 1.

Como vimos, o sinal digital é o sinal que pode assumir somente dois estados: alta ou baixa ou 1 ou 0.

Por exemplo, imagina que você queira converter os seguintes valores analógicos para valores digitais:

5 V = 1

2,5 V = 0

0 V = 0

Como podemos ver, o sinal digital não pode assumir diferentes valores como ocorre com o sinal analógico. Por exemplo, um sinal analógico pode assumir valores de 0,5 V, 1 V, 1,5 V e assim por diante. No entanto, um sinal digital pode assumir apenas os valores de 0 e 1.

Quando um sinal analógico é convertido para um sinal digital, a amplitude de cada sinal analógico é dividida em partes iguais e cada uma dessas partes é comparada com o sinal digital.

Processamento de Áudio com JavaScript

Para processamento de áudio digital o javascript se dispõe de uma biblioteca nativa chamada de Web Audio API. A API de áudio da Web envolve a manipulação de operações de áudio.

As partes que a compõem são:

Nodes: São os elementos básicos para processamento de som, são eles: AudioContext, AudioSourceNode, AudioDestinationNode, AnalyserNode, BiquadFilterNode, BufferSourceNode, ChannelMergerNode, ChannelSplitterNode, ConvolverNode, DelayNode, DynamicsCompressorNode, GainNode, IIRFilterNode, MediaElementAudioSourceNode, MediaStreamAudioDestinationNode, MediaStreamAudioSourceNode, OscillatorNode, PannerNode, PeriodicWave, StereoPannerNode

Parâmetros: Definem as propriedades de um nó.

Conexões: Conexões são as ligações entre os nós, cada nó tem um parâmetro chamado ‘connect’, que é responsável por ligar um nó a outro.

Eventos: Os eventos na API de áudio são responsáveis por disparar determinadas ações.

AudioContext 

A interface AudioContext representa um grafo de processamento de áudio construído a partir de nós de áudio conectados, cada um representado por um AudioNode.

No código abaixo podemos ver um exemplo de captura de dados de áudio a partir do microfone de um dispositivo dispositivo usando javascript:

const AudioContext = window.AudioContext || window.webkitAudioContext;

var audioContext;
var analyser;
var audioSourceNode;

navigator.mediaDevices.getUserMedia({audio: { echoCancellation: true }}).then( stream => {

audioContext = new AudioContext();
analyser = audioContext.createAnalyser();
audioSourceNode = audioContext.createMediaStreamSource(stream);

analyser.fftSize = 1024;
var bufferLength = analyser.frequencyBinCount;

audioSourceNode.connect(analyser);

process();

},

err => {

console.error(err);

}

);

function process(){

setInterval(function(){

timeDataArray = new Float32Array(analyser.frequencyBinCount);

analyser.getFloatTimeDomainData(timeDataArray);

},100);

}

Inicialmente foi invocado o método navigation.mediaDevices.getUserMedia para buscar as fontes de captura de áudio disponíveis no dispositivos para o navegador, essa função ficará ouvindo as streams de áudios captadas pelo microfone do dispositivo e irá disponibilizadas para processamento para isso precisamos criar um nó usando a função audioContext.createMediaStreamSource passando a stream capturada como parâmetro.

A partir daí criamos um analisador usando a função audioContext.createAnalyser(), onde a mesma será responsável por expor dados de frequência e tempo do áudio capturado, para podermos processar ondas sonoras na forma de sinais digitais precisamos capturar uma certa quantidade de amostras de dados de áudio em um determinado tempo isso é definido passado o valor 1024 para a variável fftSize do analisador onde a cada determinado tempo será capturado 1024 amostras de áudio do microfone do dispositivo. 

Para que o analisador possa ouvir os sinais de áudio recebidos pelo dispositivo de entrada precisamos conectar o analisador de áudio a stream provinda do microfone como faz o código audioSourceNode.connect(analyser).

Logo após foi criado uma função process que será responsável por processar os sinais de áudio capturados, nela existe uma função setInterval que fica sendo chamada a cada 100 milisegundos infinitamente, isso significa que a cada 100 milissegundos serão capturados 1024 dados de áudios do analisador que será nossa amostra, no código acima foi aplicado uma função para transformar os dados para o domínio da frequência para serem mais fáceis de serem tratados posteriormente, e esses dados poderão ser usados para fazer qualquer tipo de processamento com eles um exemplo bastante interessante é descobrir qual nota musical está sendo tocada descobrindo qual é a frequência fundamental do som capturado e a partir da frequência descobrir a nota que a representa, mas isso é assunto para um próximo postagem.

Concluindo, o javascript vem se tornando uma linguagem poderosa para processamentos de diversos tipos de dados hoje em dia, saindo de uma simples linguagem de programação utilizada apenas para manipulação de html e css para uma linguagem completa e poderosa.

Quer trocar conhecimento e tirar dúvidas sobre programação? Acesse nosso fórum pelo botão abaixo:

Maurício Miranda
Maurício Miranda
Formado em sistemas de informação pela Universidade Federal de Sergipe, Desenvolvedor FullStack na TecnoSpeed e 2° Lugar na Nasa App Challenge.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Pular para o conteúdo