Site menu Nova versão do modem QAM
e-mail icon
Site menu

Nova versão do modem QAM

e-mail icon

Conforme prometido, reescrevi partes do modem QAM Python a fim de utilizar números complexos, o que deixa o código mais enxuto e mais claro (desde que você domine números complexos). Também movi o código comum para um módulo separado a fim de evitar redundância entre os módulos TX e RX. O filtro passa-baixas FIR também foi melhorado.

Os arquivos novos são m2co.py, m2tx.py e m2rx.py. Todos podem ser encontrados em https://epxx.co/artigos/modulation.

Acredito que já fui longe o suficiente com isso. Estava planejando escrever uma terceira versão do modem, mas não tenho certeza se farei. As versões 1 e 2 já fazem bons exemplos didáticos. A quem interessar possa, direi o que passa na minha mente a respeito da versão 3, talvez alguém se interesse.

Primeiro, a abordagem "clássica" de demodulação mostrou suas limitações na versão 2. A taxa de baud não consegue ir aém de 1000Hz ou 1100Hz para uma portadora de 1800Hz. O filtro FIR tem um equilíbrio delicado entre as precisões no domínio da freqüência e no domínio do tempo.

Aumentar a taxa de baud demanda mais precisão no domínio da freqüência, mas aí os símbolos começam a "borrar" na fase de filtragem. Para atingir os baud rates dos padrões V.29 e V32, alguma abordagem diferente de decodificação QAM precisa ser tentada.

Brinquei com algumas fórmulas, relembrei algumas identidades trigonométricas na Wikipedia, e tive uma ideia. Já que a derivada do sinal QAM é uma fórmula simples, e apenas duas incógnitas formam o sinal QAM — amplitude e fase — é possível "inverter" a fórmula, isto é, encontrar amplitude e fase dadas duas derivadas extraídas do sinal no domínio do tempo.

A derivada de um sinal digital está prontamente disponível: é apenas a diferença entre duas amostras consecutivas. Medindo duas derivadas com distância de 90 graus de fase da portadora, o sistema de equações fica ainda mais simples.

Já testei essa abordagem em planilha, e deveria funcionar numa implementação Python. Parece ser possível detectar símbolos bem curtos, com metade de um ciclo da portadora ou até menos (o mínimo absoluto é um quarto do ciclo ou 90 graus). Isto viabiliza a decodificação de um baud rate próximo ou até superior à freqüência da portadora.

Outra vantagem dessa técnica seria a maior resistência a pequenos desvios de freqüência da portadora. Tais desvios seriam interpretados simplesmente como um deslocamento de fase pequeno porém constante em cada símbolo, o que permite ignorá-lo, ou filtrá-lo e compensá-lo.

Não tenho ideia se esta é a técnica utilizada por modems avançados do mundo real, mas aposto que é.

e-mail icon