Site menu Modulação AM, ilustrada
e-mail icon
Site menu

Modulação AM, ilustrada

e-mail icon

Rádio é algo com que eu gostaria de ter brincado mais. Por diversas razões, esse interesse está sempre enterrado lá no fundo das coisas por fazer um dia, e pelo andar da carruagem talvez nunca chegue a fazê-lo. Vou me consolando com código Morse e ouvindo ondas curtas, e NDBs aeronáuticos.

Para um sinal, uma informação útil, viajar sobre ondas de rádio, ela precisa ser modulada. Modular é transpor o sinal para uma banda de freqüência e formato compatíveis com o meio de transmissão. As técnicas de modulação são unha e carne com telecomunicações e teoria da informação, e é possível brincar com modulação, ou pelo menos simulá-la, num computador. Não sou um engenheiro de telecomunicações, mas o tema me interessa assim mesmo. A simplicidade do processo faz parecer "milagre".

Neste artigo, vou ilustrar as técnicas de AM — modulação de amplitude ou, como preferem os locutores de rádio da velha guarda, amplitude modulada. Nosso meio de transmissão é o arquivo de áudio WAV. Para começar, precisamos de um sinal de banda-base, isto é, algum áudio que preencha toda a banda desde 0Hz. Gravei minha própria (e desagradável) voz para este fim:


(link to audio)

A largura de banda ou espectro de freqüências deste áudio é:

Análise espectral do sinal de voz original (usando Audacity)

A parte amarela do espectro é a mais relevante, já que o eixo Y é logarítmico (dB). Um sinal 30 decibels mais fraco é 1000 vezes mais fraco. O espectro acima de 5000Hz é basicamente "ruído digital", não é a voz. Nas próximas figuras, vou cortar fora a parte baixa do gráfico. (Se você for curioso, ou não confia nos meus gráficos, você pode fazer o download dos arquivos WAV e analisar o espectro no seu aplicativo predileto.)

A modulação AM exige que o sinal seja restrito em largura de banda, de modo que o sinal modulado também "caiba" numa faixa de freqüência de rádio. Assim, precisamos aplicar um filtro passa-baixas no meu arquivo de voz, e definimos a freqüência de corte em 1000Hz. O resultado é a mesma voz, porém com menos qualidade.


(link to audio)

O espectro deste sinal filtrado é o seguinte:

Análise espectral do sinal de áudio limitado a 1000Hz

Fiz uso do plug-in de filtro passa-baixas do Audacity, que não é perfeito mas é suficiente para ilustrar nossa modulação. Em outros artigos, implementarei um filtro do zero, em Python.

Modulação de amplitude é matematicamente muito simples: basta multiplicar o sinal original por uma onda senoidal contínua, conhecida como portadora. No nosso caso, escolhi uma portadora de 3000Hz, bem acima do corte do sinal original que foi 1000Hz. O ruído da portadora pura parece um assobio:


(link to audio)

O resultado da modulação (voz multiplicada pela portadora) é:


(link to audio)

Note que é quase impossível entender a palavra falada no áudio modulado. Para ser preciso, este tipo de modulação é denominado AM-SC (AM-Suppressed Carrier, ou Modulação de Amplitude com Portadora Suprimida), por uma razão que vou esclarecer mais adiante.

A modulação pega minha voz, cuja banda era 0-1000Hz, e move para 2000-4000Hz. Além de deslocada, a banda dobrou, porque a modulação AM cria realmente duas "cópias" do sinal original: uma na banda 2000-3000Hz e outra na banda 3000-4000Hz. Assim sendo, a modulação AM "desperdiça" banda porque o sinal modulado ocupa duas vezes mais banda:

Espectro da modulação AM-SC

Ainda assim, a modulação AM é muito útil, porque ela permite "mover" o sinal sonoro para freqüências que se prestam à transmissão eletromagnética (bastaria escolher uma portadora na faixa de 1MHz). Mais importante, a modulação permite que múltiplos sinais sejam alocados e transmitidos num mesmo meio de transmissão (no caso do rádio, é o "ar", compartilhado por todos os rádios), cada um ocupando sua banda, e cada um pode ser recuperado separadamente.

Como disse, a modulação acima foi AM-SC, que não é utilizada pelas radiodifusoras. A modulação AM para radiodifusão tem o seguinte som:


(link to audio)

Nesta modalidade de AM, podemos ouvir a portadora, que não podíamos em AM-SC. O espectro AM de radiodifusão é semelhante ao AM-SC porém possui um "pico" exatamente em cima da freqüência da portadora:

Espectro da modulação AM de radiodifusão

O seguinte programa escrito em Python gerou as modulações AM e AM-SC:

#!/usr/bin/env python

import wave, struct, math

baseband = wave.open("paralelepipedo_lopass.wav", "r")

amsc = wave.open("amsc.wav", "w")
am = wave.open("am.wav", "w")
carrier = wave.open("carrier3000.wav", "w")

for f in [am, amsc, carrier]:
    f.setnchannels(1)
    f.setsampwidth(2)
    f.setframerate(44100)

for n in range(0, baseband.getnframes()):
    base = struct.unpack('h', baseband.readframes(1))[0] / 32768.0
    carrier_sample = math.cos(3000.0 * (n / 44100.0) * math.pi * 2)

    signal_am = signal_amsc = base * carrier_sample
    signal_am += carrier_sample
    signal_am /= 2

    amsc.writeframes(struct.pack('h', signal_amsc * 32767))
    am.writeframes(struct.pack('h', signal_am * 32767))
    carrier.writeframes(struct.pack('h', carrier_sample * 32767))

O modulador AM-SC é simplesmente o sinal original (cuja banda tinha sido restrita por um filtro passa-baixas) multiplicado pela portadora, que não passa de uma onda senoidal. A modulação AM de radiodifusão é igual a AM-SC, exceto que a portadora é adicionada ao resultado final. Isto permite que o receptor AM seja mais simples e barato, conforme veremos.

Muito bem, é hora de provar que podemos recuperar a voz original a partir dos áudios modulados. O demodulador AM-SC é tão simples quanto o modulador: o sinal é multiplicado novamente pela mesma portadora — técnica denominada "detecção por produto". O resultado é passado por um filtro passa-baixas.

Estes são os áudios demodulados, primeiro sem a filtragem final:


(link to audio)

E com a filtragem final:


(link to audio)

Como dito, a demodulação AM-SC é igual à modulação, exceto pela filtragem final. Multiplicar um sinal duas vezes pela mesma portadora transfere o áudio de volta para a sua banda original (0-1000Hz) e cria uma nova cópia em torno de 6000Hz, que precisa ser suprimida pelo filtro passa-baixas.

Este é o código do demodulador AM-SC:

modulated = wave.open("amsc.wav", "r")

demod_amsc_ok = wave.open("demod_amsc_ok.wav", "w")
demod_amsc_nok = wave.open("demod_amsc_nok.wav", "w")
demod_amsc_nok2 = wave.open("demod_amsc_nok2.wav", "w")

for f in [demod_amsc_ok, demod_amsc_nok, demod_amsc_nok2]:
    f.setnchannels(1)
    f.setsampwidth(2)
    f.setframerate(44100)

for n in range(0, modulated.getnframes()):
    signal = struct.unpack('h', modulated.readframes(1))[0] / 32768.0
    carrier = math.cos(3000.0 * (n / 44100.0) * math.pi * 2)
    carrier_phased = math.sin(3000.0 * (n / 44100.0) * math.pi * 2)
    carrier_freq = math.cos(3100.0 * (n / 44100.0) * math.pi * 2)

    base = signal * carrier
    base_nok = signal * carrier_phased
    base_nok2 = signal * carrier_freq

    demod_amsc_ok.writeframes(struct.pack('h', base * 32767))
    demod_amsc_nok.writeframes(struct.pack('h', base_nok * 32767))
    demod_amsc_nok2.writeframes(struct.pack('h', base_nok2 * 32767))

A nova cópia do sinal em 6000Hz é indesejada, pode ser considerada ruído, e confunde alguns leitores. Eles simulam a demodulação numa planilha Excel e não entendem de onde vem esse componente de alta freqüência.

A figura a seguir mostra o espectro do áudio AM-SC demodulado, antes da filtragem passa-baixas. A parte amarela é a "parte boa":

Espectro do sinal AM-SC demodulado antes da filtragem final passa-baixas

É interessante usar um pouco de matemática para esclarecer este ponto. Isto aplica-se a AM e também a QAM. O sinal original de áudio, representado pela função f(t), é modulado (multiplicado) por uma cossenóide (a portadora). Assim, o sinal transmitido é f(t).cos(c.t). A demodulação transforma novamente o sinal para f(t).cos(c.t).cos(c.t). Se relembramos das identidades trigonométricas do colegial, podemos converter a última forma para f(t).[1+cos(2.c.t)] e finalmente para f(t)+[f(t).cos(2.c.t)].

Agora está claro (se você manja de fórmulas) que o sinal demodulado é uma soma de duas partes: o áudio f(t) original (que nós queremos) e o mesmo áudio modulado por uma portadora de 6000Hz (que é indesejável).

Como a freqüência da portadora em aplicações reais é muito mais alta que a largura de banda do sinal base, a parte indesejável cai numa freqüência tão alta que é fácil livrar-se dela usando um filtro passa-baixas extremamente simples. E mesmo que não fosse removida, ninguém ouviria, nem mesmo seria reprodutível por nenhum alto-falante ou fone de ouvido, cuja indutância funciona por si só como filtro.

Um pequeno grande problema da demodulação AM-SC: a onda da portadora gerada no lado receptor precisa ser exatamente igual à do transmissor, tanto em freqüência quanto em fase. Qualquer diferença destrói a demodulação.

No código Python exibido antes, simulei dois problemas de demodulação: portadora com fase errada (90 graus atrasada) e com freqüência errada (100Hz acima). Os resultados são muito ruins conforme você pode ouvir abaixo (já filtrados). A portadora fora de fase simplesmente não encontra o áudio original; freqüência errada distorce a ponto de tornar incompreensível:


(link to audio)


(link to audio)

É muito difícil gerar uma portadora local no receptor com as qualidades necessárias. É por isso que AM de radiodifusão adiciona a portadora ao sinal modulado, enquanto AM-SC é pouco empregada na prática. (*)

A propósito, vamos ver como funciona um receptor AM de radiodifusão. Nem dá pra chamar de demodulador de tão simples. Um receptor baseado na técnica abaixo é denominado "detector de envelope":

modulated = wave.open("am.wav", "r")

f = demod_am = wave.open("demod_am.wav", "w")
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(44100)

for n in range(0, modulated.getnframes()):
    signal = struct.unpack('h', modulated.readframes(1))[0] / 32768.0
    signal = abs(signal)
    demod_am.writeframes(struct.pack('h', signal * 32767))

Aprecie quão simples ele é: note a ausência de funções trigonométricas. AM de radiodifusão pode ser detectado por um simples diodo, que corta fora a parte negativa da onda. É por isso que você pode construir um rádio de galena, usando apenas um diodo e um capacitor. O diodo implementa a função abs() e o capacitor é o filtro passa-baixas. O diodo pode ser improvisado a partir de um cristal de galena, ou de uma gilete mais um Bombril.

Um receptor AM de radiodifusão não é obrigado a usar a detecção de envelope. Ele pode usar demodulação de verdade, com algumas vantagens: maior resistencia ao ruído e compatibilidade com sinais AM-SC/AM-SSB. A fase da portadora é fácil de encontrar, porque as rádios AM enviam a mesma no sinal transmitido.

Faltou conferir o resultado auditivo do detector de envelope:


(link to audio)

Depois da filtragem final:


(link to audio)

Há um ruído residual, provavelmente causado pelo detector abs(). Num rádio AM real, o ruído gerado pelo detector estaria numa freqüência tão alta que nem seria ouvido, e seria facilmente removido pelo filtro passa-baixas. (Lembrar sempre que estamos usando uma portadora de freqüência relativamente baixa, 3000Hz).

A técnica de modulação AM de radiodifusão — adicionar portadora ao sinal modulado — é matematicamente equivalente a adicionar um grande "DC bias" ou valor positivo fixo ao áudio original. Isto garante que a portadora seja sempre multiplicada por um valor positivo, e o sinal modulado está sempre em fase com a portadora. A fase do sinal AM não carrega nenhuma informação, e o receptor pode desprezá-la.

Já na modulação AM-SC, o conteúdo original é modulado "como está". Nos momentos em que o sinal de áudio tem polaridade negativa, a saída do transmissor tem polaridade oposta à portadora. Assim sendo, a fase do sinal AM-SC possui uma informação: a polaridade (positiva ou negativa) do áudio original.

Se você tentar demodular AM-SC com um detector (um diodo ou abs()), a fase e portanto a polaridade são perdidas. O resultado será muito distorcido, embora possa fazer lembrar o áudio original. Se era voz humana, soará como o Pato Donald, porque a demodulação incorreta dobra as freqüências e adiciona harmônicas.

Neste ponto, AM de radiodifusão deve estar parecendo muito mais funcional que AM-SC. Mas note que AM-SC ainda é mais eficiente — por "eficiente" entenda-se enviar mais conteúdo com a mesma largura de banda disponível — porque usa a fase para enviar informação útil, enquanto AM de rádio não usa.

Outro problema do AM de rádio é a forma que ele lida com freqüências muito baixas presentes no conteúdo original, como os graves de subwoofer de uma música. O "DC bias" tem de ser removido em algum ponto da demodulação, e o conteúdo de baixa freqüência será perdido na mesma leva. Já a modulação AM-SC não tem problemas com isso. Talvez isto não seja um problema tão grande em áudio (principalmente porque os ouvintes de AM não esperam alta fidelidade), mas é um grande problema para transmissão de vídeo.

Ambas as modulações AM e AM-SC desperdiçam banda, porque conforme dissemos bem no início do texto, elas produzem duas "cópias" do mesmo sinal, abaixo e acima da portadora. Além disso, AM de radiodifusão transmite a portadora o tempo todo, além do conteúdo. Podemos dizer que um transmissor AM gasta 75% da potência transmitindo "lixo" que nem sequer aumenta o alcance de recepção. Está lá apenas para viabilizar receptores de gilete e galena que ninguém realmente usa mais.

Mas há formas de melhorar muito a eficiência da modulação de amplitude. Descartamos AM de cara porque a transmissão contínua da portadora é ineficiente. Já que o sinal AM-SC modulado apresenta duas cópias, podemos simplesmente eliminar uma delas por filtragem, transmitindo apenas a outra. Esta modalidade é chamada AM-SSB (Suppressed sideband - banda lateral suprimida).

O espectro de modulação é obviamente diferente de AM-SC. A banda lateral abaixo de 3000Hz está praticamente extinta:

Espectro da modulação AM-SSB, banda inferior eliminada por filtragem

O áudio a seguir ilustra como soa uma modulação AM-SSB (banda inferior removida, banda superior mantida):


(link to audio)

Não soa muito diferente de AM-SC, e de fato o demodulador AM-SC é capaz de processar o sinal AM-SSB sem qualquer modificação:


(link to audio)

Ops, faltou a filtragem passa-baixas depois da demodulação:


(link to audio)

Transmitindo apenas uma cópia do conteúdo original, e não tendo de transmitir a portadora, o sinal AM-SSB é econômico tanto em banda quanto em energia. Ele tem uma segunda grande vantagem sobre AM-SC: veja o que acontece quando demodulamos um sinal AM-SSB com portadora local fora de fase:


(link to audio)

A voz foi recuperada perfeitamente. Assim, fica demonstrado que um receptor AM-SSB não precisa se preocupar com a fase da portadora. Apenas a freqüência é importante, e esta tem de ser muito bem controlada: qualquer desvio causa uma distorção semelhante à que constatamos em AM-SC:


(link to audio)

AM-SSB é a modulação padrão em radioamador, polícia, aviação, TV analógica, etc. E a mesma técnica é empregada em multiplexadores FDM e incontáveis outros dispositivos que precisam encaixar diversos sinais através de um único canal.

AM-SSB, assim como AM de radiodifusão, tem um problema com freqüências muito baixas no sinal original, independente da forma que é implementado. A TV analógica precisa que a baixa freqüência seja preservada, então ela emprega a modulação VSB (Vestigial Sideband - banda lateral vestigial). Em VSB, nem toda a banda lateral "excedente" é suprimida; fica o suficiente para que o conteúdo de baixa freqüência seja recebido como AM-SC, com transição para AM-SSB em freqüências mais altas.

Finalmemente, há uma questão de implementação do AM-SSB. É possível remover a banda lateral "excedente" com um filtro analógico, porém tal filtro seja difícil de construir (e portanto caro). Por outro lado, há técnicas de geração do sinal AM-SSB sem precisar filtrar a saída.

Transformada de Hilbert e AM-SSB

Uma técnica interessante, empregada por rádios com capacidade de processamento digital de sinais (DSP), é a transformada de Hilbert. Essa transformada muda a fase do áudio em 90 graus. Não é um simples atraso fixo; é uma mudança de fase sobre cada freqüência presente no áudio.

O áudio transformado parece exatamente igual ao original, porque nossos ouvidos não percebem diferenças de fase. Porém, graças às identidades trigonométricas, modular o sinal transformado com uma portadora em fase, e adicionar o resultado a um modulador AM-SC, cancela a "cópia" inferior, deixando apenas a banda superior. Obtemos assim um sinal AM-SSB perfeito sem qualquer filtragem.

A transformada de Hilbert é mais facilmente descrita e implementada no domínio da freqüência (usando FFT), mas também pode ser implementada como um filtro FIR (convolução no domínio do tempo). Tal filtro seria "não-causal": ele depende dos valores futuros do sinal para calcular uma saída no presente.

Isso parece absurdo, mas na prática se resolve colocando o filtro para trabalhar no "futuro do pretérito". O único problema é que a saída do filtro terá um certo atraso em relação à entrada — na nossa implementação, 1,13 milissegundo.

O seguinte programa Python implementa o modulador AM-SSB baseado em transformada de Hilbert, este último implementado como um filtro FIR.

#!/usr/bin/env python

import wave, struct, math, numpy

hlen = 500.0

hilbert_impulse = [ (1.0 / (math.pi * t / hlen)) \
			for t in range(int(-hlen), 0) ]
hilbert_impulse.extend([0])
hilbert_impulse.extend( [ (1.0 / (math.pi * t / hlen)) \
			for t in range(1, int(hlen+1)) ] )

hilbert_impulse = [ x * 1.0 / hlen for x in hilbert_impulse ]

baseband = wave.open("amssb_hilbert_orig.wav", "r")
amssbh = wave.open("amssb_hilbert.wav", "w")

for f in [amssbh]:
    f.setnchannels(1)
    f.setsampwidth(2)
    f.setframerate(44100)

base = []
base.extend([ struct.unpack('h',
                baseband.readframes(1))[0] / 32768.0 \
		for n in range(0, baseband.getnframes()) ])
base.extend([ 0 for n in range(0, int(hlen)) ])

base_hilbert = numpy.convolve(base[:], hilbert_impulse)

for n in range(0, len(base) - int(hlen)):
    carrier_cos = math.cos(3000.0 * (n / 44100.0) * math.pi * 2)
    carrier_sin = -math.sin(3000.0 * (n / 44100.0) * math.pi * 2)

    s1 = base[n] * carrier_cos
    # time-shifted signal because Hilbert transform is noncausal
    s2 = base_hilbert[n + int(hlen)] * carrier_sin

    signal_amssbh = s1 + s2

    amssbh.writeframes(struct.pack('h', signal_amssbh * 32767))

A análise de espectro mostra que o sinal AM-SSB gerado por este modulador é "melhor", ou seja, a banda inferior foi removida mais perfeitamente do que tinha sido com simples filtragem:

Espectro AM-SSB com Transformada de Hilbert, sem filtragem adicional

Produzir um sinal AM-SSB como esse, com duas portadoras defasadas em 90 graus, sugere que AM-SSB é na verdade uma forma especial de QAM análogo (QAM - Quadrature Amplitude Mmodulation ou Modulação por Amplitude e Quadratura). A modulação QAM permite transmitir dois sinais ao mesmo tempo, e de fato nós estamos enviando dois sinais no modulador AM-SSB Hilbert: o áudio original e o áudio transformado.

Ambos os sinais são interdependentes e equivalentes em conteúdo de informação. Então nós estamos, num certo sentido, enviando duas cópias da mesma coisa — muito embora a intenção seja a remoção de uma banda lateral, e não criar redundância. O ângulo da fase QAM não é fixo; ele gira o tempo todo, e medir a velocidade dessa rotação seria uma forma alternativa de recuperar o áudio original.

Encarar AM-SSB como se fosse QAM também explica porque o demodulador AM-SSB sempre consegue detectar o áudio original, mesmo com uma portadora fora de fase. Já que o mesmo áudio está sendo enviado duas vezes, modulado por duas portadoras ortogonais, o receptor sempre consegue demodular ou uma ou outra cópia (ou, mais tipicamente, uma mistura das duas).

(*) Um uso supreendente de AM-SC é na transmissão de FM stéreo. O segundo canal de áudio é codificado dentro do próprio canal de áudio, com uma portadora de 38KHz. Um sinal-piloto de 19KHz é transmitido o tempo todo de modo que o receptor encontre a fase da portadora. É claro, isto implica que um áudio FM não pode ter sons mais agudos que 19KHz.

e-mail icon