segunda-feira, 7 de março de 2016

Novo driver experimental melhora a qualidade de áudio do Raspberry Pi

comparacao driver experimental

É de conhecimento de alguns que a saída de áudio analógico do Raspberry Pi via jack 3.5mm é longe de ser ideal. Suas limitações vem desde a criação do primeiro Raspberry Pi e teve algumas melhoras na parte de hardware com a vinda do Raspberry Pi B+.

O que temos hoje de áudio analógico no Raspberry Pi


O áudio do Raspberry Pi não tem um bom DAC (Conversor analógico digital), ele é gerado via dois canais PWM (um deles compartilhado com o PWM do gpio), seu driver principal roda internamente via firmware na GPU (SIM!). Na placa os sinais gerados passam por um filtro que inclui também um passa baixa de 18Khz. Em algumas análises que fizemos com um osciloscópio é possível ver como o sinal é extremamente ruidoso antes de passar pelo filtro.

Na imagem abaixo temos um sinal de 1Khz sendo capturado no antigo Raspberry Pi Modelo B rev. 2.0 (com firmware desatualizado). O sinal vermelho foi capturado antes do filtro e o azul após o filtro. Mesmo após o filtro é possível ver que a onda está longe de ser perfeita.

comparacao 1khz pwm e filtro

Abaixo o mesmo teste em um Raspberry Pi 2 Modelo B. É notável tanto antes quanto depois do filtro que a onda gerada é bem melhor que o modelo antigo. Após o modelo B+ foi incluído um buffer CMOS com um regulador dedicado para resolver os problemas de interferência vindos de outros componentes ligados à mesma alimentação.

comparacao 1khz pwm e filtro

Há uma certa quantidade de harmônicas/ruídos/etc, dificuldade em gerar boas senoides em maiores frequências, mas isso pode estar para mudar.

O futuro do áudio analógico no Rasperry Pi


Um driver experimental reimplementado por um dos engenheiros do Raspberry Pi promete melhorar relativamente a qualidade de áudio analógico (o áudio via cabo HDMI é transmitido por vias digitais e nada tem a ver com esse driver).

O driver original baseado em PWM de 11 bits e 48Khz foi alterado para 7 bits com modulação Sigma-Delta de segunda ordem à 781.25kHz. Segundo informações o "noise floor" se aproxima da qualidade de DACs utilizados em CD players.

Embora eu não seja especialista em áudio, posso demonstrar que a alteração causou uma grande diferença que é facilmente notável em um osciloscópio.

Na imagem abaixo é possível ver uma frequência de 6Khz gerada pelo Raspberry Pi com driver antigo (onda vermelha) comparada em paralelo com o driver novo (onda azul).

comparação driver antigo e novo

A diferença é claramente notável, com o driver novo é possível gerar senoides com maior perfeição.

Abaixo a mesma comparação em um sinal de 10Khz

comparação driver antigo e novo

Em 10Khz há uma dificuldade ainda maior para se manter a onda senoidal (vermelha), com o driver experimental a diferença é novamente enorme.

Ao gerar FFTs também é possível notar diferenças.

comparação driver antigo e novo fft
6Khz driver antigo

comparação driver antigo e novo fft
6Khz driver experimental

comparação driver antigo e novo fft
10Khz driver antigo

comparação driver antigo e novo fft
10Khz driver experimental

O driver como dito é experimental e instável. Sendo necessário inclusive desativar um certo ajuste de atualização da RAM.

Como ativar o driver experimental no Raspberry Pi


Primeiramente é necessário atualizar o firmware para o último disponível, isso pode ser feito com o seguinte comando:

sudo rpi-update

No arquivo /boot/config.txt adicione as seguintes linhas:

disable_pvt=1
force_turbo=1
audio_pwm_mode=2
audio_sdm_mod_order=2

Reinicie o sistema.

Segundo informado, seria necessário selecionar manualmente o driver para aqueles sem o cabo HDMI conectado utilizando amixer cset numid=3 1. No meu caso não foi necessário esse comando (talvez algum update recente no firmware tenha corrigido). De todo modo é notável pelas diferenças nos gráficos que ele realmente estava ativo.


Conclusão


O engenheiro que está fazendo as alterações deu mais algumas informações técnicas de melhoras.

- O THD+N agora é de -50dB contra -20dB anteriormente
- Quantisation noise floor de ~-93dB contra ~-60dB anteriormente

Um dos relatos são de vídeos de youtube causando problemas. Outro usuário revelou que o driver para de funcionar ocasionalmente. Eu mesmo tive alguns problemas de latência do áudio que ao reiniciar voltavam ao normal.

A diferença real ao ouvir o som é notável. Embora eu não tenha percebido inicialmente por causa do fone, ao trocar para um que o som fica mais alto é perceptível o ruído de fundo com o driver antigo e como ele praticamente some no driver experimental.

Ainda há problemas no driver sendo resolvidos e os esforços continuam para sua melhora. O pouco que foi visto ja é suficiente para saber o que vem por aí.

A atualização funciona em quase todos os modelos, inclusive no novo Raspberry Pi 3 Modelo B. O Raspberry Pi Zero não tem saída de áudio analógico.

Meus parabéns ao engenheiro que se apresenta com nick jdb.

Mais informações podem ser obtidas no post original de referência. Uma análise mais técnica sobre o áudio do Raspberry Pi pode ser vista aqui e aqui.

Referência: https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=136445

4 comentários:

  1. Oi, eu tentei a solução que se propõe a OSMC e ruído de fundo parece ter diminuído, mas o som é muito saturada. Você sabe se esta solução funciona para OSMC? Obrigado

    ResponderExcluir
    Respostas
    1. Olá, essa solução em teoria funciona em qualquer distro que tenha o firmware atualizado, entretanto como dito no artigo se trata de um driver experimental e instável. Ainda há varios bugs e não recomendo utilizá-lo direto ainda.

      Excluir
  2. em uma raspberry pi 3

    ResponderExcluir