Site menu Modem QAM atinge 48000 bps
e-mail icon
Site menu

Modem QAM atinge 48000 bps

e-mail icon
Figura 1: Onda QAM

A figura acima é a forma de onda de um sinal QAM com bitrate de 38400bps. Eu acredito em matemática, porém o senso comum recusa-se a acreditar que qualquer informação possa ser recuperada de uma onda tão caótica.

O modem QAM "versão 3" escrito em Python é um vencedor. Alguns dos FIXMEs do código foram implementados, e o negócio atingiu 38400bps a 2400baud, e mesmo 48000bps a 3000baud — ambos utilizando 16 bits por símbolo. Note que 3000baud é quase duas vezes a freqüência da portadora, 1800Hz.

O modem "quis" funcionar a 18 bits por símbolo, mas apresentou uma taxa de erros muito alta. Não tenho certeza se a quantização de 16 bits do WAV é o limite intransponível aqui, mas parece ser o caso. Eu fiquei surpreso que, apesar de corrompida, a mensagem transmitida a 18 bits por símbolo ainda era reconhecível.

As mudanças na versão 3 que permitiram este salto de performance:

1) adicionado código que detecta símbolos adjacentes iguais em amplitude e fase

Ainda que todos os símbolos da constelação V3 causem uma alteração de fase, às vezes ela é muito pequena, especialmente se o número de bits por símbolo é muito alto.

O algoritmo é simples: se uma mudança de símbolo não for detectada no intervalo esperado, o sinal complexo é sampleado sem mais demora. Idiota como parece, isto permite o RX lidar com até 16 bits por símbolo, enquanto ele manipulava no máximo 7 até então.

2) adicionado um PLL ou compensador de freqüência da portadora

Qualquer diferença entre as portadoras TX e RX causam uma "deriva de fase" nos símbolos QAM decodificados. Isto é, a fase exibe uma pequena mas constante rotação, símbolo após símbolo. Ela pode ser separada das mudanças de fase súbitas, próprias da codificação. Uma vez que a velocidade de rotação é encontrada, pode ser compensada.

Descobri que a deriva de fase é mais estável (e mais fácil de compensar) se a portadora RX estiver numa freqüência ligeiramente menor que TX. Se estiver acima, a deriva de fase oscila de uma forma difícil de lidar. Então, configuramos a portadora RX para um valor ligeiramente menor que TX. Para símbolos de 16 bits, o RX tolera até 15 Hz de desvio na portadora (quase 1%), o que parece bastante bom para mim.

3) a constelação usa código Gray. Pontos adjacentes só mudam em 1 bit.

Isto "amacia" os erros, mesmo quando o RX resolve o símbolo erradamente. Em caso de erro, a maior chance é que apenas 1 bit esteja corrompido. Isto é extremamente salutar quando um algoritmo de correção de erros é utilizado, seja no nível do dados, seja um código convolucional embutido na constelação QAM. (Ainda não implementei isso, mas pretendo fazê-lo um dia.)

Marchando para a versão 4

Na verdade, os números de performance da versão v3 estão ficando pouco relevantes. É óbvio que eles são possíveis, simplesmente porque um arquivo WAV de 16 bits não tem ruído; sua capacidade Shannon teórica é de 700kbps. (A capacidade Shannon de uma linha telefônica é de 24kbps, mais ou menos).

O próximo desafio seria fazer o RX funcionar bem na presença de ruído e limitações de largura de banda. Acredito que taxas na faixa de 14400bps sejam possíveis com o código atual, bastaria adicionar códigos convolucionais.

e-mail icon