Digitalizar Áudio - Teoria fácil e prática difícil ?

Testando de tudo um pouco no meu arduino pensei em tentar digitalizar voz (ou qualquer outro som) colocando um sinal de entrada numa porta analógica e após a conversão fazer com que uma das sáidas PWM  acionasse um alto-falante com o som digitalizado. (Passo seguinte: armazenar os bytes num cartão SD, por exemplo)

A primeira vista, nada parecia mais fácil, já que o Arduino caia como uma luva nas minhas pretensões à Prof. Pardal.

Entretanto, o resultado não foi satisfatório, sendo o som(?) ouvido após o processamento apenas um ruído agudo e ininteligível, nada lembrando o sinal de entrada.

Alguém tem alguma orientação ou idéia do que pode estar ocorrendo ?

Pesquisas na web não me trouxeram esclarecimentos, por enquanto.

Em alguns sites vistos/lidos haviam comentários de que talvez os 16MHz do arduino fossem insuficientes para sintetizar voz em tempo real, mas nada muito claro sobre isso. 

Obrigado por qualquer informação.

O que eu fiz:

- Entrada: Um microfone de eletreto em conjunto com um amplificador de áudio LM386. Saída de áudio em volts:1,6V
- Entrada de áudio em A0.
Acoplando um alto-falante direto na saída do LM386 o som ouvido é perfeito.

O que eu observei:

- Os valores "lidos" oscilam, indicando que é detectada tensão na entrada analógica.
- Que o arduino é capaz de fazer, em média, 8320 leituras por segundo na entrada analógica.
- Inclui -delays-  de diversos tempos entre leituras sem resultados audíveis perceptíveis.
- Acoplando um LED na saida PWM o mesmo oscila erráticamente não parecendo estarde acordo com o áudio de entrada.

P.S.: Numa análise prévia o Marcelo comentou, muito apropriadamente, que sons por serem ondas, ora tem momentos positivos e ora momentos negativos que, poderiam oscilar no caso do Arduino, entre +2,5V e -2,5V, mas a entrada analógica só lê valores entre 0V e 5V. Já é uma boa contribuição de algo que deve ser considerado e contornado. Obrigado Marcelo, voce tá sempre "ligado", aprecio isto.

Exibições: 5233

Responder esta

Respostas a este tópico

Como previsto não é tão fácil como parece.

Fiz mais algumas consultas na web e confirmei que o Arduino com configuração -padrão- não é capaz de fazer o serviço. É necessário aumentar a frequência (clock) de funcionamento de pelo menos um dos timers internos para que a leitura de entrada seja feita com um mínimo de qualidade.

Boas dicas estão aqui http://interface.khm.de/index.php/lab/experiments/arduino-realtime-...

e aqui http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1224777046/0

Ainda não pude analisar todo o conteúdo para dar minha opinião, mas são um excelente ponto de partida para quem se interessar.

Tão logo esteja certo do conteúdo farei comentários adicionais.

Alo Marcelo,

Já tinha visitado ambos os sites acima. Não é bem o que procuro. Gostaria de ver até que ponto o Arduino é capaz de fazer isso tudo sózinho, sem shields, exceto para o SD card como armazenamento apenas. Testar os seus limites, entende ?

Para começo, ficaria satisfeito simplesmente injetanto sinal de áudio numa entrada analógica e ouvindo o mesmo,  digitalizado, saindo por uma porta PWM no mesmo instante.

Mas de qualquer forma, pode ser útil para alguns garagistas. Obrigado pelo interesse.

Olá Lauro e Marcelo,

Legal, a discussão, bem, uma solução para o problema da entrada que lê valores entre 0V e 5V é polarizar a entrada em 2,5V através de 2 resistores de igual valor como mostrado na figura abaixo. Assim o sinal pode variar entre +2,5V e -2,5V de pico e a entrada do arduino irá variar entre 0 e 5V, quando não houver sinal de áudio a entrada estará com 2,5V.

Outra sugestão é que devemos limitar a banda de frequências passante do sinal de áudio, por meio de um filtro, pois como disse Niquist a frequência de amostragem do conversor A/D deve ser no mínino o dobro da frequência do sinal convertido.

Para sinais de áudio (voz), podemos limitar a banda em 4kHz como é feito em circuitos de telefonia, assim o arduino precisaria ter uma amostragem mínina de 8kHz, o que pode ser conseguido com ajustes nos registradores do conversor AD do ATmega. 

O filtro da saída PWM também que ser bem calculado, para que a resposta seja o mais fiel possível.

Esse é um tema que deve render muito.

Abraços.

Alo Marcos,

Ambas as informações são muito úteis e também já as havia "capturado" em pesquisas anteriores. O que está me faltando mesmo são dicas sobre o desenvolvimento do software de leitura e saída de áudio já que um sketch básico de leitura analógica e escrita digital não teve resultados satisfatórios, o que deixa claro que tratamento de áudio é algo de grande complexidade, quer seja na leitura quer seja na escrita do resultado(saida).

De qualquer forma são informações preciosas as que forneceste,  e indispensáveis aos que também se interessarem pelo assunto. Obrigado.

"..., o que deixa claro que tratamento de áudio é algo de grande complexidade, quer..."

é por isto que existem os DSPs, não tem milagre nisto, dependo do que queira fazer simplesmente o seu microcontrolador não tem capacidade o suficiente de processamento pra tal.

No caso da lib que passei não são simultâneos e não sei se o Atmel 328 do Arduino teria capacidade pra fazê-lo codec em realtime.

A Microchip (fabricante dos PICs)  muitas vezes, pra não usar diretamente DSPs, recorre ao um "audio codec" modelo si3000, eu o uso num projeto e realmente é melhor mas depende da aplicação.

Mas se falar um pouco mais do que pretende fazer talvez eu consiga te ajudar melhor

Abraço,

Marcelo

O que eu pretendo:

- Digitalizar basicamente voz (80 a 400hz, com baixa/média qualidade, mono canal) e armazenar os valores(bytes) correspondentes ao áudio de entrada.

- Ler futuramente os bytes armazenados e transformá-los novamente no áudio original.

- Quero utilizar o mínimo possível de hardware adicional ao Arduíno, e a qualidade de som desejada é o suficiente para ser intelegível.

Agradeço pelo teu interesse.

Ah ok muito bom

Então a lib do link que passei:  http://www.ladyada.net/make/waveshield  não serve?

pois ela faz exatamente isto

No site tem a seguinte observação: "Although it's possible to generate audio direct from a microcontroller using a PWM output, the quality is often low and its hard to fit a lot of music in an EEPROM chip."

Ou seja, "seria" possível fazer isso com o Arduino, embora com baixa qualidade de som.

É o que eu preciso, à primeira vista. Não preciso qualidade,e, no momento, o armazenamento é secundário. Quero saber é como fazer isso, a digitalização e a saída digitalizada. Armazenar eu deixo para mais tarde.

O shield em questão tem a desvantagem de só utilizar arquivos não comprimidos (PCM e WAV) que geram grandes arquivos, ainda que de boa qualidade, mas isso pode inviabilizar meu propósito, que é: Qualidade baixa/média e arquivos bem pequenos.

Eu não descarto o uso daquele shield ou semelhante, mas só o farei depois de esgotar as possibilidades do arduíno fazer isso sozinho, entende ?

Novamente agradeço e permaneço aceitando com prazer quaisquer sugestões ou dicas que voce ou outros garagistas tiverem a oferecer.

Lauro,

Existe um algoritmo que converte um arquivo wav em um arquivo de som no formato de 1bit.

Este software chama BTC Sound Encoder 3.0, ele roda na platorma windows

Neste caso somente pode-se reproduzir um arquivo wav ( em baixa qualidade ), através de qualquer microcontrolador ( no exemplo do site, eles usam um PIC ).

Segue link para suas pesquisas: http://www.romanblack.com/picsound.htm

Alo Cinésio,

Meu amigo, parece que voce achou o mapa da mina !

Numa primeira impressão com uma rápida e não muito atenta leitura parece ser exatamente o que eu procurava.

Agora vou ler com a atenção merecida e ver da possibilidade de tornar os algoritmos " Arduináveis", o que não deve ser difícil.

Muito obrigado pela dica. Manterei o fórum informado sobre os progressos que espero realizar.

Lauro, gosto disso.

Me faz lembrar as vozes de computadores de 8 bits da decada de 80.

Conseguiu fazer a conversão de 1 bit?

Antiguamente, devido as limitações da época, isso era muito usado.

Fica parecendo uma voz de robô. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço