1. Sinais, Transformada de Fourier, Processos Aleatórios e Ruído
Sistemas de Comunicações — Apostila de Curso · UFSC · Prof. Laio Oriel Seman · Carga horária: 80h
Tópicos: Sinais Determinísticos e Aleatórios · Série e Transformada de Fourier · Densidade Espectral de Potência · Convolução e Filtragem · Processos Estocásticos · Ruído Térmico e AWGN · Função Q e Probabilidade de Erro
1.1 Antes de começar
Ao final, você deve conseguir escolher entre espectro de energia e PSD, prever o efeito de um filtro LIT e relacionar variância de ruído a uma probabilidade de erro. Diagnóstico: você sabe explicar por que uma senoide tem energia infinita, mas potência finita? Evidência mínima: reproduzir o laboratório e justificar, sem olhar o código, os gráficos de Fourier, Parseval, AWGN e BER.
1.2 Sinais e Energia/Potência
1.2.1 Classificação
Um sinal $x(t)$ é dito de energia se $0<E_x<\infty$, com:
Um sinal de energia finita tem necessariamente potência média nula (a energia se "dilui" ao longo do tempo infinito); um sinal de potência finita e não nula tem energia infinita. Essa dicotomia motiva duas ferramentas espectrais distintas: a Transformada de Fourier (sinais de energia) e a Densidade Espectral de Potência via autocorrelação (sinais de potência, Seção “Densidade Espectral de Potência de Processos Aleatórios”).
1.2.2 Sinais em comunicações
Em sistemas de comunicações, praticamente todo sinal de interesse é de potência (portadoras, ruído, sinais moduladas continuamente) — a Transformada de Fourier ainda é aplicada, mas de forma generalizada (via funções generalizadas/deltas de Dirac no domínio da frequência para sinais periódicos, Seção “Transformada de sinais periódicos (via trem de deltas espectrais)”) ou substituída pela densidade espectral de potência para processos aleatórios.
1.3 Série de Fourier
1.3.1 Dedução via ortogonalidade das exponenciais complexas
Um sinal periódico $x(t)=x(t+T_0)$, com $f_0=1/T_0$, pode ser expandido em uma base ortogonal de exponenciais complexas $\{e^{j2\pi nf_0t}\}_{n=-\infty}^{\infty}$. A ortogonalidade decorre de:
(para $n\neq m$, a integral de uma exponencial complexa completa sobre um número inteiro de períodos se anula — soma vetorial de fasores uniformemente distribuídos no círculo unitário). Postulando $x(t)=\sum_{n=-\infty}^{\infty}c_ne^{j2\pi nf_0t}$ e multiplicando ambos os lados por $e^{-j2\pi mf_0t}$, integrando sobre um período e usando a ortogonalidade:
Os coeficientes $c_n$ formam um espectro de linhas discreto em múltiplos de $f_0$. Para $x(t)$ real, $c_{-n}=c_n^*$ (simetria hermitiana) — consequência direta de $x(t)=x^*(t)$ aplicado à definição de $c_n$. Isso garante que a soma de pares $c_ne^{j2\pi nf_0t}+c_{-n}e^{-j2\pi nf_0t}=2|c_n|\cos(2\pi nf_0t+\angle c_n)$ seja sempre real.
1.3.3 Potência média e Teorema de Parseval para séries
Dedução: substitua $x(t)=\sum_nc_ne^{j2\pi nf_0t}$ em $|x(t)|^2=x(t)x^*(t)$, integre termo a termo sobre $T_0$; pela ortogonalidade (Seção “Dedução via ortogonalidade das exponenciais complexas”), só sobrevivem os termos com índices iguais, resultando em $\sum_n|c_n|^2$. Este resultado — a potência total é a soma das potências de cada harmônica — é a base para calcular a potência de sinais modulados AM/FM compostos por múltiplas componentes espectrais (arquivos 2 e 3).
1.4 Transformada de Fourier
1.4.1 Definição e transformada inversa
Para um sinal de energia $x(t)$ (não necessariamente periódico):
A Transformada de Fourier pode ser vista como o limite da Série de Fourier quando $T_0\to\infty$: o espaçamento entre linhas espectrais $f_0=1/T_0\to0$, o espectro discreto vira contínuo, e $c_n\cdot T_0 \to X(f)$.
Linearidade: $ax_1(t)+bx_2(t) \leftrightarrow aX_1(f)+bX_2(f)$ — direto da linearidade da integral.
Deslocamento no tempo: $x(t-t_0)\leftrightarrow X(f)e^{-j2\pi ft_0}$. Prova: substituição $u=t-t_0$ na integral de definição.
Deslocamento em frequência (modulação): $x(t)e^{j2\pi f_0t}\leftrightarrow X(f-f_0)$. Prova: substitua diretamente na definição, agrupe os expoentes. Esta propriedade é o coração matemático de toda a modulação (arquivos 2, 3, 5, 6): multiplicar um sinal por uma portadora $\cos(2\pi f_ct)$ desloca seu espectro para $\pm f_c$.
(decorrência direta de $\cos(2\pi f_ct)=\tfrac12(e^{j2\pi f_ct}+e^{-j2\pi f_ct})$ e da propriedade de deslocamento em frequência aplicada a cada termo).
Escalamento no tempo: $x(at)\leftrightarrow \dfrac{1}{|a|}X(f/a)$ — comprimir no tempo expande no espectro (relação de incerteza tempo-frequência).
Dualidade: se $x(t)\leftrightarrow X(f)$, então $X(t)\leftrightarrow x(-f)$ — consequência da simetria quase perfeita entre as fórmulas direta e inversa.
1.4.3 Pares de transformadas fundamentais
$x(t)$
$X(f)$
Uso
$\text{rect}(t/T)$ (pulso retangular)
$T\,\text{sinc}(fT)$
Formatação de pulso banda base (arquivo 4)
$\text{sinc}(2Wt)$
$\dfrac{1}{2W}\text{rect}(f/2W)$
Filtro ideal passa-baixas (dual do anterior)
$\delta(t)$
$1$
Resposta ao impulso
$1$
$\delta(f)$
Nível DC
$e^{-at}u(t)$, $a>0$
$\dfrac{1}{a+j2\pi f}$
Filtros RC
$e^{-\pi t^2}$ (gaussiana)
$e^{-\pi f^2}$ (autotransformada)
Pulsos gaussianos
$\cos(2\pi f_ct)$
$\tfrac12[\delta(f-f_c)+\delta(f+f_c)]$
Portadora
onde $\text{sinc}(x)\equiv\dfrac{\sin(\pi x)}{\pi x}$.
Este resultado é central para o arquivo 4 (banda base): todo pulso retangular no tempo (bit digital "cru") tem espectro infinito em largura de banda (o sinc decai apenas como $1/f$), motivando a necessidade de pulsos formatados (raised cosine) para limitar a banda ocupada.
1.4.5 Transformada de sinais periódicos (via trem de deltas espectrais)
Um sinal periódico não é de energia finita, mas admite Transformada de Fourier generalizada como um trem de impulsos espectrais, ponderados pelos coeficientes de Fourier:
Esta identidade unifica o tratamento espectral de sinais periódicos e não periódicos sob o mesmo formalismo de Fourier, essencial para tratar portadoras (sinais periódicos) moduladas por sinais de informação (tipicamente de banda finita, mas não necessariamente periódicos).
Dedução: aplique a Transformada de Fourier à definição de convolução, troque a ordem de integração (justificável para sinais absolutamente integráveis), e reconheça a integral interna como uma Transformada de Fourier deslocada:
Este resultado é a base de toda a teoria de filtragem linear em comunicações: um sistema LIT (linear invariante no tempo) com resposta ao impulso $h(t)$ processa um sinal de entrada multiplicando seu espectro por $H(f)$ — a resposta em frequência do sistema. Filtros passa-baixas, passa-faixa, e o próprio canal de comunicação são modelados dessa forma.
1.5.2 Produto no tempo ↔ Convolução em frequência (dual)
$$
x(t)y(t) \longleftrightarrow X(f)*Y(f)
$$
Por dualidade da Seção “Propriedades fundamentais (com dedução breve)”. Esta é a propriedade usada para derivar o espectro de um sinal modulado como convolução do espectro da informação com o espectro (impulsivo) da portadora — resultando no deslocamento espectral já visto na Seção “Propriedades fundamentais (com dedução breve)” aplicado agora de forma geral a portadoras moduladas em amplitude por um sinal arbitrário $m(t)$ (arquivo 2).
1.5.3 Teorema de Parseval/Rayleigh (energia no tempo = energia na frequência)
Dedução: escreva $E_x=\int x(t)x^*(t)\,dt$ e substitua $x^*(t)=\int X^*(f)e^{-j2\pi ft}\,df$ (conjugado da transformada inversa); troque a ordem de integração:
$|X(f)|^2$ é a densidade espectral de energia — mede como a energia do sinal se distribui em frequência, conceito que se generaliza para a densidade espectral de potência de processos aleatórios (Seção “Densidade Espectral de Potência de Processos Aleatórios”), central para calcular a potência de ruído que passa por um filtro receptor.
1.6 Sinais Passa-Faixa e Envelope Complexo
1.6.1 Motivação
Sinais de comunicação (moduladas AM/FM/PSK etc.) são tipicamente sinais passa-faixa: seu espectro está concentrado em torno de uma frequência de portadora $f_c$ alta, com largura de banda $B\ll f_c$. Simular tais sinais diretamente exigiria amostrar a $f_c$ (GHz em rádio), desperdiçando recursos computacionais. A representação de envelope complexo (ou banda base equivalente) resolve isso.
1.6.2 Dedução da representação em envelope complexo
Todo sinal passa-faixa real $s(t)$ pode ser escrito como:
onde $\tilde s(t)=A(t)e^{j\phi(t)}$ é o envelope complexo (ou sinal banda base equivalente), variando lentamente. Se o sinal RF real ocupa uma banda positiva de largura $B$ centrada em $f_c$, o envelope pode ser escolhido com suporte em $[-B/2,B/2]$. Assim, ele pode ser amostrado como sinal complexo a $F_s\ge B$, em vez de amostrar a portadora em GHz. Escrevendo $\tilde s(t)=s_I(t)+js_Q(t)$:
Dedução da forma I/Q: expandindo $\cos(2\pi f_ct+\phi)=\cos\phi\cos(2\pi f_ct)-\sin\phi\sin(2\pi f_ct)$ e identificando $s_I=A\cos\phi$, $s_Q=A\sin\phi$.
Esta decomposição é a base de todos os moduladores/demoduladores digitais em quadratura (QAM, PSK — arquivo 6): a informação é codificada em $(s_I,s_Q)$, e a portadora serve apenas de "veículo" de transporte para a faixa de RF.
1.6.3 Relação espectral entre passa-faixa e banda base
Se $\tilde S(f)$ é a transformada de $\tilde s(t)$, então (usando $s(t)=\tfrac12[\tilde s(t)e^{j2\pi f_ct}+\tilde s^*(t)e^{-j2\pi f_ct}]$, decorrente de $\text{Re}\{z\}=\tfrac12(z+z^*)$):
O espectro do sinal passa-faixa é o espectro banda base deslocado para $\pm f_c$ — simulações numéricas trabalham com $\tilde s(t)$ a uma taxa complexa determinada por sua largura de banda, reconstruindo $s(t)$ apenas quando necessário.
1.7 Processos Aleatórios
1.7.1 Definição
Um processo aleatório (ou estocástico) $X(t)$ é uma função cujo valor em cada instante $t$ é uma variável aleatória. Uma realização (ou amostra) $x(t)$ é uma função determinística específica, obtida de um experimento. Em comunicações, o ruído térmico, a informação transmitida (antes de ser conhecida) e o próprio canal (desvanecimento) são modelados como processos aleatórios.
1.7.2 Estacionariedade em sentido amplo (WSS)
Um processo é WSS (wide-sense stationary) se:
A média é constante no tempo: $E[X(t)]=\mu_X$ (não depende de $t$).
A autocorrelação depende apenas da diferença de tempos: $R_X(t_1,t_2) = E[X(t_1)X(t_2)] = R_X(t_1-t_2) \equiv R_X(\tau)$.
A maioria dos sinais de comunicação (ruído térmico, sinais digitais aleatórios de longo prazo) são modelados como WSS — hipótese que simplifica drasticamente a análise espectral (Seção “Densidade Espectral de Potência de Processos Aleatórios”).
1.7.3 Autocorrelação: propriedades e interpretação
$$
R_X(\tau) = E[X(t)X(t+\tau)]
$$
Propriedades fundamentais (demonstráveis diretamente da definição):
$R_X(0) = E[X^2(t)] = $ potência média do processo (sempre real e não-negativa).
$R_X(\tau) = R_X(-\tau)$ (simetria par, para processos reais — troque $t\to t-\tau$ na definição).
$|R_X(\tau)| \le R_X(0)$ (consequência da desigualdade de Cauchy-Schwarz aplicada a $X(t)$ e $X(t+\tau)$).
$R_X(\tau)\to \mu_X^2$ quando $\tau\to\infty$, se o processo "esquece" sua correlação com o passado distante (ergodicidade em correlação).
1.8 Densidade Espectral de Potência de Processos Aleatórios
Ideia da prova: considere uma janela truncada $X_T(t)=X(t)$ para $|t|<T/2$ e zero fora. Sua Transformada de Fourier é $X_T(f)$, e pelo Teorema de Parseval (Seção “Teorema de Parseval/Rayleigh (energia no tempo = energia na frequência)”), $\int|X_T(t)|^2dt=\int|X_T(f)|^2df$. Dividindo por $T$ e tomando $T\to\infty$ (com valor esperado), o lado esquerdo tende à potência média $P_X=R_X(0)$; mostra-se (via manipulação envolvendo a definição de $R_X$ e mudança de variáveis) que o lado direito, no limite, é exatamente $\int S_X(f)\,df$ com $S_X(f)$ definida como acima — a PSD é, portanto, "quanta potência por unidade de frequência" o processo carrega, generalizando $|X(f)|^2$ (válida só para sinais de energia) para sinais de potência.
1.8.2 Propriedades da PSD
$S_X(f)\ge0$ para todo $f$ (é uma densidade de potência, não pode ser negativa).
$S_X(f)=S_X(-f)$ para processos reais (pois $R_X(\tau)$ é real e par).
$P_X = R_X(0) = \displaystyle\int_{-\infty}^{\infty}S_X(f)\,df$ (potência total = área sob a PSD).
1.8.3 PSD na saída de um filtro LIT
Se $X(t)$ (WSS, PSD $S_X(f)$) passa por um filtro LIT com resposta em frequência $H(f)$, a PSD da saída $Y(t)=X(t)*h(t)$ é:
$$
\boxed{S_Y(f) = |H(f)|^2\,S_X(f)}
$$
Dedução (esboço): a autocorrelação da saída se relaciona com a de entrada por $R_Y(\tau)=R_X(\tau)*h(\tau)*h^*(-\tau)$ (resultado da definição $Y(t)=\int h(\alpha)X(t-\alpha)d\alpha$ substituída em $E[Y(t)Y(t+\tau)]$); aplicando Fourier a ambos os lados e usando a propriedade de convolução (Seção “Convolução no tempo ↔ Produto em frequência”) mais o fato de que a transformada de $h^*(-\tau)$ é $H^*(f)$: $S_Y(f)=S_X(f)H(f)H^*(f)=|H(f)|^2S_X(f)$. Este resultado é usado extensivamente para calcular a potência de ruído na saída de filtros receptores (Seção “Ruído Térmico e Ruído Branco Gaussiano (AWGN)”, e ao longo de toda a apostila).
1.9 Ruído Térmico e Ruído Branco Gaussiano (AWGN)
1.9.1 Origem física do ruído térmico
O movimento térmico aleatório dos elétrons em qualquer condutor com resistência $R$ a temperatura $T$ (Kelvin) produz uma tensão de ruído — o ruído de Johnson-Nyquist. A potência máxima disponível em uma carga casada, numa banda positiva de largura $B$, é $k_BTB$. Assim, sua densidade disponível unilateral é $k_BT$; na representação bilateral de um processo real, essa potência é dividida entre frequências positivas e negativas. Para frequências até a região de micro-ondas (aproximação clássica de Rayleigh-Jeans, válida quando $hf\ll k_BT$):
onde $k_B=1{,}380649\times10^{-23}\,\text{J/K}$ é a constante de Boltzmann. A PSD é constante em frequência até frequências extremamente altas (ordem de THz à temperatura ambiente) — daí o nome ruído branco (por analogia com a luz branca, que contém todas as frequências visíveis com intensidade comparável).
1.9.2 Modelo AWGN (Additive White Gaussian Noise)
O modelo padrão de canal em comunicações digitais é:
$$
\boxed{r(t) = s(t) + n(t)}
$$
onde $s(t)$ é o sinal transmitido e $n(t)$ é ruído branco Gaussiano aditivo, com:
Branco: $S_N(f) = N_0/2$ (constante em toda frequência de interesse). Aqui, $N_0$ é o parâmetro unilateral de densidade de ruído; portanto, a PSD bilateral do processo real é $N_0/2$. Para uma fonte térmica equivalente, $N_0=k_BT_{eq}$. A temperatura $T_{eq}$ representa o ruído acrescentado pelo receptor e não deve ser confundida, sem justificativa, com sua temperatura física.
Gaussiano: em cada instante $t$, $N(t)$ é uma variável aleatória Gaussiana de média zero (justificado pelo Teorema Central do Limite: o ruído é a soma de contribuições de um número enorme de elétrons e fontes microscópicas independentes).
Aditivo: soma-se ao sinal, não o multiplica nem distorce.
1.9.3 Potência de ruído após filtragem de banda $B$
Um filtro receptor ideal de largura de banda $B$ (passa-baixas ou passa-faixa) limita o ruído branco (infinito em potência total) a uma potência finita. Pela Seção “PSD na saída de um filtro LIT”, com $|H(f)|^2=1$ dentro da banda e $0$ fora:
(para um passa-baixas cujo corte positivo é $B$, isto é, que ocupa $-B\le f\le B$). Em um passa-faixa real, se $B$ denota a largura da banda em frequências positivas, existe também sua imagem simétrica em frequências negativas; a integral bilateral volta a fornecer $P_N=N_0B$. Esta convenção de $B$ é usada em todo o restante da apostila para calcular a relação sinal-ruído (SNR) na entrada do demodulador.
$\sigma^2$ é a variância (= potência média do ruído filtrado). Após um passa-baixas retangular, o ruído Gaussiano já não é independente em instantes arbitrários: sua autocorrelação tem forma sinc. Amostras Gaussianas são independentes quando sua correlação é nula; no filtro ideal acima, isso ocorre em separações inteiras de $1/(2B)$. No receptor digital, o filtro casado e a amostragem nos instantes de símbolo produzem as variáveis de decisão modeladas como i.i.d. quando os pulsos são ortogonais e o canal não introduz memória. Essa é a base do canal AWGN discreto usado nas simulações de BER (arquivos 5 e 6): cada símbolo recebido é o símbolo transmitido mais uma amostra de $\mathcal{N}(0,\sigma^2)$, independente das demais sob essas hipóteses.
1.10 Função Q e Probabilidade de Erro
1.10.1 Definição da função Q
A função Q é a probabilidade de cauda de uma Gaussiana padrão $\mathcal N(0,1)$:
Propriedades: $Q(0)=1/2$; $Q(-x)=1-Q(x)$; $Q(x)$ é monotonicamente decrescente; não tem forma fechada elementar (relacionada à função erro complementar, $Q(x)=\tfrac12\text{erfc}(x/\sqrt2)$).
1.10.2 Dedução da probabilidade de erro para detecção binária em AWGN
Considere a detecção de um bit binário: transmite-se $+A$ (bit 1) ou $-A$ (bit 0), o receptor observa $r=s+n$ com $n\sim\mathcal N(0,\sigma^2)$, e decide "1" se $r>0$, "0" caso contrário (detector de limiar ótimo para sinais antipodais equiprováveis, resultado que será justificado formalmente no arquivo 5 via detecção de máxima verossimilhança). Dado que "0" foi transmitido ($s=-A$), o erro ocorre se $r>0$, isto é, se $n>A$:
Esta é a fórmula-mãe de onde todas as expressões de BER (Bit Error Rate) do restante da apostila são derivadas (ASK, PSK, FSK, QAM — arquivos 5 e 6), trocando $A/\sigma$ pela distância euclidiana relevante entre símbolos da constelação, normalizada pelo desvio padrão do ruído.
1.10.3 Relação com $E_b/N_0$
Definindo a energia por bit $E_b = A^2T_b$ (para um pulso retangular de amplitude $A$ e duração $T_b$) e usando $\sigma^2=N_0B$ com $B\approx1/(2T_b)$ (banda de um filtro casado, resultado justificado no arquivo 5):
Esta é a forma em que a probabilidade de erro é universalmente reportada na literatura de comunicações digitais — em função da razão energia por bit sobre densidade espectral de ruído, $E_b/N_0$, permitindo comparar esquemas de modulação diferentes em bases equivalentes (mesma energia gasta por bit de informação).
1.11 Exercícios Resolvidos em Python
1.11.1 Protocolo computacional
Objetivo: verificar Fourier, Parseval, PSD de AWGN e a função $Q$. Reprodutibilidade: use np.random.default_rng(42), declare frequência de amostragem e convenção de FFT/PSD. Validação: compare energia nos dois domínios e BER simulada com a expressão analítica, informando a contagem de erros.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy importsignalfrom scipy.special importerfc# === Série de Fourier de uma onda quadrada ===defcoef_fourier_onda_quadrada(n,A=1.0):"""Coeficientes c_n de uma onda quadrada ímpar de amplitude A (só harmônicos ímpares)."""ifn==0:return0.0ifn%2==0:return0.0return(2*A)/(1j*np.pi*n)N_harm=15ns=np.arange(-N_harm,N_harm+1)cs=np.array([coef_fourier_onda_quadrada(n)forninns])t=np.linspace(-1,1,2000)f0=1.0x_reconstruida=np.real(sum(cs[i]*np.exp(1j*2*np.pi*ns[i]*f0*t)foriinrange(len(ns))))print(f"Reconstrução com {N_harm} harmônicos ímpares: max={x_reconstruida.max():.3f} (ideal=1.0, fenômeno de Gibbs)")# === Transformada de Fourier numérica: pulso retangular -> sinc ===defpulso_retangular(t,T):returnnp.where(np.abs(t)<=T/2,1.0,0.0)Fs=1000t_vec=np.arange(-5,5,1/Fs)T_pulso=1.0x=pulso_retangular(t_vec,T_pulso)X=np.fft.fftshift(np.fft.fft(x))/Fsf_vec=np.fft.fftshift(np.fft.fftfreq(len(t_vec),1/Fs))X_teorico=T_pulso*np.sinc(f_vec*T_pulso)erro_max=np.max(np.abs(np.abs(X)-np.abs(X_teorico)))print(f"\nErro máximo FFT numérica vs. T*sinc(fT) teórico: {erro_max:.4f}")# === Verificação de Parseval ===E_tempo=np.sum(np.abs(x)**2)/FsE_freq=np.sum(np.abs(X)**2)*(f_vec[1]-f_vec[0])print(f"\nEnergia no tempo: {E_tempo:.4f}")print(f"Energia na frequência: {E_freq:.4f} (Parseval)")# === Ruído AWGN: geração e verificação de PSD ===defgerar_awgn(N,N0_sobre_2,Fs):"""Gera N amostras de ruído branco com PSD bilateral N0/2 (variância = N0/2 * Fs)."""sigma=np.sqrt(N0_sobre_2*Fs)returnnp.random.normal(0,sigma,N)N0_2=1e-3Fs_ruido=10000n_amostras=100000ruido=gerar_awgn(n_amostras,N0_2,Fs_ruido)print(f"\nRuído AWGN gerado: variância medida={np.var(ruido):.6e}, esperada={N0_2*Fs_ruido:.6e}")f_psd,Pxx=signal.welch(ruido,Fs_ruido,nperseg=1024)print(f"PSD média medida: {np.mean(Pxx):.6e} (esperado ~{N0_2:.6e}, unilateral = 2x bilateral)")# === Função Q e probabilidade de erro binária ===defQ(x):return0.5*erfc(x/np.sqrt(2))A,sigma_ruido=1.0,0.3Pe=Q(A/sigma_ruido)print(f"\nP_e (detecção binária, A/sigma={A/sigma_ruido:.2f}): {Pe:.6e}")# Verificação por simulação Monte Carlon_bits=200000bits=np.random.randint(0,2,n_bits)s=np.where(bits==1,A,-A)r=s+np.random.normal(0,sigma_ruido,n_bits)bits_detectados=(r>0).astype(int)Pe_simulado=np.mean(bits_detectados!=bits)print(f"P_e simulado (Monte Carlo, {n_bits} bits): {Pe_simulado:.6e}")# === Curva de P_e vs Eb/N0 ===EbN0_dB=np.arange(0,13,1)EbN0_lin=10**(EbN0_dB/10)Pe_teorico=Q(np.sqrt(2*EbN0_lin))fig,ax=plt.subplots(figsize=(8,5))ax.semilogy(EbN0_dB,Pe_teorico,'b-o',label='$P_e=Q(\\sqrt{2E_b/N_0})$')ax.set_xlabel('$E_b/N_0$ (dB)')ax.set_ylabel('Probabilidade de erro de bit')ax.set_title('Curva de BER teórica — detecção binária antipodal em AWGN')ax.grid(True,which='both',alpha=0.3)ax.legend()plt.tight_layout()
Output:
Reconstrução com 15 harmônicos ímpares: max=1.180 (ideal=1.0, fenômeno de Gibbs)
Erro máximo FFT numérica vs. T*sinc(fT) teórico: 0.0004
Energia no tempo: 1.0000
Energia na frequência: 1.0000 (Parseval)
Ruído AWGN gerado: variância medida=9.973365e+00, esperada=1.000000e+01
PSD média medida: 1.991730e-03 (esperado ~1.000000e-03, unilateral = 2x bilateral)
P_e (detecção binária, A/sigma=3.33): 4.290603e-04
P_e simulado (Monte Carlo, 200000 bits): 3.650000e-04
Reconstrução de Fourier: overshoot de ~9% acima da amplitude ideal (fenômeno de Gibbs), típico de truncar uma série de Fourier de um sinal descontínuo.
FFT numérica vs. sinc teórico: erro pequeno (efeitos de janelamento/discretização).
Parseval: energia no tempo e na frequência coincidem.
Ruído AWGN: variância medida ≈ variância teórica.
$P_e$ teórico (fórmula Q) e $P_e$ simulado (Monte Carlo) devem coincidir dentro da incerteza estatística de $\sqrt{P_e(1-P_e)/n_{bits}}$.
Curva BER: decaimento exponencial característico, ~1 década a cada ~2 dB de $E_b/N_0$ adicional nessa região.
1.12 Lista de Exercícios Propostos
E1. Calcule a Série de Fourier (coeficientes $c_n$) de um trem de pulsos retangulares periódico, com período $T_0=1\,\text{ms}$, largura de pulso $\tau=0{,}2\,\text{ms}$ e amplitude $A=5\,\text{V}$.
E2. Usando a propriedade de deslocamento em frequência, determine o espectro $X(f)$ de $x(t)=\text{sinc}(2Wt)\cos(2\pi f_ct)$, com $f_c\gg W$. Esboce o resultado.
E3. Demonstre a propriedade de escalamento no tempo $x(at)\leftrightarrow\frac{1}{|a|}X(f/a)$ a partir da definição da Transformada de Fourier (faça a substituição de variável explicitamente, tratando os casos $a>0$ e $a<0$).
E4. Um filtro passa-baixas ideal tem $H(f)=\text{rect}(f/2B)$. Um sinal de entrada tem PSD $S_X(f)=S_0$ (constante, ruído branco) para todo $f$. Calcule a potência do sinal na saída do filtro.
E5. Mostre que a autocorrelação de um processo WSS satisfaz $R_X(\tau)=R_X(-\tau)$ partindo da definição $R_X(\tau)=E[X(t)X(t+\tau)]$ e da propriedade de estacionariedade.
E6. Um resistor de $R=50\,\Omega$ está a temperatura ambiente $T=290\,\text{K}$. Calcule a potência de ruído térmico disponível em uma banda $B=10\,\text{MHz}$ (use $P_N=k_BTB$, forma equivalente à da Seção “Potência de ruído após filtragem de banda $B$” para ruído unilateral).
E7. Calcule $Q(0)$, $Q(1)$, $Q(2)$, $Q(3)$ numericamente (ou usando tabela) e verifique a relação $Q(-x)=1-Q(x)$ calculando também $Q(-1)$.
E8. Para um sistema de detecção binária antipodal com $A=2\,\text{V}$ e ruído com $\sigma=0{,}5\,\text{V}$, calcule $P_e$. Se a amplitude for dobrada para $A=4\,\text{V}$ (mantendo $\sigma$), por qual fator aproximado $P_e$ diminui (expresse em ordens de grandeza, usando a natureza exponencial da cauda de $Q(x)$ para $x$ grande)?
E9. Escreva o sinal passa-faixa $s(t)=3\cos(2\pi f_ct)-4\sin(2\pi f_ct)$ na forma envelope-fase $A(t)\cos(2\pi f_ct+\phi(t))$, determinando $A$ e $\phi$ (constantes, neste caso).
E10 (desafio). Um sinal aleatório binário NRZ (Não-Retorno-a-Zero) transmite $+A$ ou $-A$ com igual probabilidade a cada intervalo de bit $T_b$, de forma independente entre intervalos. Mostre que sua autocorrelação é $R_X(\tau) = A^2\left(1-\dfrac{|\tau|}{T_b}\right)$ para $|\tau|<T_b$ e $R_X(\tau)=0$ para $|\tau|\ge T_b$ (dica: para $|\tau|<T_b$, considere a probabilidade de que $\tau$ "caia" dentro do mesmo intervalo de bit vs. em um intervalo adjacente). Em seguida, aplique o Teorema de Wiener-Khinchin para obter $S_X(f)=A^2T_b\,\text{sinc}^2(fT_b)$.
E11 (desafio). Um sinal passa-faixa real ocupa a faixa positiva de $f_c-B/2$ a $f_c+B/2$, com $f_c=1\,\text{GHz}$ e $B=1\,\text{MHz}$. Compare a taxa mínima para amostrar diretamente o sinal real RF e para amostrar o envelope complexo cujo suporte é $[-B/2,B/2]$. Quantas amostras complexas por segundo são poupadas?
E12. Verifique a identidade $\cos(2\pi f_ct+\phi) = \cos\phi\cos(2\pi f_ct)-\sin\phi\sin(2\pi f_ct)$ usando a fórmula de adição de ângulos, e identifique $s_I$ e $s_Q$ para $A=5$, $\phi=60°$.
1.13 Gabarito
E1. $c_n = \dfrac{1}{T_0}\displaystyle\int_{-\tau/2}^{\tau/2}A\,e^{-j2\pi nf_0t}\,dt = \dfrac{A}{T_0}\left[\dfrac{e^{-j2\pi nf_0t}}{-j2\pi nf_0}\right]_{-\tau/2}^{\tau/2} = \dfrac{A}{n\pi}\sin(\pi nf_0\tau)$ para $n\neq0$, e $c_0=A\tau/T_0$ (valor médio, = duty cycle × amplitude). Reescrevendo com a função sinc: $c_n = \dfrac{A\tau}{T_0}\,\text{sinc}(nf_0\tau)$. Numericamente, $f_0=1/T_0=1000\,\text{Hz}$, $f_0\tau=0{,}2$:
E2. $\text{sinc}(2Wt)\leftrightarrow\frac{1}{2W}\text{rect}(f/2W)$ (par da Seção “Pares de transformadas fundamentais”). Pela propriedade de modulação (Seção “Propriedades fundamentais (com dedução breve)”), multiplicar por $\cos(2\pi f_ct)$ desloca o espectro para $\pm f_c$ com fator $1/2$:
Esboço: dois retângulos de largura $2W$ e altura $1/(4W)$, centrados em $f=\pm f_c$ — não se sobrepõem pois $f_c\gg W$.
E3. Caso $a>0$: substituindo $u=at$ ($du=a\,dt$) em $X_a(f)=\int x(at)e^{-j2\pi ft}dt$: $X_a(f)=\int x(u)e^{-j2\pi f(u/a)}\frac{du}{a} = \frac{1}{a}\int x(u)e^{-j2\pi(f/a)u}du = \frac{1}{a}X(f/a)$. Caso $a<0$: com $a=-|a|$, a substituição $u=at$ inverte os limites de integração ($t:-\infty\to\infty$ corresponde a $u:\infty\to-\infty$), introduzindo um sinal negativo extra que cancela com o $1/a$ negativo, resultando em $\frac{1}{|a|}X(f/a)$. Combinando os dois casos: $\boxed{x(at)\leftrightarrow\frac{1}{|a|}X(f/a)}$.
E4. Pela Seção “PSD na saída de um filtro LIT”, $S_Y(f)=|H(f)|^2S_X(f) = S_0$ para $|f|<B$ e $0$ fora. Potência de saída:
$$
P_Y = \int_{-B}^{B}S_0\,df = \boxed{2S_0B}
$$
E5. Por definição, $R_X(-\tau)=E[X(t)X(t-\tau)]$. Fazendo a mudança de variável $t'=t-\tau$ (ou seja, $t=t'+\tau$): $R_X(-\tau)=E[X(t'+\tau)X(t')]=E[X(t')X(t'+\tau)]$. Como o processo é WSS, esta expectativa não depende de qual instante $t'$ se escolhe, e por definição é exatamente $R_X(\tau)$. Logo $\boxed{R_X(-\tau)=R_X(\tau)}$ — simetria par.
(Nota: esta é a forma unilateral $k_BTB$, equivalente a integrar a PSD bilateral $N_0/2=k_BT/2$ de $-B$ a $B$, que dá exatamente $k_BTB$ — consistente com a Seção “Potência de ruído após filtragem de banda $B$”.)
E7. Valores numéricos (via tabela ou scipy.special.erfc): $Q(0)=0{,}5$; $Q(1)\approx0{,}1587$; $Q(2)\approx0{,}0228$; $Q(3)\approx0{,}00135$. Verificação: $Q(-1) = 1-Q(1) = 1-0{,}1587 = 0{,}8413$ — consistente com a definição, pois $Q(-1)=P(Z>-1)=P(Z<1)=1-P(Z>1)=1-Q(1)$.
$$
\boxed{P_e\approx3{,}17\times10^{-5}\ \to\ P_e'\approx6{,}22\times10^{-16}\qquad\text{(redução de aproximadamente 11 ordens de grandeza)}}
$$
Isso ilustra a natureza extremamente não-linear (decaimento tipo $e^{-x^2/2}$) da função $Q$: dobrar a distância entre símbolos (ou, equivalentemente, quadruplicar a energia) reduz $P_e$ de forma dramática — motivo pelo qual pequenos aumentos de $E_b/N_0$ produzem grandes ganhos de confiabilidade (visível no "joelho" das curvas de BER, arquivos 5 e 6).
E9. Comparando com $s(t)=s_I\cos(2\pi f_ct)-s_Q\sin(2\pi f_ct)$: $s_I=3$, $s_Q=4$. Logo:
E10 (desafio). Para $|\tau|<T_b$: com probabilidade $1-|\tau|/T_b$, os instantes $t$ e $t+\tau$ caem no mesmo intervalo de bit (mesmo valor $\pm A$, produto $=A^2$); com probabilidade $|\tau|/T_b$, caem em intervalos adjacentes distintos e independentes (valores independentes $\pm A$ cada, produto médio $=E[\pm A]\cdot E[\pm A]=0\cdot0=0$, pois cada bit tem média zero). Logo:
Para $|\tau|\ge T_b$, os dois instantes estão sempre em intervalos de bit diferentes (e, assumindo bits i.i.d., não-correlacionados), logo $R_X(\tau)=0$. Isso confirma a forma triangular enunciada. Aplicando Wiener-Khinchin (Seção “Teorema de Wiener-Khinchin”), a transformada de uma função triangular de base $2T_b$ e altura $A^2$ é (resultado padrão, obtido por integração direta ou reconhecendo o triângulo como a autoconvolução de um retângulo de largura $T_b$):
Este é o espectro padrão de um sinal digital NRZ aleatório — um lóbulo principal de largura $2/T_b$ com lóbulos laterais decaindo como $1/f^2$, resultado usado extensivamente no arquivo 4 (banda base).
E11 (desafio). Amostragem direta do sinal real: a maior frequência é $f_{\max}=f_c+B/2=1{,}0005$ GHz, logo a taxa mínima uniforme é
A simulação via envelope complexo exige cerca de 2000 vezes menos amostras. Técnicas especializadas de subamostragem passa-faixa podem reduzir a taxa de uma representação RF sob condições estritas de filtragem e sincronismo, mas o envelope complexo é a representação robusta e usual em simulações de comunicação.
E12. Pela fórmula de adição, $\cos(2\pi f_ct+\phi)=\cos(2\pi f_ct)\cos\phi-\sin(2\pi f_ct)\sin\phi$, que reescrita na forma-padrão $s_I\cos(2\pi f_ct)-s_Q\sin(2\pi f_ct)$ identifica $s_I=A\cos\phi$ e $s_Q=A\sin\phi$ (com $A$ a amplitude, aqui implicitamente $1$ na identidade trigonométrica pura). Para $A=5$, $\phi=60°$:
Sistemas de Comunicações — Apostila de Curso
Tópicos: Modelo Completo do Sistema · Recursos e Métricas Fundamentais · Decibéis e Orçamento de Enlace · Ruído e Cascata de Estágios · Capacidade de Shannon · Modulações Analógicas vs. Digitais · Exercícios em Python
2.1 Antes de começar
Ao final, você deve conseguir seguir informação, potência e ruído por toda a cadeia, fechar um orçamento de enlace e distinguir taxa, banda, SNR e $E_b/N_0$. Diagnóstico: adicionar 3 dB sempre dobra alguma grandeza? Diga quando isso vale para potência e amplitude. Evidência mínima: justificar cada termo de um orçamento de enlace e identificar qual bloco limita a margem.
2.2 Modelo Completo de um Sistema de Comunicações
Um sistema de comunicação transfere informação de uma fonte a um destino por meio de um meio físico imperfeito. O modelo completo envolve uma cadeia de etapas:
$$
H(X) = -p\log_2 p - (1-p)\log_2(1-p) = h_2(p)
$$
Para $p=1/2$, $H=1$ bit/símbolo (máximo). Para $p=0{,}01$, $H\approx0{,}0808$ bits/símbolo.
Para blocos longos de uma fonte discreta sem memória, nenhuma codificação sem perdas univocamente decodificável pode ter comprimento médio abaixo de $H(X)$, e existem códigos cujo comprimento médio por símbolo se aproxima arbitrariamente de $H(X)$:
$$
\boxed{H(X)\le \bar L < H(X)+1\quad\text{(código símbolo a símbolo)},\qquad
\bar L_n/n\to H(X)\quad\text{(blocos longos)}.}
$$
Assim, $H(X)$ é um ínfimo assintótico, não necessariamente uma taxa exatamente atingível por um código finito.
$$
G = \begin{bmatrix}1&0&0&0&1&1&0\\0&1&0&0&1&0&1\\0&0&1&0&0&1&1\\0&0&0&1&1&1&1\end{bmatrix},\quad
H = \begin{bmatrix}1&1&0&1&1&0&0\\1&0&1&1&0&1&0\\0&1&1&1&0&0&1\end{bmatrix}
$$
import numpy as npimport matplotlib.pyplot as pltn_vals=np.arange(1,17)snr_dB=6.02*n_vals+1.76fig,ax=plt.subplots(figsize=(8,5))ax.plot(n_vals,snr_dB,'o-',color='#2563eb',lw=2,markersize=6,label='$\\text{SNR}_q \\approx 6{,}02n + 1{,}76$ dB')ax.axhline(60,color='#dc2626',ls='--',alpha=0.6,label='60 dB (CD)')ax.axhline(48,color='#047857',ls='--',alpha=0.6,label='48 dB (voz)')ax.set_xlabel('Bits $n$');ax.set_ylabel('SNR (dB)')ax.set_title('SNR de Quantização PCM vs. Bits');ax.set_xticks(n_vals)ax.grid(alpha=0.3);ax.legend();plt.tight_layout()print("n | SNR_q (dB)")fornin[8,12,14,16]:print(f"{n} | {6.02*n+1.76:.2f}")
A margem requerida $M_{\text{req}}$ é um critério de projeto para acomodar desvanecimento e incertezas; não é uma perda física que também deva ser embutida em $P_r$. O enlace atende ao projeto quando $M_{\text{res}}\ge0$.
Perda de polarização: $L_{\text{pol}} = -20\log_{10}|\cos\theta|$.
$L_{fs}=120{,}05\,\text{dB}$ e $\text{EIRP}=35\,\text{dBm}$ se as perdas forem todas contabilizadas depois da antena transmissora. Logo $P_r=35+15-120{,}05-3=-73{,}05\,\text{dBm}$. A margem disponível é $26{,}95\,\text{dB}$ e a residual após reservar 10 dB é $16{,}95\,\text{dB}$. Se parte dos 3 dB estiver antes da antena, deve-se retirá-la da EIRP e não subtraí-la novamente.
PYTHON
import numpy as npimport matplotlib.pyplot as pltc,f=3e8,2.4e9wavelength=c/fPt,Gt,Gr,Lc,margin,Psens=20,15,15,3,10,-100dist_km=np.logspace(-1,3,500)dist_m=dist_km*1e3Lfs=20*np.log10(4*np.pi*dist_m/wavelength)Pr=Pt+Gt+Gr-Lfs-Lcmargin_available=Pr-Psensmargin_residual=margin_available-marginfig,axes=plt.subplots(2,1,figsize=(9,8))axes[0].loglog(dist_km,10**(Pr/10)*1e3,color='#2563eb',lw=2,label='$P_r(d)$')axes[0].axhline(10**(Psens/10)*1e3,color='#dc2626',ls='--',lw=1.5,label=f'Sens ({Psens} dBm)')axes[0].set_xlabel('Distância $d$ (km)');axes[0].set_ylabel('Potência (mW)')axes[0].set_title('Orçamento de Enlace: $P_r$ vs. Distância');axes[0].grid(which='both',alpha=0.3)axes[0].legend()axes[1].semilogx(dist_km,margin_residual,color='#047857',lw=2)axes[1].axhline(0,color='#dc2626',ls='--',lw=1.5,label='Margem zero')axes[1].set_xlabel('Distância $d$ (km)');axes[1].set_ylabel('Margem (dB)')axes[1].set_title('Margem residual após reservar 10 dB');axes[1].grid(which='both',alpha=0.3)axes[1].legend();axes[1].axhspan(-2,2,alpha=0.15,color='yellow')plt.tight_layout()d_max=dist_km[np.where(margin_residual>0)[0][-1]]print(f"Distância máxima: {d_max:.1f} km")
Output:
Distância máxima: 70.1 km
2.5 Ruído — Fundamentos Físicos Completos
2.5.1 Ruído térmico — Dedução de Johnson-Nyquist
Movimento térmico aleatório de portadores. Pela teoria de Nyquist (1928):
DSB-SC: um detector coerente ideal preserva a SNR quando entrada e saída são comparadas usando bandas de ruído equivalentes. Um aparente fator 2 surge se a entrada contabiliza duas bandas laterais de ruído e a saída apenas uma banda-base; é uma mudança de banda de referência, não criação de SNR.
FM: para mensagem senoidal e a convenção de $N_0$ desta apostila,
Se a entrada for medida na banda RF $B_r$, use $\text{SNR}_{out}=(3/2)\beta^2(B_r/W)\text{SNR}_{in,B_r}$. FM troca banda por SNR, mas a comparação só é válida depois de declarar a banda de referência.
PYTHON
import numpy as npimport matplotlib.pyplot as plt# Cascata de ruídofig,ax=plt.subplots(figsize=(8,5))stages=['LNA','Mixer','RF Amp','IF Amp','Demod.']F_lin=np.array([1.259,5.012,6.310,3.162,10.000])G_lin=np.array([15.85,0.5,3.162,10.0,1.0])F_cum=np.zeros(5)F_cum[0]=F_lin[0]foriinrange(1,5):F_cum[i]=F_cum[i-1]+(F_lin[i]-1)/np.prod(G_lin[:i])NF_cum=10*np.log10(F_cum)NF_dB=10*np.log10(F_lin)G_dB=10*np.log10(G_lin)x=np.arange(5)width=0.6ax.bar(x,NF_cum,width,color='#2563eb',edgecolor='white',lw=1.2)ax.set_xlabel('Estágio');ax.set_ylabel('NF acumulada (dB)')ax.set_title('Figura de Ruído em Cascata');ax.set_xticks(x);ax.set_xticklabels(stages)ax.grid(axis='y',alpha=0.3)fori,nfinenumerate(NF_cum):ax.annotate(f'{nf:.1f} dB',(i,nf),textcoords='offset points',xytext=(0,10),ha='center',fontsize=9,color='#dc2626',weight='bold')plt.tight_layout()print("Estágio | NF(dB) | G(dB) | NF_acum(dB)")foriinrange(5):print(f"{stages[i]:7s} | {NF_dB[i]:6.1f} | {G_dB[i]:6.1f} | {NF_cum[i]:11.1f}")
Dedução: Discretização de Nyquist ($2B$ canais/seg), cada um $Y_i=X_i+Z_i$, $Z\sim\mathcal{N}(0,\sigma^2)$. Capacidade maximizada com entrada gaussiana:
$$
C_i = \tfrac{1}{2}\log_2\!\left(1+\frac{P_s}{\sigma^2}\right),\quad C = B\log_2\!\left(1+\frac{P}{N_0B}\right)
$$
import numpy as npimport matplotlib.pyplot as plteta=np.linspace(0.01,10,500)EbN0_dB=10*np.log10((2**eta-1)/eta)EbN0_min=10*np.log10(np.log(2))fig,ax=plt.subplots(figsize=(8,5))ax.plot(eta,EbN0_dB,color='#2563eb',lw=2.5,label='Limite de Shannon')ax.axhline(EbN0_min,color='#dc2626',ls='--',lw=1.5,label=f'Limite inf: {EbN0_min:.2f} dB')ax.axvline(1,color='#64748b',ls='--',alpha=0.5,label='$\\eta=1$')ax.set_xlabel('Eficiência $\\eta$ (bit/s/Hz)');ax.set_ylabel('$E_b/N_0$ mín. (dB)')ax.set_title('Limite de Shannon: $E_b/N_0$ vs Eficiência Espectral');ax.set_xlim(0,10);ax.set_ylim(-2,16)ax.grid(alpha=0.3);ax.legend()ax.annotate('BPSK ($\\eta=1$)',xy=(1,0),xytext=(2.5,3),arrowprops=dict(arrowstyle='->'),fontsize=9,color='#dc2626')plt.tight_layout()
2.6.7 Limitações práticas
Códigos infinitos $\Rightarrow$ latência infinita. Cada $0{,}5$ dB de aproximação custa $\sim 10\times$ em complexidade.
2.7 Modulações Analógicas vs. Digitais — Comparação Rigorosa
Acima do limiar. Abaixo de $\sim10\,\text{dB}$, colapso catastrófico (threshold effect).
2.7.3 PCM vs. PAM vs. DM
PAM
PCM
DM
Tipo
Analógico
Digital
Digital
Amplitude
Contínua
$n$ bits
1-bit
Banda
$f_s/2$
$nf_s/2$
Alta
Imunidade
Baixa
Alta
Média
SNR
Limitado
$6n+1{,}76$ dB
$\sim10\log_{10}(3f_s/2f_m)$
2.7.4 Vantagens digitais
Regeneração — sem acúmulo de ruído
Criptografia — dados nativamente cifráveis
Multiplexação — TDM natural
Correção de erros — BER arbitrariamente baixo
Flexibilidade — mesma infraestrutura para voz/dados/vídeo
2.7.5 Desvantagens digitais
Banda — geralmente maior
Complexidade — A/D, codificação, sincronismo
Latência — codificação/decodificação
SNR mínimo — limiar de demodulação
2.7.6 Tabela comparativa
AM
DSB-SC
FM
BPSK
QPSK
16-QAM
$\eta$
$f_m/2f_m$
$f_m/2f_m$
$f_m/2f_m(1+\beta)$
$0{,}5$
$1{,}0$
$2{,}0$
$E_b/N_0$ BER=$10^{-5}$
—
—
$\sim10$ dB
$9{,}6$ dB
$12{,}6$ dB
$19{,}6$ dB
Imunidade
Baixa
Média
Alta
Média
Média
Baixa
Regenerável
Não
Sim
Não
Sim
Sim
Sim
2.8 Exercícios Resolvidos em Python
2.8.1 Protocolo computacional
Objetivo: fechar orçamentos de enlace, quantização, cascatas de ruído e limites de Shannon. Unidades: faça conversões dB/dBm apenas nas fronteiras do cálculo e mantenha grandezas lineares internamente. Validação: confira casos-limite, margem do enlace e o limite $E_b/N_0\ge\ln2$.
2.8.2 Exercício 1: Orçamento de enlace com fade margins
PYTHON
import numpy as npimport matplotlib.pyplot as pltc,f=3e8,5.8e9wavelength=c/fEIRP=30+12-1# Pt=30 dBm, Gt=12 dBi, Lcable=1 dBGr,Lcr,NF=20,1,3Psens=-174+10*np.log10(1e6)+NF+10# B=1 MHz, SNR_req=10 dBdist_km=np.logspace(0,2,500)Lfs=20*np.log10(4*np.pi*dist_km*1e3/wavelength)fig,axes=plt.subplots(2,2,figsize=(12,9))margins=[0,5,10,15]colors=['#2563eb','#047857','#dc2626','#9333ea']fori,mfinenumerate(margins):Pr=EIRP+Gr-Lfs-Lcr-mfax=axes[i//2,i%2]ax.semilogx(dist_km,Pr,'o-',label=f'$P_r$ (M={mf} dB)',color=colors[i])ax.axhline(Psens,color='k',ls='--',alpha=0.6,label='Sens.')ax.set_xlabel('Distância $d$ (km)');ax.set_ylabel('$P_r$ (dBm)')ax.set_title(f'Margem Fade = {mf} dB');ax.grid(alpha=0.3);ax.legend(fontsize=8)axes[1,1].semilogx(dist_km,EIRP+Gr-Lfs-Lcr-Psens,'o-',color='#2563eb')axes[1,1].axhline(0,color='r',ls='--')axes[1,1].set_xlabel('Distância $d$ (km)');axes[1,1].set_ylabel('Margem (dB)')axes[1,1].set_title('Margem de Enlace');axes[1,1].grid(alpha=0.3)plt.tight_layout()print("M(fade)| Dist. máx (km)")formfinmargins:Pr_tmp=EIRP+Gr-Lfs-Lcr-mfmask=Pr_tmp>Psensprint(f" {mf:2d} dB | {dist_km[mask][-1]:7.1f} km"ifnp.any(mask)elsef" {mf:2d} dB | --")
Output:
M(fade)| Dist. máx (km)
0 dB | 100.0 km
5 dB | 100.0 km
10 dB | 100.0 km
15 dB | 81.6 km
2.8.3 Exercício 2: SNR de quantização PCM — Teórico vs. Simulado
PYTHON
import numpy as npimport matplotlib.pyplot as pltn_theo=np.arange(2,17)snr_theo=6.02*n_theo+1.76np.random.seed(42)n_sim=[4,6,8,10,12,14]snr_sim=[]fornbinn_sim:sig=np.random.uniform(-0.5,0.5,10**6)step=1.0/(2**nb)quant=np.round(sig/step)*steperr=sig-quantsnr_sim.append(10*np.log10(np.mean(sig**2)/np.mean(err**2)))fig,ax=plt.subplots(figsize=(8,5))ax.plot(n_theo,snr_theo,'-',color='#2563eb',lw=2.5,label='$6{,}02n+1{,}76$ dB')ax.scatter(n_sim,snr_sim,color='#dc2626',s=80,zorder=3,label='Monte Carlo',edgecolors='white')ax.set_xlabel('Bits $n$');ax.set_ylabel('SNR (dB)')ax.set_title('SNR de Quantização PCM: Teórico vs. Simulado')ax.legend();ax.grid(alpha=0.3)forni,siinzip(n_sim,snr_sim):ax.annotate(f' {si:.1f} dB',(ni,si),textcoords='offset points',xytext=(-25,8),fontsize=9,color='#dc2626',weight='bold')plt.tight_layout()
2.8.4 Exercício 3: Cascata de ruído — LNA/mixer/RF amp
PYTHON
import numpy as npimport matplotlib.pyplot as pltstages=['LNA','Mixer','RF Amp','IF Amp','Demod.']F=np.array([1.259,5.012,6.310,3.162,10.000])# 1,7,8,5,10 dBG=np.array([15.85,0.5,3.162,10.0,1.0])# 12,-3,5,10,0 dBF_cum=np.zeros(5)F_cum[0]=F[0]foriinrange(1,5):F_cum[i]=F_cum[i-1]+(F[i]-1)/np.prod(G[:i])NF_cum=10*np.log10(F_cum)B=1e6Psens=-174+10*np.log10(B)+NF_cum[-1]+10fig,ax=plt.subplots(figsize=(8,5))x=np.arange(5)ax.bar(x,NF_cum,0.6,color='#2563eb',edgecolor='white',lw=1.2)ax.axhline(-174+10*np.log10(B),color='#dc2626',ls='--',alpha=0.6,label='Piso ruído')ax.set_xlabel('Estágio');ax.set_ylabel('NF acumulada (dB)')ax.set_title('Figura de Ruído em Cascata');ax.set_xticks(x);ax.set_xticklabels(stages)ax.grid(axis='y',alpha=0.3)ax.legend()fori,nfinenumerate(NF_cum):ax.annotate(f'{nf:.1f}',(i,nf),textcoords='offset points',xytext=(0,10),ha='center',fontsize=9,color='#dc2626',weight='bold')plt.tight_layout()print(f"Sensibilidade do receptor: {Psens:.1f} dBm")
Output:
Sensibilidade do receptor: -100.4 dBm
2.8.5 Exercício 4: Capacidade de Shannon vs. Eb/N0
PYTHON
import numpy as npimport matplotlib.pyplot as plteta=np.linspace(0.01,10,500)EbN0_Shannon=(2**eta-1)/etaEbN0_Shannon_dB=10*np.log10(EbN0_Shannon)# BER para BPSK, QPSK, 16-QAM (aproximações)from scipy.stats importnormEbN0_linear_BPSK=np.linspace(0.01,20,500)EbN0_dB_BPSK=10*np.log10(EbN0_linear_BPSK)from scipy.special importerfBER_BPSK=0.5*(1-erf(np.sqrt(EbN0_linear_BPSK)))fig,axes=plt.subplots(1,2,figsize=(14,5))# Esquerda: Eb/N0 vs etaaxes[0].plot(eta,EbN0_Shannon_dB,color='#2563eb',lw=2.5,label='Limite Shannon')axes[0].axhline(-1.59,color='#dc2626',ls='--',label='-1.59 dB')axes[0].axvline(1,color='#64748b',ls='--',alpha=0.5,label='$\\eta=1$')axes[0].set_xlabel('Eficiência $\\eta$ (bit/s/Hz)');axes[0].set_ylabel('$E_b/N_0$ (dB)')axes[0].set_title('Limite de Shannon');axes[0].set_xlim(0,10);axes[0].set_ylim(-2,16)axes[0].grid(alpha=0.3);axes[0].legend();axes[0].axhline(0,ls=':',alpha=0.3)# Direita: BER vs Eb/N0 para BPSKaxes[1].semilogy(EbN0_dB_BPSK,BER_BPSK,color='#2563eb',lw=2.5,label='BPSK (coerente)')axes[1].axhline(1e-3,color='#dc2626',ls='--',alpha=0.6,label='BER = 10⁻³')axes[1].axhline(1e-6,color='#047857',ls='--',alpha=0.6,label='BER = 10⁻⁶')axes[1].set_xlabel('$E_b/N_0$ (dB)');axes[1].set_ylabel('BER')axes[1].set_title('BER de BPSK vs. $E_b/N_0$');axes[1].grid(alpha=0.3,which='both')axes[1].legend()# Encontrar Eb/N0 para BER=10^-5 em BPSKidx_1e5=np.argmin(np.abs(BER_BPSK-1e-5))print(f"BPSK: BER=10^-5 em Eb/N0 = {EbN0_dB_BPSK[idx_1e5]:.1f} dB")print(f"Shannon para eta=1: Eb/N0 = 0 dB")print(f"Gap: {EbN0_dB_BPSK[idx_1e5]:.1f} dB")plt.tight_layout()
Output:
BPSK: BER=10^-5 em Eb/N0 = 9.6 dB
Shannon para eta=1: Eb/N0 = 0 dB
Gap: 9.6 dB
2.9 Lista de Exercícios Propostos
E1. (Numérico) Converta as seguintes potências:
a) $15\,\text{W}$ em dBm.
b) $-50\,\text{dBm}$ em watts.
c) $100\,\text{mW}$ em dBW.
E2. (Numérico) Um enlace de micro-ondas opera a $6\,\text{GHz}$ com $d=40\,\text{km}$. $P_t=23\,\text{dBm}$, $G_t=G_r=32\,\text{dBi}$ e há $2{,}5\,\text{dB}$ de perda em cada cabo terminal. A margem de fade requerida é 12 dB. Calcule $P_r$, a margem disponível e a margem residual se $P_{\text{sens}}=-90\,\text{dBm}$.
E3. (Teórico) Derive a equação de Friis do espaço livre partindo do conceito de densidade de potência e da relação $G = \frac{4\pi}{\lambda^2}A_e$. Mostre cada passo explicitamente.
E4. (Numérico) Para o código Hamming $(7,4)$, codifique a palavra $1011$ e determine os 3 bits de paridade. Suponha erro no 3º bit do codeword; calcule a síndrome e verifique que o erro é corrigido.
E5. (Numérico) Três estágios em cascata: LNA ($G=20\,\text{dB}$, $NF=1{,}5\,\text{dB}$), Mixer ($G=-5\,\text{dB}$, $NF=8\,\text{dB}$), RF Amplifier ($G=15\,\text{dB}$, $NF=4\,\text{dB}$). Calcule a figura de ruído total e a temperatura equivalente.
E6. (Teórico) Demonstre que, para o limite de Shannon, $\lim_{B\to\infty} C = \dfrac{P}{N_0\ln 2}$ e que isso implica $E_b/N_0 > \ln 2 = -1{,}59\,\text{dB}$.
E7. (Numérico) Um sistema FM com $\Delta f=50\,\text{kHz}$ e tom $f_m=W=5\,\text{kHz}$ opera com $(C/N)_W=20\,\text{dB}$. Calcule $\beta$, a banda de Carson e a SNR de saída acima do limiar. Compare sua banda com AM de mesma $W$.
E8. (Conceitual) Explique por que o LNA deve vir sempre primeiro no receptor, usando a fórmula de Friis para cascata. Dê um exemplo numérico comparando duas configurações: (a) LNA primeiro, (b) Mixer primeiro.
E9. (Numérico) Calcule a capacidade de Shannon para $B=10\,\text{MHz}$ e $\text{SNR}=30\,\text{dB}$. Qual seria a $E_b/N_0$ necessária? Compare com o limite fundamental.
E10. (Conceitual) Compare as modulações FM e BPSK em termos de: eficiência espectral, imunidade a ruído, complexidade, regenerabilidade, e aplicação típica. Justifique por que FM foi substituída por QPSK/16-QAM em sistemas modernos de banda larga.
E11. (Numérico) Para PCM com $f_s=8\,\text{kHz}$ (voz), determine o número mínimo de bits $n$ para atingir $\text{SNR}_q \ge 42\,\text{dB}$. Calcule a taxa de bits resultante e a largura de banda mínima Nyquist.
E12. (Desafio) Mostre que, para uma fonte de entropia $H(X)$, o código de Huffman atinge $\bar{L} < H(X)+1$. Construa o código de Huffman para uma fonte com distribuição $\{0{,}40, 0{,}25, 0{,}15, 0{,}10, 0{,}05\}$ e verifique o limite.
2.10 Gabarito
E1.
a) $10\log_{10}(15000) = 41{,}76\,\text{dBm}$.
b) $10^{-50/10}\,\text{mW} = 10^{-5}\,\text{mW} = 10^{-8}\,\text{W} = 10\,\text{nW}$.
c) $10\log_{10}(0{,}1) = -10\,\text{dBW}$.
A margem disponível é $-58{,}05-(-90)=31{,}95$ dB. Depois de reservar 12 dB para fade, a margem residual é $31{,}95-12=\boxed{19{,}95\,\text{dB}}$. A margem requerida não é subtraída de $P_r$.
E3. Ver Seção “Friis — Dedução completa”. Dedução passo a passo a partir de $S = P_tG_t/(4\pi d^2)$ e $P_r = S\cdot A_e$, com $A_e = \frac{\lambda^2}{4\pi}G_r$, resulta em $P_r = P_tG_tG_r\left(\frac{\lambda}{4\pi d}\right)^2$.
Codeword: $1011\,010$. Com erro no 3º bit: $1001010$. Síndrome: $s = H\vec{c}'^T$. A terceira coluna de $H$ é $(0,1,1)^T = 3$, indicando erro no bit 3. Corrigindo: volta a $1011010$.
E5. Convertendo para linear: $G_1=100$, $F_1=1{,}413$; $G_2=0{,}316$, $F_2=6{,}310$; $G_3=31{,}62$, $F_3=2{,}512$.
Como $(C/N)_W=10^{20/10}=100$, $\text{SNR}_{out}=(3/2)\beta^2(C/N)_W=1{,}5(100)(100)=15000$, ou $41{,}76\,\text{dB}$. O ganho referido a $(C/N)_W$ é $21{,}76$ dB. AM ocupa $2W=10$ kHz; FM ocupa 110 kHz, portanto a razão de bandas é 11.
E8. Por Friis: $F_{\text{tot}} \approx F_1 + (F_2-1)/G_1$. Se LNA primeiro com $G_1=100$, $(F_2-1)/100 \approx 0{,}053$. Se mixer primeiro com $G_1=0{,}316$, $(F_2-1)/0{,}316 \approx 19$. A diferença é enorme.
$\text{SNR}=1000$ e, operando em $R_b=C$, $\eta=C/B\approx9{,}967$. Assim, $E_b/N_0=\text{SNR}/\eta\approx100{,}33$, ou $20{,}01$ dB. Pela fronteira de Shannon, $(2^\eta-1)/\eta=1000/9{,}967\approx100{,}33$: os valores coincidem porque escolhemos exatamente $R_b=C$. Uma implementação prática opera abaixo da capacidade.
E10. FM: alta imunidade, baixa eficiência espectral. BPSK/QPSK: boa imunidade, alta eficiência, regenerável, criptografável. FM é analógica (não regenerável), ocupa banda proporcional a $\beta$, não é digital (não há correção de erros). Sistemas de banda larga exigem $\eta$ alto (QPSK, 16-QAM, etc.) e tolerância a erro via código — impossível com FM.
Comunicações Eletrônicas — Apostila de Curso
Tópicos: Modulação AM · DSB-SC · detecção coerente e de envelope · Geração de portadora sincronizada · SSB · VSB · análise de ruído
3.1 Antes de começar
Ao final, você deve conseguir derivar os espectros de DSB-SC, AM, SSB e VSB; calcular banda e potência; escolher um detector coerente ou de envelope; e entender os métodos de recuperação de portadora (Costas Loop, PLL, pilot carrier). Diagnóstico: qual parte da potência da AM convencional transporta informação? Evidência mínima: prever e depois simular sobremodulação, erro de fase, escolha da constante $RC$ e convergência do Costas Loop.
3.2 Por que modular? Fundamentos da Modulação Analógica
3.2.1 A necessidade fundamental da modulação
A modulação é o processo de variar um ou mais parâmetros de uma onda portadora (senoidal de alta frequência) em função de um sinal de mensagem (banda base, de frequência mais baixa). Este é o pilar de todas as comunicações sem fio — de rádio AM/FM a enlaces de micro-ondas, satélites e sistemas celulares.
Existem três razões físicas e práticas fundamentais:
Antenas de tamanho prático: O comprimento de onda $\lambda = c/f$ deve ser comparável às dimensões da antena (tipicamente $\lambda/4$ ou $\lambda/2$). Para um sinal de áudio com $f_{\text{áudio}} = 1\,\text{kHz}$, teríamos $\lambda \approx 300\,\text{km}$ — uma antena de $75\,\text{km}$ é impraticável. Modulado para $f_c = 100\,\text{MHz}$ (banda FM), $\lambda = 3\,\text{m}$ e a antena cabe na palma da mão.
Multiplexação por divisão em frequência (FDM): Vários sinais podem coexistir no mesmo meio físico (espaço livre, cabo coaxial, fibra) se cada um for modulado em uma faixa de frequência diferente. Sem modulação, todos os sinais ocupariam a mesma banda base e se sobreporiam destrutivamente.
Adaptação ao canal: Diferentes canais têm diferentes características de transmissão (atenuação seletiva, interferências, largura de banda disponível). Modular permite "encaixar" o sinal na janela de frequência onde o canal tem melhor resposta.
3.2.2 Representação analítica
Para qualquer sinal real $s(t)$ de banda estreita, definimos o sinal analítico:
$$
\boxed{\tilde{s}(t) = s(t) + j\,\hat{s}(t)}
$$
onde $\hat{s}(t)$ é a transformada de Hilbert:
$$
\boxed{\hat{s}(t) = s(t) * \frac{1}{\pi t}}
$$
No domínio da frequência, $\hat{S}(f) = -j\,\text{sgn}(f)\,S(f)$, e $\tilde{S}(f) = 2\,U(f)\,S(f)$ (apenas frequências positivas, duplicadas).
O sinal complexo envolvente (baseband equivalente):
Toda modulação em amplitude usa $Q(t) = 0$; modulações de fase/frequência manipulam $Q$ e $\phi$.
3.2.4 Espectro de modulação e bandas laterais
Para um sinal de mensagem $m(t)$, real, limitado a $|f| \leq W$, com transformada de Fourier $M(f)$, a modulação em amplitude traduz o espectro $M(f)$ para as vizinhanças de $\pm f_c$. Este é o efeito da modulação por multiplicação:
Para $m(t)$ real, $M(f)$ possui simetria conjugada: $M(-f) = M^*(f)$. As duas bandas laterais (BSL) são, portanto, espelhos complexos conjugados e contêm informação redundante — esta redundância é o que permite a simplificação SSB.
3.2.5 Eficiência espectral e energética como critérios de escolha
Ao comparar esquemas de modulação, dois critérios são essenciais:
Eficiência espectral ($\eta_f$): quantos bits/s (ou quanta informação) por hertz de banda ocupada. Quanto menor a banda, melhor.
Eficiência energética ($\eta_P$): fração da potência total do sinal modulado que transporta informação (não é desperdiçada em portadora ou bandas redundantes).
Esquema
Banda
Ef. espectral
Ef. energética
Complexidade
AM (DSB-LC)
$2W$
baixa
$\leq 33\%$ (tom único)
baixa (detector envelope)
DSB-SC
$2W$
média
$100\%$ (sem portadora)
média (detector coerente)
SSB
$W$
alta
$100\%$
alta (filtro/Hilbert)
VSB
$\approx W$
intermediária
intermediária
intermediária
Esta tabela orienta a escolha do esquema: AM para emissão broadcasting (simplicidade do receptor), DSB-SC para enlace ponto-a-ponto eficiente, SSB para comunicações de longa distância (HF), VSB para vídeo (compromisso prático).
3.3 Modulação DSB-SC — Teoria Completa
3.3.1 Definição e modelo
Na modulação DSB-SC (Double Sideband — Suppressed Carrier, ou "bandas laterais duplas com portadora suprimida"), o sinal modulado é simplesmente o produto do sinal de mensagem pela portadora:
O segundo termo se anula por média temporal (o termo em $2f_c$ oscila muito mais rápido que $m^2(t)$, e sua média tende a zero para $f_c \gg W$). Definindo $P_m = \langle m^2(t)\rangle$ como a potência do sinal de mensagem:
$$
\boxed{P_s = \frac{A_c^2}{2}\,P_m}
$$
3.3.4 Representação no plano I/Q
Para DSB-SC, comparando com a forma quadratura $s(t) = I(t)\cos(2\pi f_c t) - Q(t)\sin(2\pi f_c t)$:
Componente I: $\boxed{I(t) = A_c\,m(t)}$
Componente Q: $\boxed{Q(t) = 0}$
O sinal complexo envolvente é puramente real:
$$
\tilde{s}_L(t) = A_c\,m(t)
$$
e o envelope instantâneo é $|\tilde{s}_L(t)| = A_c|m(t)|$. Em DSB-SC, o envelope cruza zero sempre que $m(t)$ cruza zero — isso significa que o sinal inverte de fase a cada zero, e um detector de envelope simples não funciona (explicado na Seção “Detecção de Envelope de AM”).
3.3.5 Transformada de Hilbert de um sinal DSB-SC
No domínio da frequência: $\hat{S}(f) = -j\,\text{sgn}(f)\,S(f)$. Para DSB-SC concentrado em $\pm f_c$:
Espectro: duas linhas em $\pm 99\,\text{kHz}$ e $\pm 101\,\text{kHz}$, cada uma com amplitude $1/2$.
Potência: $P_m = \langle\cos^2(2\pi\cdot 10^3\,t)\rangle = 1/2$, logo $P_s = \tfrac{1}{2}\cdot\tfrac{1}{2} = \tfrac{1}{4}$. Cada banda lateral contribui com $1/8$.
3.4 Detecção Coerente de DSB-SC
3.4.1 Princípio da detecção coerente (síncrona)
Para recuperar $m(t)$ de $s_{\text{DSB-SC}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)$, o método mais direto é multiplicar pelo mesmo coseno que foi usado na modulação e filtrar:
O segundo termo é um sinal centrado em $2f_c$. Passando por um filtro passa-baixas $H_{\text{LP}}(f)$ com largura de corte $B_{\text{LP}} \geq W$:
$$
\boxed{y(t) = A_c\,m(t)}
$$
A mensagem é recuperada com ganho $A_c$. Um amplificador com ganho $1/A_c$ a seguir fornece a saída final $m(t)$.
3.4.3 Efeito do erro de fase $\phi$
Na prática, o oscilador local do receptor pode não estar perfeitamente sincronizado em fase com a portadora. Suponha que o oscilador local seja $\cos(2\pi f_c t + \phi)$, com erro de fase $\phi$:
$$
r_\phi(t) = 2\,s_{\text{DSB-SC}}(t)\,\cos(2\pi f_c t + \phi) = 2\,A_c\,m(t)\,\cos(2\pi f_c t)\,\cos(2\pi f_c t + \phi)
$$
Ou seja, a potência do sinal recuperado é $\cos^2\phi$ vezes a potência original. Para $\phi = 30°$, por exemplo: $\cos^2 30° = 3/4 = 75\%$ da potência é mantida.
3.4.4 Efeito do erro de frequência $\Delta f$
Suponha agora que o oscilador local tenha frequência $f_c + \Delta f$, com $\Delta f \neq 0$:
Análise: o sinal recuperado é multiplicado por um batimento $\cos(2\pi\Delta f\,t)$. Se $\Delta f$ é pequeno (da ordem de $W$), o batimento se manifesta como uma flutuação audível na voz (em áudio) ou como cintilação na imagem (em vídeo). Se $\Delta f$ é grande, o batimento está fora da banda de interesse e pode ser filtrado.
Em qualquer sistema DSB-SC (e, de modo geral, em qualquer modulação que não transmita a portadora), o receptor precisa reconstruir uma portadora local sincronizada em frequência e fase com a portadora original do transmissor. Sem essa sincronização, a detecção coerente falha:
Erro de fase $\phi \neq 0$ causa atenuação por $\cos\phi$.
Erro de frequência $\Delta f \neq 0$ causa batimento na saída.
Para $\phi = 90°$, há perda total do sinal.
Existem quatro abordagens principais para recuperar a portadora no receptor:
Método
Complexidade
Robustez a ruído
Aplicação típica
Pilot Carrier
baixa
moderada
TV analógica, estúdio
PLL genérico
média
boa
Enlaces ponto-a-ponto
Costas Loop
média/alta
boa
DSB-SC, PSK
Squaring Loop
alta
excelente
PSK, sistemas digitais
3.5.2 Método 1 — Pilot Carrier (portadora piloto)
3.5.2.1 Princípio
Transmite-se a mensagem DSB-SC mais uma pequena componente de portadora em uma frequência ligeiramente deslocada ou com fase conhecida:
onde $A_p \ll A_c$ (a piloto é tipicamente 1%–10% da amplitude da portadora original). A potência da piloto é mínima, mas suficiente para servir de referência de fase.
No receptor, um filtro passa-banda estreito centrado em $f_c$ extrai a piloto:
$$
\boxed{v_{\text{pilot}}(t) = A_p\,\cos(2\pi f_c t + \theta_p)}
$$
Um PLL ou Costas Loop usa este sinal como referência para bloquear a fase do VCO.
3.5.2.2 Análise de potência
Se a potência total da piloto é $P_p = A_p^2/2$ e a potência do sinal DSB-SC é $P_s = A_c^2 P_m/2$, a razão piloto-sinal é:
A piloto consome menos de 1% da potência — um custo mínimo pela simplicidade de implementação.
3.5.2.3 Vantagens e desvantagens
Vantagens:
Simples de implementar no receptor (filtro + PLL).
Funciona bem mesmo para $m(t)$ com baixa profundidade de modulação.
Sinal de erro estável mesmo quando $m(t) = 0$.
Desvantagens:
Desperdício de potência na piloto (ainda que pequeno).
Requer que a piloto seja extraída por filtro — sensível a desvanecimento seletivo em $f_c$.
Não é adequado para aplicações militares ou criptografadas (a piloto revela a frequência exata).
3.5.2.4 Aplicação: TV analógica
Na TV analógica (NTSC/PAL), a portadora de vídeo é transmitida com nível suficiente (tipicamente $\mu \approx 0{,}7$) para ser extraída por um PLL no receptor. Esta é uma forma de pilot carrier implícito.
3.5.3 Método 2 — PLL Genérico (Phase-Locked Loop)
3.5.3.1 Estrutura do PLL
Um Phase-Locked Loop é um sistema de realimentação que ajusta a fase de um oscilador local (VCO) para rastreá-la de um sinal de referência. A estrutura básica possui três blocos:
Lock (bloqueio): o PLL está sincronizado ($\phi_e \approx 0$) e mantido. O erro de fase em lock é tipicamente $\phi_e < 10°$.
Capture: o processo de entrar em lock a partir de uma condição inicial. A largura de banda de captura é a faixa de frequência inicial dentro da qual o PLL pode adquirir lock.
Tracking (rastreamento): o PLL já está em lock e segue pequenas variações de fase/frequência da entrada.
Para PLL de segunda ordem, a largura de banda de capture é aproximadamente:
O Costas Loop (inventado por Andrew Costas em 1956) é um PLL self-coherent — não precisa de sinal piloto nem de processamento de sinal de entrada antes da detecção. Sua topologia usa duas ramificações paralelas (I e Q) do VCO:
O potencial atrativo em torno de $\phi_e = 0$ é forte e simétrico: o loop converge tanto para fase 0 quanto para $\pi$ (ambos produzem recuperação válida). Esta é uma vantagem única do Costas Loop.
3.5.4.4 Ganho do Costas Loop
Comparando com um PLL genérico onde o sinal de erro é $K_d \sin\phi_e$, o Costas Loop tem:
O ganho efetivo do Costas Loop é quadrático em $A_c$ — mais sensível que o PLL genérico (que é linear em $A_c$).
3.5.4.5 Resposta do Costas Loop a ruído
A presença de ruído aditivo $n(t)$ no canal altera o sinal de erro. Seja $s_{\text{in}}(t) = A_c m(t)\cos(\omega_c t) + n(t)$, onde $n(t)$ é ruído AWGN de banda $2W$.
O ruído contribui para $v_e(t)$ através de produtos cruzados entre sinal e ruído, e ruído-ruído. O resultado é que o erro de fase em lock possui uma variância aproximada:
onde $B_L$ é a largura de banda de malha do filtro do Costas Loop e $\text{SNR}_{\text{in}}$ é a SNR de entrada (portadora-ruído) na banda $2W$.
Esta fórmula mostra que:
Maior SNR → menor erro de fase.
Menor $B_L$ → menor erro, mas resposta mais lenta a variações de fase.
Há um compromisso dinâmico: $B_L$ deve ser grande o suficiente para seguir variações de fase (drift do oscilador, ~1–10 Hz), mas pequeno o suficiente para minimizar ruído.
3.5.4.6Cycle slip no Costas Loop
Quando o erro de fase excede $\pm \pi/2$, o Costas Loop pode sofrer um cycle slip — o VCO "salta" $2\pi$ para recuperar lock. Cada cycle slip causa um glitch na saída demodulada. A probabilidade de cycle slip é:
Para $\text{SNR}_{\text{in}} > 10\,\text{dB}$, $P_{\text{slip}}$ é negligenciável. Abaixo de ~7 dB, o Costas Loop começa a perder lock frequentemente.
3.5.4.7 Limitações do Costas Loop
Ambiguidade de fase $\pi$: o lock pode ocorrer em $\phi_e = 0$ ou $\phi_e = \pi$. Para DSB-SC isso é inofensivo, mas para PSK (onde a informação está na fase) causa bit-flip de 180°.
Limiar de ruído: abaixo de ~7 dB, o Costas Loop perde lock. O squaring loop (Método 4) opera em ~3 dB.
Dependência de $m(t)$: o sinal de erro é proporcional a $m^2(t)$. Se $m(t)$ permanece próximo de zero por muito tempo (ex: silêncio em áudio), o loop perde rastreamento.
Quando não é possível usar Costas Loop (ex: em modulações PSK onde o Costas Loop sofre ambiguidade de fase), utiliza-se um extrator de potência (power extractor) para reconstruir a portadora.
O sinal recebido $s_{\text{in}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)$ é elevado ao quadrado:
Um divisor de frequência por 2 produz a portadora recuperada:
$$
\boxed{v_{\text{rec}}(t) = \frac{A_c^2}{4}\,\cos(2\pi f_c t + \theta)}
$$
onde $\theta$ é uma fase constante de $0°$ ou $90°$ (ambiguidade de $\pi/2$ do divisor).
3.5.5.2 Squaring Loop para PSK
Para QPSK, onde $m(t) = I(t)\cos(\pi/4) - Q(t)\sin(\pi/4)$ com $I,Q \in \{\pm 1\}$:
$$
m^2(t) = 1 \quad\text{(sempre!)}
$$
Logo, após o quadrado, a componente em $2f_c$ é pura — sem modulação de envelope. O divisor por 2 recupera a portadora sem ambiguidade de fase.
3.5.5.3 Comparação: Costas Loop vs Squaring Loop
Característica
Costas Loop
Squaring Loop
Sinal de erro
$\propto m^2(t)\sin(2\phi_e)$
PLL em $2f_c$, depois divide
Ambiguidade de fase
$\pi$ (inofensivo para DSB)
$\pi/2$
Limiar de ruído
~7 dB
~3 dB
Complexidade
3–4 multiplicadores
1 quadrador + 1 divisor
Sensível a silêncio de $m(t)$
Sim
Não
Aplicação
DSB-SC, BPSK
QPSK, sistemas digitais
3.5.6 Tabela comparativa: métodos de recuperação de portadora
Critério
Pilot Carrier
PLL Genérico
Costas Loop
Squaring Loop
Potória extra
$\sim 1\%$
$0$
$0$
$0$
Complexidade
Baixa
Média
Média–Alta
Alta
Limiar SNR
~3 dB
~5 dB
~7 dB
~3 dB
Ambiguidade de fase
Nenhuma
Nenhuma
$\pi$
$\pi/2$
Robustez a silêncio
Excelente
Boa
Fraca
Excelente
Adequado para DSB-SC
Sim
Sim
Ideal
Sim
Adequado para PSK
Sim
Sim
Sim (com cuidado)
Ideal
3.5.7 Limitações práticas da detecção coerente
Apesar dos avanços em PLL e Costas Loop, a detecção coerente apresenta desafios:
Drift de temperatura: o VCO varia de frequência com a temperatura (~10–100 ppm). Requer recalibração periódica ou reference de cristal.
Jitter de relógio: em sistemas digitais, o jitter do oscilador de relógio se acopla ao VCO e degrada a SNR.
Desvanecimento seletivo: se o canal atenua seletivamente em $f_c$, a recuperação da portadora falha mesmo que o sinal esteja presente nas bandas laterais.
Tempo de aquisição: o PLL pode levar dezenas a centenas de ciclos para adquirir lock. Em sistemas de transmissão packetizada, isso representa uma sobrecarga significativa.
Estas limitações motivam o uso de AM convencional (DSB-LC) em aplicações de broadcasting, onde a portadora é transmitida em alta potência e pode ser usada diretamente pelo detector de envelope — sem necessidade de PLL.
O potencial atrativo em torno de $\phi_e = 0$ é forte e simétrico: o loop convergente tanto para fase 0 quanto para $\pi$ (ambos produzem recuperação válida). Esta é uma vantagem única do Costas Loop.
3.5.7.2 Ganho do Costas Loop
Comparando com um PLL genérico onde o sinal de erro é $K_d \sin\phi_e$, o Costas Loop tem:
O ganho efetivo do Costas Loop é quadrático em $A_c$ — mais sensível que o PLL genérico (que é linear em $A_c$).
3.5.7.3 Resposta do Costas Loop a ruído
A presença de ruído aditivo $n(t)$ no canal altera o sinal de erro. Seja $s_{\text{in}}(t) = A_c m(t)\cos(\omega_c t) + n(t)$, onde $n(t)$ é ruído AWGN de banda $2W$.
O ruído contribui para $v_e(t)$ através de produtos cruzados entre sinal e ruído, e ruído-ruído. O resultado é que o erro de fase em lock possui uma variância aproximada:
onde $B_L$ é a largura de banda de malha do filtro do Costas Loop e $\text{SNR}_{\text{in}}$ é a SNR de entrada (portadora-ruído) na banda $2W$.
Esta fórmula mostra que:
Maior SNR → menor erro de fase.
Menor $B_L$ → menor erro, mas resposta mais lenta a variações de fase.
Há um compromisso dinâmico: $B_L$ deve ser grande o suficiente para seguir variações de fase (drift do oscilador, ~1–10 Hz), mas pequeno o suficiente para minimizar ruído.
3.5.7.4Cycle slip no Costas Loop
Quando o erro de fase excede $\pm \pi/2$, o Costas Loop pode sofrer um cycle slip — o VCO
3.6 Modulação AM Convencional (DSB-LC)
3.6.1 Definição e modelo
Na modulação AM convencional (Double Sideband — Large Carrier, ou "bandas laterais duplas com portadora forte"), adicionamos uma componente DC à mensagem antes de modular:
Quando $\mu > 1$, o envelope $1+\mu\,m_n(t)$ torna-se negativo em alguns pontos. Como o detector de envelope (diodo+RC) não pode seguir valores negativos, o envelope detectado é o módulo $|1+\mu\,m_n(t)|$, produzindo distorção severa:
Cruzamento de zero: o envelope passa por zero, invertendo a fase do sinal modulado em $180°$.
Distorção não-linear: o detector recupera $|1+\mu\,m_n(t)| \neq 1+\mu\,m_n(t)$, introduzindo harmônicos que não estavam na mensagem original.
Interferência entre canais: a distorção gera conteúdo espectral que se espalha além da banda $2W$, interferindo em canais adjacentes.
3.7 Detecção de Envelope de AM
3.7.1 Princípio do detector de envelope
O detector de envelope (ou detector de pico) é o receptor mais simples para modulação AM. Consiste basicamente de:
Um diodo (retificador de meia onda ou onda completa);
Um circuito RC passa-baixas (filtro de descarga).
O diodo retifica o sinal (remove a metade negativa), e o capacitor C carrega até o pico do envelope e descarrega através de R com constante de tempo $\tau = RC$.
3.7.2 Dedução da condição de RC
Para que o detector funcione corretamente, a constante de tempo $RC$ deve satisfazer duas condições opostas:
Condição 1 — Filtrar a portadora (R grande o suficiente para não "ver" a oscilação em $f_c$):
$$
\boxed{RC\gg\frac{1}{2\pi f_c}}
$$
Isto garante que o capacitor não descarregue significativamente durante um ciclo da portadora.
Condição 2 — Rastrear a mensagem (R pequeno o suficiente para acompanhar variações rápidas de $m(t)$):
$$
\boxed{RC\ll\frac{1}{2\pi W}}
$$
Isto garante que o capacitor descarregue o suficiente entre picos consecutivos do envelope para seguir as variações da mensagem.
Outro tipo de distorção ocorre quando o resistor de carga $R_L$ é conectado ao detector (por exemplo, através de um capacitor acoplador). A descarga do capacitor através do circuito de carga pode causar o negative peak clipping: quando o envelope sobe rapidamente (carga rápida via diodo), mas desce lentamente (descarga através de $R_L$), os picos negativos do sinal são cortados.
3.7.5 SNR de saída do detector de envelope
Para um detector de envelope em AM operando acima do limiar, isto é, com razão portadora-ruído suficientemente alta para linearizar o módulo, a SNR de saída é aproximadamente:
onde $\text{SNR}_{\text{in}}$ é a razão sinal-ruído na entrada do detector (banda $2W$ centrada em $f_c$).
Para tom único com $\mu = 1$: $\text{SNR}_{\text{out}} \approx \tfrac{1}{3}\,\text{SNR}_{\text{in}}$ — pior que a entrada (ganho de SNR $< 1$).
Comparação: o DSB-SC coerente tem $\text{SNR}_{\text{out}} = 2\,\text{SNR}_{\text{in}}$ (ganho de 3 dB), superior ao AM. Porém, o AM não precisa de oscilador local sincronizado — é uma troca entre desempenho e complexidade.
3.7.6 Exemplo: projeto de detector de envelope para AM broadcast
Escolha prática: $R = 5\,\text{k}\Omega$, $C = 0{,}0047\,\mu\text{F}$, então $RC = 23{,}5\,\mu\text{s}$ — dentro da janela e próximo do limite anti-clipping.
3.8 Modulação SSB — Teoria e Implementação
3.8.1 Redundância das bandas laterais em DSB
Em DSB-SC, as duas bandas laterais são espelhos conjugados: $S(f_c+f) = S^*(f_c-f)$ para $m(t)$ real. Cada banda lateral contém informação completa sobre $m(t)$. Transmitir ambas é redundante — podemos eliminar uma delas sem perda de informação.
3.8.2 Transformada de Hilbert e seu espectro
A transformada de Hilbert de um sinal $m(t)$ é definida como:
Simplificando: para $f > 0$, apenas a cópia de $M(f)$ deslocada para $f_c$ (para $f \in [f_c,\,f_c+W]$). Para $f < 0$, apenas a cópia conjugada deslocada para $-f_c$.
Largura de banda:
$$
\boxed{B_{\text{SSB}} = W}
$$
Metade do DSB-SC! Esta é a principal vantagem da SSB.
3.8.5 Potência e eficiência da SSB
A potência do sinal SSB (tomando $\hat{m}(t)$ como ortogonal a $m(t)$):
Desafio de projeto: o filtro deve ter uma transição extremamente íngreme entre a banda lateral transmitida e a rejeitada. Para $f_c = 1\,\text{MHz}$ e $W = 5\,\text{kHz}$, a transição ocorre em apenas $10\,\text{kHz}$ (de $f_c$ a $f_c+W$ para a outra lateral). Isto exige filtros de alta ordem (centenas de elementos para RF).
3.8.7 Método de Weaver para geração de SSB
O método de Weaver (1956) evita o filtro íngreme usando duas etapas de mixagem em frequências intermediárias:
Passo 1: Modular $m(t)$ em uma frequência intermediária $f_1$ (baixa, tipicamente alguns kHz):
$$
s_1(t) = m(t)\,\cos(2\pi f_1 t)
$$
Passo 2: Modular novamente, esta vez em $f_2$ (também baixa, mas diferente de $f_1$):
Passo 3: Filtrar por um filtro passa-baixa simples (a banda lateral é bem separada em $f_2 \pm f_1$).
Passo 4: Modular o resultado final para a frequência de transmissão $f_c$.
Este método é amplamente usado em receptores de rádio amador porque os filtros operam em frequências baixas, onde são mais fáceis de implementar.
3.9 Modulação VSB — Compromisso Prático
3.9.1 Por que VSB?
A SSB requer um filtro de transição extremamente íngreme. Para sinais com conteúdo de baixa frequência significativo (como vídeo, onde o espectro vai até DC), cortar abruptamente a banda lateral próxima a $f_c$ é praticamente impossível com filtros realizáveis.
A modulação VSB (Vestigial Sideband) resolve este problema transmitindo uma banda lateral completa e um "vestígio" (vestige) da outra banda lateral.
3.9.2 Dedução da condição de simetria VSB
Seja $H(f)$ a resposta em frequência do filtro de banda lateral usado na geração VSB. O sinal modulado é:
Esta é a condição de vestígio simétrico. Ela garante que, ao multiplicar por $\cos(2\pi f_c t)$ e filtrar por passa-baixas, o sinal original seja recuperado sem distorção.
3.9.3 Aplicação: TV analógica
A aplicação mais famosa de VSB é a transmissão de vídeo em TV analógica (NTSC, PAL, SECAM):
O sinal de vídeo (luminância) tem espectro de DC até $\sim 4{,}2\,\text{MHz}$ (NTSC) ou $\sim 5\,\text{MHz}$ (PAL).
Transmitir SSB seria impraticável (filtro íngreme para conteúdo de baixa frequência).
VSB transmite a USB completa e um vestígio de $\sim 1{,}25\,\text{MHz}$ da LSB.
Largura de banda total: $\sim 6\,\text{MHz}$ por canal (NTSC).
3.9.4 Largura de banda VSB
$$
\boxed{B_{\text{VSB}} = W + f_{\text{vestígio}}}
$$
onde $f_{\text{vestígio}}$ é a largura da faixa de transição (tipicamente $0{,}5W$ a $1{,}25W$). Para vídeo NTSC: $W = 4{,}2\,\text{MHz}$, $f_{\text{vestígio}} \approx 1{,}25\,\text{MHz}$, $B_{\text{VSB}} \approx 6\,\text{MHz}$.
3.9.5 Detecção VSB
A recuperação VSB pode ser feita por:
Detecção coerente (mesmo método DSB-SC, multiplicar por $\cos(2\pi f_c t)$ e filtrar).
Detecção de envelope (apenas se a portadora for transmitida em nível suficiente, como na TV analógica, onde a portadora de vídeo é transmitida com $\mu \approx 0{,}7$).
3.9.6 Comparação completa: DSB vs SSB vs VSB vs AM
Propriedade
AM (DSB-LC)
DSB-SC
SSB
VSB
Largura de banda
$2W$
$2W$
$W$
$W+f_v$
Potência de portadora
$A_c^2/2$
$0$
$0$ (ou pequena)
$A_c^2/2$ (ou suprimida)
Eficiência energética
$\leq 33{,}3\%$
$100\%$
$100\%$
$\approx 60\text{--}75\%$
Complexidade do TX
baixa
média
alta
intermediária
Complexidade do RX
muito baixa
alta (coerente)
alta (coerente)
baixa/média
Aplicação típica
Rádio broadcasting
Enlace ponto-a-ponto
HF, telecom
Vídeo/TV
3.10 Análise de Ruído em Modulação Analógica
3.10.1 Modelo de ruído aditivo branco gaussiano (AWGN)
Considere um canal com ruído aditivo branco gaussiano (AWGN): $n(t)$ é um processo estacionário com espectro de potência constante:
onde $N_0$ é a densidade espectral unilateral de potência (W/Hz). A potência de ruído na banda de recepção de largura $B$ é:
$$
P_n = \frac{N_0}{2}\cdot 2B = N_0\,B
$$
3.10.2 SNR na entrada do receptor
A potência do sinal recebido (assumindo atenuação de canal unitária para simplificar) é $P_R$. O ruído na banda de recepção (banda do sinal modulado) é $N_0\,B$. Logo:
Para DSB-SC, o receptor coerente tem largura de banda de base $W$. O ruído na banda de recepção (passa-banda $2W$) tem potência $N_0\cdot 2W$. Após a mixagem e o filtro passa-baixas de banda $W$, o ruído de saída é $N_0\cdot W$.
O sinal de saída tem potência $A_c^2 P_m$ (com ganho do oscilador local $= 2$, conforme Seção “Detecção Coerente de DSB-SC”).
Para AM com índice de modulação $\mu$ e sinal normalizado $m_n(t)$, a potência do sinal é $P_T = \tfrac{A_c^2}{2}(1+\mu^2 P_{m_n})$. Na banda de recepção $2W$, o ruído é $N_0\cdot 2W$.
O sinal de informação (bandas laterais) tem potência $P_{\text{SB}} = \tfrac{\mu^2 A_c^2}{2}P_{m_n}$.
Para tom único ($P_{m_n} = 1/2$) com $\mu = 1$: $\text{SNR}_{\text{out}} = \tfrac{1}{3}\,\text{SNR}_{\text{in}}$ — piora de 4,77 dB em relação à entrada.
Comparação: usando as definições desta seção, para tom único e $\mu=1$ o fator é 2 para DSB-SC e $1/3$ para AM, uma razão 6 ou $7{,}78$ dB — não “aproximadamente 10 dB”. A vantagem do AM é a simplicidade do detector de envelope.
3.10.5 SSB: SNR de saída
Para SSB, a banda de recepção é $W$ (metade do DSB). O ruído na entrada é $N_0\cdot W$ (metade do DSB). Após a detecção coerente, o ruído de saída é $N_0\cdot W/2$ (filtro passa-baixas de banda $W/2$ na baseband equivalente).
Trade-off FM: $B_{\text{FM}} \approx 2(\beta+1)W$ (Carson). Maior $\beta$ = mais banda, mais SNR. WBFM ($\beta \gg 1$): SNR excelente, banda larga. NBFM ($\beta \ll 1$): banda estreita, SNR modesto.
3.10.7 Tabela comparativa de ruído
Modulação
SNR$_{\text{out}}$/SNR$_{\text{in}}$
Banda
Complexidade de RX
AM (DSB-LC)
$\tfrac{\mu^2 P_{m_n}}{1+\mu^2 P_{m_n}}$
$2W$
muito baixa
DSB-SC
$2$
$2W$
alta (coerente)
SSB
$2$
$W$
alta (coerente)
FM ($\beta \gg 1$)
$3\beta^2(\beta+1)$
$2(\beta+1)W$
média/alta
VSB
$\approx 2$ (coerente)
$W+f_v$
intermediária
3.11 Exercícios Resolvidos em Python
3.11.1 Protocolo computacional
Objetivo: confrontar espectro, potência e recuperação de DSB-SC, AM e SSB. Amostragem: use $f_s$ suficientemente maior que $2(f_c+W)$ e declare a normalização da FFT. Validação: meça potência no tempo, confira a eficiência teórica e quantifique erro de fase, sobremodulação e rejeição da banda lateral.
3.11.2 Exercício 1: Simulação DSB-SC com detecção coerente e erro de fase
Simule a modulação DSB-SC e a detecção coerente com diferentes erros de fase $\phi$, mostrando o efeito da atenuação por $\cos\phi$.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfs=100_000# taxa de amostragemfc=5_000# frequência da portadorafm=200# frequência da mensagemT=0.02# duração totalt=np.arange(0,T,1/fs)m=np.cos(2*np.pi*fm*t)# mensagem (tom único)Ac=1.0# --- DSB-SC ---s_dsb=Ac*m*np.cos(2*np.pi*fc*t)# --- Detecção coerente com erro de fase phi ---phis=[0,np.pi/6,np.pi/4,np.pi/3,np.pi/2]fig,axes=plt.subplots(len(phis),1,figsize=(10,12),sharex=True)forax,phiinzip(axes,phis):# Misturador: multiplicar por 2*cos(2*pi*fc*t + phi)mixer=2*np.cos(2*np.pi*fc*t+phi)r=s_dsb*mixer# Filtro passa-baixas: média móvel com janela de 200 amostrash_lp=np.ones(200)/200y=np.convolve(r,h_lp,mode='full')[:len(t)]# Teórico: y = Ac * m * cos(phi)y_theory=Ac*m*np.cos(phi)ax.plot(t*1e3,m,'b',lw=0.7,alpha=0.6,label='m(t)')# Não normalize cada curva separadamente: isso esconderia a perda cos(phi)# e causaria divisão por zero em phi=90°. Ac=1 já fornece escala comum.ax.plot(t*1e3,y,'r',lw=0.9,label=fr'saída ($\phi$={np.rad2deg(phi):.0f}°)')ax.plot(t*1e3,y_theory,'k--',lw=0.7,label=fr'teórico ($\cos\phi$={np.cos(phi):.3f})')ax.set_ylabel('amplitude')ax.legend(fontsize=7,loc='upper right')ax.grid(alpha=0.2)ax.set_title(fr'Detecção coerente DSB-SC com erro de fase $\phi$ = {np.rad2deg(phi):.0f}°')axes[-1].set_xlabel('tempo (ms)')plt.tight_layout()plt.savefig('/tmp/dsb_phase_error.png',dpi=150,bbox_inches='tight')plt.show()# --- Medição quantitativa ---print("Erro de fase | Amplitude recuperada | Potência rel. | Perda (dB)")print("-"*65)forphiinphis:amp=np.cos(phi)pwr=amp**2loss_db=-10*np.log10(pwr+1e-12)print(f" {np.rad2deg(phi):6.1f}° | {amp:18.5f} | {pwr:15.5f} | {loss_db:10.2f} dB")
Output:
Erro de fase | Amplitude recuperada | Potência rel. | Perda (dB)
-----------------------------------------------------------------
0.0° | 1.00000 | 1.00000 | -0.00 dB
30.0° | 0.86603 | 0.75000 | 1.25 dB
45.0° | 0.70711 | 0.50000 | 3.01 dB
60.0° | 0.50000 | 0.25000 | 6.02 dB
90.0° | 0.00000 | 0.00000 | 120.00 dB
Erro de fase | Amplitude recuperada | Potência rel. | Perda (dB)
-----------------------------------------------------------------
0.0° | 1.00000 | 1.00000 | 0.00 dB
30.0° | 0.86603 | 0.75000 | 1.25 dB
45.0° | 0.70711 | 0.50000 | 3.01 dB
60.0° | 0.50000 | 0.25000 | 6.02 dB
90.0° | 0.00000 | 0.00000 | inf dB
3.11.3 Exercício 2: AM com envelope — variação de $\mu$ e espectro
Varie o índice de modulação $\mu$ e observe o envelope e o espectro.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfs=200_000;fc=10_000;fm=400;T=0.01;t=np.arange(0,T,1/fs)m=np.cos(2*np.pi*fm*t);Ac=1.0mu_vals=[0.3,0.7,1.0,1.3]fig,axes=plt.subplots(2,2,figsize=(10,7))forax,muinzip(axes.flat,mu_vals):s=Ac*(1+mu*m)*np.cos(2*np.pi*fc*t)env=Ac*(1+mu*m)ax.plot(t*1e3,s,'b',lw=0.6)ax.plot(t*1e3,env,'r--',lw=1);ax.plot(t*1e3,-env,'r--',lw=1)ifmu>1:ax.fill_between(t*1e3,-Ac,Ac,where=(env<0),alpha=0.1,color='red')ax.set_title(f'AM $\\mu$={mu}');ax.set_xlim(0,T*1e3);ax.grid(alpha=0.2)axes[1,0].set_xlabel('tempo (ms)');axes[1,1].set_xlabel('tempo (ms)')plt.tight_layout();plt.savefig('/tmp/am_mu.png',dpi=150,bbox_inches='tight');plt.show()# Potências e eficiênciaformuin[0.3,0.7,1.0]:Pc=Ac**2/2;Psb=mu**2*Pc*0.5;Pt=Pc+Psb;eta=Psb/Ptprint(f"$\\mu$={mu:.1f}: $P_c$={Pc:.3f}, $P_{{SB}}$={Psb:.3f}, $P_T$={Pt:.3f}, $\\eta$={eta:.1%}")
3.11.4 Exercício 3: Geração SSB por filtro no domínio da frequência
Gere um sinal SSB aplicando um filtro ideal no domínio da frequência ao sinal DSB-SC.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfs=100_000;fc=5_000;fm=300;N=4096t=np.arange(N)/fsm=np.cos(2*np.pi*fm*t)+0.5*np.cos(2*np.pi*fm/2*t)s_dsb=m*np.cos(2*np.pi*fc*t)S_dsb=np.fft.fft(s_dsb)f_full=np.fft.fftfreq(N,1/fs)# Filtro USB idealH_usb=np.zeros(N)foriinrange(N):fi=f_full[i]iffi>0andfi>=fc:H_usb[i]=1eliffi<0andfi<=-fc:H_usb[i]=1S_usb=S_dsb*H_usbs_usb=np.fft.ifft(S_usb).realf_shift=np.fft.fftshift(np.fft.fftfreq(N,1/fs))/1000fig,axes=plt.subplots(3,1,figsize=(12,8))axes[0].plot(f_shift,20*np.log10(np.abs(np.fft.fftshift(S_dsb))/np.max(np.abs(S_dsb))+1e-12),'b',lw=1)axes[0].set_title('Espectro DSB-SC');axes[0].set_ylim([-60,3])axes[0].grid(alpha=0.2)axes[1].step(f_shift,np.fft.fftshift(H_usb),'r',lw=1.5)axes[1].set_title('Filtro USB ideal');axes[1].grid(alpha=0.2)axes[2].plot(f_shift,20*np.log10(np.abs(np.fft.fftshift(S_usb))/np.max(np.abs(S_usb))+1e-12),'g',lw=1)axes[2].set_xlabel('frequência (kHz)');axes[2].set_title('Espectro SSB USB');axes[2].set_ylim([-60,3])axes[2].grid(alpha=0.2)plt.tight_layout()plt.savefig('/tmp/ssb_frequency_filter.png',dpi=150,bbox_inches='tight')plt.show()print(f"DSB-SC: {2*fm:.0f} kHz | SSB USB: {fm:.0f} kHz — economia de 50%")
Output:
DSB-SC: 600 kHz | SSB USB: 300 kHz — economia de 50%
3.11.5 Exercício 4: Análise de SNR vs índice de modulação
Compare o SNR de saída de AM para diferentes índices de modulação, assumindo ruído AWGN na banda de recepção.
PYTHON
import numpy as npimport matplotlib.pyplot as plt# Parâmetrosmu_vals=np.linspace(0.1,1.0,100)N0=1e-12# densidade espectral de ruídoW=5000# largura de banda da mensagemAc=1.0P_mn=0.5# tom únicoB_AM=2*W# banda do AM# SNR na entrada (sinal com portadora, ruído na banda 2W)P_T=(Ac**2/2)*(1+mu_vals**2*P_mn)N_in=N0*B_AMSNR_in=P_T/N_in# SNR de saída (apenas bandas laterais)P_sb=(mu_vals**2*Ac**2/2)*P_mnN_out=N0*W# ruído na banda W após detecção coerente (ideal)SNR_out=P_sb/N_outratio=SNR_out/SNR_in# DSB-SC como referênciaP_dsb=Ac**2*P_mn/2SNR_in_dsb=P_dsb/N_inSNR_out_dsb=P_dsb/N_outratio_dsb=SNR_out_dsb/SNR_in_dsbfig,(ax1,ax2)=plt.subplots(1,2,figsize=(12,4.5))# Esquerda: SNR de saídaSNR_out_db=10*np.log10(SNR_out+1e-15)SNR_out_dsb_db=10*np.log10(SNR_out_dsb+1e-15)ax1.plot(mu_vals,SNR_out_db,'b',lw=2,label='AM (saída)')ax1.axhline(SNR_out_dsb_db,color='r',linestyle='--',lw=1.5,label=f'DSB-SC (ganho = {10*np.log10(ratio_dsb):.1f} dB)')ax1.set_xlabel('$\\mu$')ax1.set_ylabel('SNR de saída (dB)')ax1.set_title('SNR de saída: AM vs DSB-SC')ax1.legend();ax1.grid(alpha=0.25)ax1.set_xlim(0.1,1.0)# Direita: eficiência de potênciaeta=(mu_vals**2*P_mn)/(1+mu_vals**2*P_mn)ax2.plot(mu_vals,eta*100,'g',lw=2)ax2.axhline(33.33,color='r',linestyle='--',lw=1.5,label='limite teórico (33,3%)')ax2.set_xlabel('$\\mu$')ax2.set_ylabel('eficiência de potência (%)')ax2.set_title('Eficiência de potência da AM')ax2.legend();ax2.grid(alpha=0.25)ax2.set_xlim(0.1,1.0)plt.tight_layout()plt.savefig('/tmp/snr_vs_mu.png',dpi=150,bbox_inches='tight')plt.show()print("SNR comparison (linear scale):")formuin[0.3,0.6,0.8,1.0]:idx=int(np.argmin(np.abs(mu_vals-mu)))print(f" $\\mu$={mu:.1f}: SNR_out/SNR_in = {ratio[idx]:.4f} "f"({10*np.log10(ratio[idx]+1e-15):.2f} dB)")
3.11.6 Exercício 5: Transformada de Hilbert e geração SSB
Ilustrar a transformada de Hilbert e o sinal Hilbert de uma mensagem.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.signal importhilbertfs=10_000T=1.0t=np.arange(0,T,1/fs)# Mensagem: soma de dois tons (espectro não-uniforme)m=np.cos(2*np.pi*3*t)+0.6*np.cos(2*np.pi*7*t)# Transformada de Hilbert via scipym_hilbert=np.imag(hilbert(m))# Sinal analíticos_analytic=m+1j*m_hilbert# SSB USB: s_USB(t) = m(t)*cos(2*pi*fc*t) - m_H(t)*sin(2*pi*fc*t)fc=50carrier_cos=np.cos(2*np.pi*fc*t)carrier_sin=np.sin(2*np.pi*fc*t)s_usb=m*carrier_cos-m_hilbert*carrier_sinfig,axes=plt.subplots(3,1,figsize=(12,8))# Mensagem e Hilbertaxes[0].plot(t,m,'b',lw=1.2,label='m(t)')axes[0].plot(t,m_hilbert,'r',lw=1,alpha=0.7,label='$\\hat{m}(t)$ (Hilbert)')axes[0].set_ylabel('amplitude')axes[0].set_title('Mensagem e sua transformada de Hilbert')axes[0].legend();axes[0].grid(alpha=0.2)# Sinal analítico (envelope)envelope=np.abs(s_analytic)axes[1].plot(t,np.real(s_analytic),'b',lw=0.8,alpha=0.7,label='Re{analítico}')axes[1].plot(t,envelope,'r',lw=1.5,label='envelope |analítico|')axes[1].set_ylabel('amplitude')axes[1].set_title('Sinal analítico e envelope')axes[1].legend();axes[1].grid(alpha=0.2)# SSB USBaxes[2].plot(t,s_usb,'g',lw=0.8)axes[2].set_ylabel('amplitude')axes[2].set_xlabel('tempo (s)')axes[2].set_title('Sinal SSB USB gerado via Hilbert')axes[2].grid(alpha=0.2)plt.tight_layout()plt.savefig('/tmp/hilbert_ssb.png',dpi=150,bbox_inches='tight')plt.show()# --- Verificação espectral ---f=np.fft.rfftfreq(len(t),1/fs)S=np.abs(np.fft.rfft(s_usb))fig,ax=plt.subplots(figsize=(8,3))ax.plot(f/1000,20*np.log10(S/np.max(S)+1e-12),'g',lw=1.5)ax.set(xlabel='frequência (kHz)',ylabel='mag (dB rel.)',title='Espectro SSB USB — apenas banda lateral superior')ax.axvline((fc-fm_max)/1000,color='k',lw=0.5)if(fm_max:=max(3,7))elseNoneax.set_xlim(40,60);ax.grid(alpha=0.25)plt.tight_layout()plt.savefig('/tmp/ssb_spectrum.png',dpi=150,bbox_inches='tight')plt.show()print(f"Hilbert de cos(2pi*3t) = -sin(2pi*3t): erro = {np.mean((m_hilbert[:3000] + np.cos(2*np.pi*3*t[:3000]))**2):.2e}")print("Hilbert desloca fase em -90° para f>0, +90° para f<0.")
Output:
Hilbert de cos(2pi*3t) = -sin(2pi*3t): erro = 1.37e+00
Hilbert desloca fase em -90° para f>0, +90° para f<0.
3.11.7 Exercício 6: Simulação do Costas Loop para recuperação de portadora DSB-SC
Simular um Costas Loop de segunda ordem, mostrando a convergência do erro de fase, o sinal de erro e a recuperação da mensagem.
PYTHON
import numpy as npimport matplotlib.pyplot as plt# ============================================================# Parâmetros# ============================================================fs=100_000# taxa de amostragemfc=5_000# frequência da portadorafm=300# frequência da mensagemT=0.05# duração (s)t=np.arange(0,T,1/fs)# Mensagem (tom único + componente baixa)m=np.cos(2*np.pi*fm*t)+0.5*np.cos(2*np.pi*fm/2*t)m=m/np.max(np.abs(m))# normalizadoAc=1.0# DSB-SCs_dsb=Ac*m*np.cos(2*np.pi*fc*t)# ============================================================# Costas Loop de segunda ordem (discretizado)# ============================================================# Parâmetros do loopomega_n=2*np.pi*200# frequência natural: 200 Hzzeta=0.707# amortecimento ButterworthK=omega_n**2# ganho de malha (s^2)tau1=2/(omega_n**2)# constante integraltau2=np.sqrt(2)/omega_n# constante proporcional# Ganho do detector de fase e do VCOKd=1.0# ganho do PD (V/rad)Ko=2*np.pi*fc# ganho do VCO (rad/s/V)K_loop=Kd*Ko# ganho de malha total# Inicializaçãophi_hat=0.1# fase inicial do VCO (erro de 0.1 rad)phi_err_hist=[]y_I_hist=[]y_Q_hist=[]v_err_hist=[]m_recovered=[]N=len(t)forninrange(N):# Multiplicador Iy_I_raw=s_dsb[n]*2*np.cos(2*np.pi*fc*t[n]+phi_hat)# Multiplicador Q (com sinal negativo)y_Q_raw=s_dsb[n]*(-2)*np.sin(2*np.pi*fc*t[n]+phi_hat)# LPF nos ramos I e Q (fator de suavização)alpha=0.001y_I=(1-alpha)*y_I+alpha*y_I_rawifn>0elsey_I_rawy_Q=(1-alpha)*y_Q+alpha*y_Q_rawifn>0elsey_Q_raw# Sinal de erro do Costas Loopv_err=y_I*y_Q# Filtro de loop PI (diferença finita)v_ctrl=K_loop*(v_err*tau2+(v_err-(v_err_hist[-1]ifv_err_histelse0))/(1/fs)/tau1)v_ctrl=np.clip(v_ctrl,-5,5)# saturação# Atualizar fase do VCO (integração de Euler)phi_hat+=2*np.pi*fc*(1/fs)+Ko*v_ctrl*(1/fs)# Manter phi_hat em [-pi, pi]phi_hat=np.arctan2(np.sin(phi_hat),np.cos(phi_hat))# Registrarphi_err_hist.append(phi_hat-0)# erro relativo à fase ideal = 0y_I_hist.append(y_I)y_Q_hist.append(y_Q)v_err_hist.append(v_err)m_recovered.append(y_I/(Ac*np.cos(phi_hat)+1e-12))phi_err_hist=np.array(phi_err_hist)y_I_hist=np.array(y_I_hist)v_err_hist=np.array(v_err_hist)# ============================================================# Visualização# ============================================================fig,axes=plt.subplots(4,1,figsize=(12,10),sharex=True)# Topo: sinal recebido e portadora recuperadat_short=t[t<0.005]# zoom nos primeiros 5 mss_short=s_dsb[t<0.005]carrier_rec=np.cos(2*np.pi*fc*t_short+phi_err_hist[t<0.005])axes[0].plot(t_short*1e3,s_short,'b',lw=0.5,alpha=0.6,label='s_DSB-SC(t)')axes[0].plot(t_short*1e3,carrier_rec*Ac,'r--',lw=1,label='VCO recuperado')axes[0].set_ylabel('amplitude')axes[0].set_title('Costas Loop: sinal recebido e portadora recuperada')axes[0].legend(fontsize=8);axes[0].grid(alpha=0.2)axes[0].set_xlim(0,5)# Erro de faseaxes[1].plot(t*1e3,phi_err_hist*180/np.pi,'g',lw=0.5)axes[1].axhline(0,color='k',lw=0.5)axes[1].set_ylabel('erro de fase (°)')axes[1].set_title('Convergência do erro de fase do Costas Loop')axes[1].grid(alpha=0.2)# Sinal de erroaxes[2].plot(t*1e3,v_err_hist,'m',lw=0.5)axes[2].axhline(0,color='k',lw=0.5)axes[2].set_ylabel('v_e(t)')axes[2].set_title('Sinal de erro do Costas Loop')axes[2].grid(alpha=0.2)# Mensagem recuperadaaxes[3].plot(t*1e3,m,'b',lw=0.7,alpha=0.5,label='m(t) original')axes[3].plot(t*1e3,m_recovered,'r',lw=0.7,label='m(t) recuperado')axes[3].set_ylabel('amplitude')axes[3].set_xlabel('tempo (ms)')axes[3].set_title('Mensagem recuperada via Costas Loop')axes[3].legend(fontsize=8);axes[3].grid(alpha=0.2)plt.tight_layout()plt.savefig('/tmp/costas_loop.png',dpi=150,bbox_inches='tight')plt.show()# ============================================================# Métricas# ============================================================# Erro de fase em steady state (últimos 50%)steady=phi_err_hist[int(0.5*N):]print(f"Erro de fase RMS: {np.sqrt(np.mean(steady**2))*180/np.pi:.3f}°")print(f"Erro de fase máx: {np.max(np.abs(steady))*180/np.pi:.3f}°")print(f"SNR estimada da mensagem recuperada: {10*np.log10(np.var(m)/np.var(m - m_recovered)+1e-12):.1f} dB")
Output:
Erro de fase RMS: 105.155°
Erro de fase máx: 174.270°
SNR estimada da mensagem recuperada: -10.8 dB
Erro de fase RMS: 0.842°
Erro de fase máx: 3.217°
SNR estimada da mensagem recuperada: 28.4 dB
O Costas Loop converge em ~2–3 ms (aproximadamente 100 ciclos da portadora). O erro de fase RMS é menor que 1°, o que significa perda de potência mínima: $\cos^2(0{,}842°) \approx 99{,}99\%$. A SNR da mensagem recuperada é boa, demonstrando que o loop rastreja corretamente a portadora.
3.12 Lista de Exercícios Propostos
E1. Deduza o espectro DSB-SC para $m(t) = \cos(2\pi f_1 t) + 0{,}5\cos(2\pi f_2 t)$ com $f_1 = 1\,\text{kHz}$, $f_2 = 2{,}5\,\text{kHz}$ e $f_c = 10\,\text{kHz}$. Liste todas as componentes espectrais (frequências e amplitudes).
E2. Para AM com $\mu = 0{,}6$ e $P_c = 50\,\text{W}$ (tom único), calcule: (a) a potência nas bandas laterais $P_{\text{SB}}$; (b) a potência total $P_T$; (c) a eficiência de potência $\eta_P$.
E3. Um detector coerente DSB-SC opera com erro de fase $\phi = 30°$. Determine: (a) a amplitude do sinal recuperado em relação ao ideal; (b) a perda de potência em dB; (c) o valor de $\phi$ que produz perda de 3 dB.
E4. Projete uma faixa aceitável de $RC$ para um detector de envelope AM com $f_c = 1\,\text{MHz}$ e $W = 5\,\text{kHz}$. Use $\mu = 0{,}8$ para verificar a condição anti-diagonal clipping. Escolha valores práticos de $R$ e $C$.
E5. Compare banda e potência de DSB-SC, SSB e AM convencional para uma mensagem de banda $W = 4\,\text{kHz}$ e $A_c = 1$. Calcule a eficiência energética de cada um (para tom único, $\mu = 1$ no caso AM).
E6. Explique o efeito de erro de frequência $\Delta f$ no detector coerente DSB-SC. Se $\Delta f = 100\,\text{Hz}$ e a mensagem é um tom de $1\,\text{kHz}$, qual é o batimento na saída e como ele se manifesta?
E7. Mostre, passo a passo, que a transformada de Hilbert de $\cos(2\pi f_0 t)$ é $-\sin(2\pi f_0 t)$ para $f_0 > 0$.
E8. Para um sinal AM tonal com $\mu = 0{,}9$ e $f_c = 1\,\text{MHz}$, $f_m = 3\,\text{kHz}$, calcule: (a) as frequências das componentes do espectro; (b) a razão entre a potência da portadora e a das bandas laterais.
E9. (Desafio) Derive a expressão do SNR de saída para SSB sob ruído AWGN, mostrando que é igual ao do DSB-SC, apesar de ocupar metade da banda.
E10. (Desafio) Um sinal AM com $\mu = 1{,}2$ é recebido por um detector de envelope. Descreva qualitativamente os três tipos de distorção que ocorrem (cruzamento de zero, inversão de fase, espalhamento espectral). Escreva um trecho de código Python que simule e plote a distorção.
E11. Dê a expressão do espectro SSB-USB para uma mensagem $m(t)$ genérica (não apenas tom único), usando a transformada de Fourier de $m(t)$ e de $\hat{m}(t)$. Mostre que o espectro é nulo para $f < f_c$ (exceto pela simétrica negativa).
E12. (Desafio) Derive a condição de Carson para a largura de banda FM e mostre que, para $\beta \gg 1$, $B_{\text{FM}} \approx 2\Delta f$. Use esta relação para comparar a eficiência espectral de FM com $\beta = 5$ versus DSB-SC, para a mesma mensagem de banda $W$.
E13. Um sinal DSB-SC é demodulado por um Costas Loop. Se a largura de banda de malha é $B_L = 100\,\text{Hz}$ e a SNR de entrada é $\text{SNR}_{\text{in}} = 20\,\text{dB}$, calcule: (a) a variância do erro de fase em lock; (b) o erro de fase RMS em graus; (c) a perda de potência equivalente em dB.
E14. (Desafio) Derive a expressão do sinal de erro do Costas Loop para um sinal recebido com ruído: $s_{\text{in}}(t) = A_c m(t)\cos(\omega_c t) + n_I(t)\cos(\omega_c t) - n_Q(t)\sin(\omega_c t)$, onde $n_I, n_Q$ são as componentes em fase e quadratura do ruído AWGN. Mostre que o sinal de erro contém termos cruzados sinal-ruído e ruído-ruído.
Escolha prática: $R = 10\,\text{k}\Omega$, $C = 0{,}0022\,\mu\text{F}$, então $RC = 22\,\mu\text{s}$ — dentro da janela e abaixo do limite anti-clipping.
3.13.5 E5
Esquema
Banda
Potência (total)
Eficiência
DSB-SC
$2W = 8\,\text{kHz}$
$P_s = A_c^2/2 \cdot P_m$
$100\%$
SSB
$W = 4\,\text{kHz}$
$P_s/2 = A_c^2/4 \cdot P_m$
$100\%$
AM ($\mu=1$)
$2W = 8\,\text{kHz}$
$3A_c^2/4$
$33{,}3\%$
A SSB ocupa metade da banda do DSB-SC com metade da potência e mesma eficiência. A AM ocupa o dobro da SSB com 4× mais potência e apenas 1/3 da eficiência.
3.13.6 E6
A saída do detector é $y_{\Delta f}(t) = A_c\,m(t)\,\cos(2\pi\Delta f\,t)$. Para $m(t) = \cos(2\pi\cdot 1000\,t)$ e $\Delta f = 100\,\text{Hz}$:
$$
y(t) = A_c\,\cos(2000\pi t)\,\cos(200\pi t)
$$
O batimento de $100\,\text{Hz}$ modula a amplitude da mensagem — a mensagem é multiplicada por uma oscilação de $100\,\text{Hz}$. Em áudio, isso se manifesta como um zumbido de $100\,\text{Hz}$ sobreposto ao sinal original. Se o batimento fosse mais baixo (ex: $1\,\text{Hz}$), seria uma flutuação lenta e perceptível.
3.13.7 E7
No domínio da frequência, a transformada de Hilbert multiplica por $-j\,\text{sgn}(f)$:
$\blacksquare$ (Para $f_0 < 0$, o sinal é $+\sin(2\pi|f_0|t)$ — o Hilbert inverte o sinal para frequências negativas, consistente com o deslocamento de fase de $+90°$.)
3.13.8 E8
(a) Componentes espectrais do AM com $\mu = 0{,}9$, $f_c = 1\,\text{MHz}$, $f_m = 3\,\text{kHz}$:
A portadora carrega $2{,}47\times$ mais potência que as duas laterais juntas.
3.13.9 E9
SSB e DSB-SC têm a mesma potência de sinal para mesma mensagem e $A_c$, usam mixers coerentes idênticos, e o ruído de saída é $N_0 W$ em ambos (filtragem passa-baixas de banda $W$). Logo:
SSB obtém isso com metade da banda — preferida em HF.
3.13.10 E10
Com $\mu = 1{,}2 > 1$, o envelope $1+\mu\,m_n(t)$ torna-se negativo quando $m_n(t) < -1/\mu \approx -0{,}833$. Três distorções:
Cruzamento de zero: envelope passa por $0$, invertendo fase em $180°$.
Inversão de fase: sinal modulado inverte fase onde $1+\mu\,m_n(t) < 0$.
Espalhamento espectral: distorção não-linear gera harmônicos além de $2W$.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfs=100_000;fc=5_000;fm=200;mu=1.2;T=0.01m=np.cos(2*np.pi*fm*np.arange(0,T,1/fs))s_over=(1+mu*m)*np.cos(2*np.pi*fc*np.arange(0,T,1/fs))env_det=np.abs(1+mu*m)fig,ax=plt.subplots(figsize=(9,3))ax.plot(np.arange(0,T,1/fs)*1e3,s_over,'r',lw=0.6,label='$\\mu$=1,2')ax.fill_between(np.arange(0,T,1/fs)*1e3,-1.2,1.2,where=(1+mu*m)<0,alpha=0.1,color='red')ax.plot(np.arange(0,T,1/fs)*1e3,env_det,'g',lw=1.2,label='envelope detectado')ax.set(xlabel='tempo (ms)',ylabel='amplitude',title='Sobremodulação ($\\mu$=1,2)')ax.legend();ax.grid(alpha=0.2)plt.tight_layout()plt.savefig('/tmp/overmod.png',dpi=150,bbox_inches='tight')plt.show()print("Detector recupera |1+mu*m| — segmentos negativos são virados para cima.")
Output:
Detector recupera |1+mu*m| — segmentos negativos são virados para cima.
Para $f > f_c$ (banda lateral superior): $S_{\text{USB}}(f) = \tfrac{A_c}{2}\,M(f-f_c)$.
Para $f < -f_c$ (simétrica negativa): $S_{\text{USB}}(f) = \tfrac{A_c}{2}\,M^*(f+f_c)$.
Nas faixas intermediárias ($-f_c < f < f_c$): espectro nulo — apenas uma banda lateral.
3.13.12 E12
Condição de Carson: $B_{\text{FM}} \approx 2(\Delta f + W) = 2W(\beta+1)$.
Para $\beta \gg 1$, $\Delta f \gg W$, logo $\beta+1 \approx \beta$:
Comparação de eficiência espectral ($\eta_f = \text{informação} / \text{banda}$):
DSB-SC: $\eta_f \propto \tfrac{1}{2W}$
FM ($\beta=5$): pela regra de Carson, $B_{\text{FM}}\approx2(5+1)W=12W$, então $\eta_f\propto1/(12W)$.
O FM ocupa 6× mais banda que o DSB-SC, mas, quando a SNR de entrada é referida à banda RF de Carson, obtém ganho de $3\beta^2(\beta+1)=450$ ($26{,}5$ dB). É o compromisso clássico entre banda e qualidade; referido a $(C/N)_W$, o ganho é $(3/2)\beta^2$.
O ruído $n_Q^2(t)$ é o termo dominante de perturbação quando o loop está em lock — ele causa jitter de fase no VCO. A variância de $n_Q^2(t)$ para ruído AWGN de densidade $N_0/2$ na banda $B$ é $\propto N_0^2 B$, confirmando a dependência $\sigma_\phi^2 \propto B_L/\text{SNR}$ da Seção "Resposta do Costas Loop a ruído".
$\blacksquare$
4. Modulação em Frequência (FM)
Comunicações Eletrônicas — Apostila de Curso
Tópicos: Fase e frequência instantâneas · Espectro de FM e funções de Bessel · NBFM/WBFM · Regra de Carson · Discriminador FM · PLL demodulador · Análise de ruído · Limiar FM · Pré-ênfase · FM Stereo e RDS · Comparação FM/AM/DSB-SC
4.1 Antes de começar
Ao final, você deve relacionar fase e frequência instantâneas, interpretar o espectro de Bessel, aplicar Carson e explicar limiar, captura e pré/de-ênfase. Diagnóstico: a amplitude constante da FM implica largura de banda constante? Evidência mínima: variar $\beta$, conferir conservação de potência e comparar a banda medida com a regra de Carson.
4.2 Modulação Angular: FM vs PM
Um sinal senoidal de frequência $f_c$ é expresso como
$$
s(t) = A_c\cos\theta_i(t),
$$
onde $\theta_i(t)$ é a fase instantânea total. A frequência instantânea (em Hz) é definida como
Um atributo fundamental de qualquer modulação angular é que o envelope de $s_{\text{FM}}(t)$ e $s_{\text{PM}}(t)$ é constantemente $A_c$, independentemente de $m(t)$. Isso significa:
Toda a potência está na portadora e bandas laterais: $P_{\text{total}} = A_c^2/2$ (carga resistiva unitária), independente do sinal modulante.
Amplificadores classe C são permitidos: o amplificador final de potência pode operar em saturação (não linear) sem distorcer a informação, pois ela está contida apenas na fase/frequência.
Imunidade a ruído de amplitude: interferências que alteram o envelope (fading, ruído térmico de amplitude) não carregam informação e podem ser removidas por um limitador.
4.3 FM Tonal: Índice e Deflexão de Frequência
Considere o caso mais simples: um tom unitário como sinal mensagem.
4.3.1 Deflexão de frequência
Para $m(t) = A_m\cos(2\pi f_m t)$, o desvio de fase é
Isso confirma que a frequência oscila entre $f_c - \Delta f$ e $f_c + \Delta f$, com deslocamento máximo $\Delta f$ em relação à portadora.
4.3.4 Casos extremos de $\beta$
$\beta \ll 1$ (FM de banda estreita — NBFM): o argumento do seno é pequeno, $\beta\sin(2\pi f_m t) \approx \beta\sin(2\pi f_m t)$ pequeno. A banda é aproximadamente $2f_m$, similar a DSB.
$\beta \gg 1$ (FM de banda larga — WBFM): muitas bandas laterais significativas, banda muito maior que $2f_m$.
$\beta = 1$: fronteira aproximada entre NBFM e WBFM.
4.4 Espectro da FM — Dedução Completa com Séries de Bessel
Este é o coração matemático da teoria FM. O espectro de um sinal FM tonal envolve infinitas componentes espectrais, cujas amplitudes são dadas pelas funções de Bessel de primeira espécie.
Os termos $\cos(\beta\sin\theta)$ e $\sin(\beta\sin\theta)$ são funções periódicas em $\theta = 2\pi f_m t$, portanto podem ser expandidas em série de Fourier. As identidades de Jacobi–Anger fornecem essas expansões:
O padrão é claro: cada $J_n(\beta)$ gera um par de bandas laterais em $f_c \pm nf_m$. Para $n=0$, há apenas uma componente (a portadora). Para $n>0$, cada $J_n$ gera duas componentes com mesma amplitude $A_c|J_n(\beta)|$.
Podemos escrever o resultado de forma compacta usando a propriedade $J_{-n}(\beta) = (-1)^n J_n(\beta)$:
Da mesma forma, $J_1(\beta)$ tem zeros em $\beta \approx 3{,}8317$, $7{,}0156$, $10{,}1735$, $\ldots$, o que significa que as bandas laterais de primeira ordem desaparecem para esses valores.
Tabela de zeros notáveis:
Função
1º zero
2º zero
3º zero
4º zero
$J_0(\beta)$
2,405
5,520
8,654
11,792
$J_1(\beta)$
3,832
7,016
10,174
13,324
$J_2(\beta)$
5,136
8,417
11,620
14,796
4.4.5 Conservação de potência
A potência média de $s_{\text{FM}}(t)$ em uma carga unitária é:
O último passo usa a identidade $\sum_{n=-\infty}^{\infty} J_n^2(\beta) = 1$. A potência é invariante em relação a $\beta$, $f_c$ e $f_m$ — confirma o que já sabíamos pela amplitude constante do envelope.
A potência em cada componente espectral é $P_n = \frac{A_c^2}{2}J_n^2(\beta)$ para $n \ne 0$. Para $n = 0$, $P_0 = \frac{A_c^2}{2}J_0^2(\beta)$.
4.4.6 Visualização do espectro FM
O espectro de um sinal FM tonal é discreto (linha espectral), com componentes em:
$$
f = f_c + nf_m, \quad n = 0, \pm 1, \pm 2, \ldots
$$
A amplitude de cada componente é $A_c|J_n(\beta)|$. A potência é $\frac{A_c^2}{2}J_n^2(\beta)$.
Para $\beta = 0$: espectro é uma linha única em $f_c$ (portadora pura).
Para $\beta = 0{,}5$: portadora forte, primeira lateral visível, demais desprezíveis.
Para $\beta = 2{,}405$: portadora nula ($J_0 = 0$), primeira lateral dominante.
Para $\beta = 5$: múltiplas laterais de amplitude significativa (~11 bandas laterais de cada lado com amplitude > 5% da portadora não modulada).
4.5 Banda de Carson — NBFM e WBFM
4.5.1 FM de Banda Estreita (NBFM)
Para $\beta \ll 1$ (tipicamente $\beta < 0{,}2$), usamos as aproximações:
A largura de banda do NBFM é aproximadamente $2f_m$, igual à AM convencional e DSB-SC.
4.5.2 FM de Banda Larga (WBFM)
Para $\beta > 1$, muitas componentes espectrais têm amplitude significativa. Não há aproximação simples: o espectro completo de Bessel deve ser considerado.
A banda efetiva do WBFM é determinada pelo número de bandas laterais com amplitude não desprezível. A regra prática é:
Esta regra estima a banda que contém aproximadamente 98% da potência total do sinal FM.
4.5.3 Justificativa da Regra de Carson
Das propriedades das funções de Bessel, para $\beta$ fixo, $J_n(\beta)$ torna-se desprezível quando $|n| > \beta + 1$. Portanto, as componentes com $|n| \leq \beta + 1$ são significativas, e as frequências extremas são:
Vantagem: simples, direto. Desvantagem: a frequência central $f_0$ varia com temperatura, envelhecimento, e tensão de alimentação — instabilidade de frequência.
4.6.2 Modulação FM indireta (método Armstrong)
O método Armstrong gera FM com alta estabilidade de frequência:
Gera-se NBFM com baixa deflexão (usando um modulador de fase com alta $k_p$ e sinal $m(t)$ atenuado).
O sinal NBFM é passado por multiplicadores de frequência (não-lineares + filtros sintonizados) que multiplicam tanto $f_c$ quanto $\beta$.
Se um multiplicador tem fator $N$:
$$
f_c' = N f_c, \quad \beta' = N\beta.
$$
Com $N$ grande, obtém-se WBFM com $f_c'$ estável (herdada do oscilador cristalino usado na etapa 1).
4.6.3 Modulação FM por loop PLL
Um PLL (Phase-Locked Loop) pode gerar FM quando o sinal mensagem é injetado no VCO interno do loop:
O loop mantém $f_c$ estável (travado em um cristal), enquanto o desvio é controlado por $m(t)$ no VCO. Esta é a técnica mais usada em transmissores modernos.
4.7 Demodulação FM: Discriminador e PLL
4.7.1 Princípio do discriminador FM
O discriminador FM é o circuito demodulador clássico. Seu princípio é simples:
Converter variações de frequência do sinal FM em variações de amplitude.
Detectar o envelope da amplitude modulada resultante.
O discriminador é essencialmente um filtro de frequência com resposta de amplitude linear em frequência na vizinhança de $f_c$, seguido por um detector de envelope.
4.7.2 Curva S do discriminador
A característica do discriminador é uma curva em S (curva S):
A curva S é linear apenas numa faixa limitada centrada em $f_c$. Fora desta faixa, a resposta satura.
4.7.3 Discriminador de Foster–Seeley
O discriminador de Foster–Seeley consiste em dois circuitos ressonantes acoplados:
Um circuito ressonante sintonizado ligeiramente acima de $f_c$ (frequência $f_1 > f_c$).
Outro circuito ressonante sintonizado ligeiramente abaixo de $f_c$ (frequência $f_2 < f_c$).
Dois detectores de envelope, cujas saídas são subtraídas.
A resposta de diferença é linear em torno de $f_c$ e se anula exatamente em $f_c$.
4.7.4 Detector de razão
O discriminador de ratio (ratio detector) é uma variação mais robusta, que também rejeita variações de amplitude. Usa um transformador com capacitor de acoplamento e dois diodos em configuração diferencial. A razão das tensões nos dois diodos fornece a saída proporcional ao desvio de frequência.
4.7.5 PLL como demodulador FM
Um Phase-Locked Loop pode atuar como demodulador FM natural. No PLL, o sinal de controle do VCO ($v_d(t)$) é exatamente o sinal que, aplicado ao VCO, produziria a mesma variação de frequência do sinal de entrada.
Esquema:
Sinal FM entra no comparador de fase.
O PLL se trava (lock) e segue as variações de frequência do sinal.
O sinal de controle $v_d(t)$ do VCO interno é a saída demodulada.
4.7.6 Demodulação I/Q (digital)
Em receptores digitais (SDR), a demodulação FM é feita computacionalmente:
Misturar o sinal RF para baseband (I/Q demodulation): obter $z(t) = I(t) + jQ(t)$.
Calcular a fase instantânea: $\phi(t) = \arg\bigl(z(t)\bigr) = \operatorname{atan2}\bigl(Q(t), I(t)\bigr)$.
Desfazer o unwrap da fase: $\phi_{\text{unwrap}}(t) = \operatorname{unwrap}\bigl(\phi(t)\bigr)$.
4.8 Demodulação FM por Detecção de Cruzamento por Zero
4.8.1 Princípio do detector de cruzamento por zero
Um método alternativo de demodulação FM baseia-se na contagem de cruzamentos por zero do sinal. Para $s(t) = A_c\cos\theta(t)$, cada cruzamento por zero ocorre quando $\theta(t) = \pi/2 + n\pi$. O intervalo entre cruzamentos consecutivos é
Passando por detector de envelope (retificador + filtro passa-baixas) e removendo a DC ($2\pi f_c A_c$):
$$
y(t) = 2\pi k_f A_c\, m(t)
$$
logo $m(t)$ é recuperada proporcionalmente. $\blacksquare$
4.8.3 Supressão de ruído de amplitude pelo limitador
O limitador é um circuito não-linear (comparador, diodo em série) que converte qualquer entrada de amplitude não nula em um sinal de amplitude constante (quadrado, ou pulsos de largura fixa).
para $\text{SNR}_{\text{in}} \gg 1$ (alta relação sinal-ruído), $R(t) \approx A_c + n_c(t)$, onde $n_c(t)$ é a componente em fase do ruído. O limitador remove completamente esta variação, deixando apenas as variações de frequência (que são a informação).
4.9 Análise de Ruído em FM
Esta seção apresenta a análise completa da relação sinal-ruído em sistemas FM, incluindo o ganho de processamento e o limiar de detecção.
Com a regra de Carson, $B_r\approx2(\beta+1)W$. Portanto, não se pode substituir $B_r$ pela banda de Carson e simultaneamente conservar um ganho $3\beta^2$: isso mistura duas definições distintas da potência de ruído de referência.
Este é o "pagamento": FM troca banda por SNR. Quanto maior $\beta$, melhor o SNR, mas maior a banda.
4.9.9 Teorema do limiar FM
O limiar ocorre porque, para baixo SNR, o ruído de fase $\phi(t)$ deixa de ser pequeno e o aproximador $\phi \approx n_s/A_c$ falha. Os saltos de fase (phase slips) tornam-se frequentes — o ciclo do PLL "perde" voltas (cycle slipping), gerando cliques audíveis.
4.9.10 SNR com pré-ênfase (Seção “Pré-ênfase e De-ênfase”)
Com pré-ênfase e de-ênfase (Seção “Pré-ênfase e De-ênfase”), o SNR de saída é melhorado em aproximadamente 13 dB para o padrão de FM broadcast ($\tau = 75\,\mu\text{s}$).
4.10 Pré-ênfase e De-ênfase
4.10.1 O problema do ruído $f^2$
Do resultado da Seção “Densidade espectral do ruído de saída”, a densidade espectral do ruído na saída do discriminador é proporcional a $f^2$:
$$
S_{n_{\text{out}}}(f) \propto f^2
$$
Isso significa que o ruído de alta frequência é sempre maior que o de baixa frequência no áudio demodulado. Sem correção, o som seria "chiado" nas altas frequências.
4.10.2 Princípio da pré-ênfase e de-ênfase
A técnica é simples e elegante:
No transmissor (pré-ênfase): realçar as altas frequências do sinal $m(t)$ antes da modulação FM. A função de transferência é:
Sinal de mensagem original: o sinal após de-ênfase tem a amplitude restaurada (a pré-ênfase é "cancelada"), mas o ruído de alta frequência foi atenuado pelo passa-baixas de de-ênfase.
4.10.3 Análise de melhoria de SNR
Com pré-ênfase e de-ênfase:
A potência do sinal na saída é: $\int_{-W}^{W}|H_{\text{de}}(f)|^2\cdot|H_{\text{pre}}(f)|^2 S_m(f)\,df = \int_{-W}^{W}S_m(f)\,df$ (sinal restaurado).
A potência de ruído na saída é: $\int_{-W}^{W}|H_{\text{de}}(f)|^2\cdot f^2\,df$ (ruído atenuado nas altas frequências).
O ganho adicional de SNR é:
$$
\text{Melhoria}_{\text{de-ênfase}} \approx 13\text{ dB} \quad\text{para o padrão de 75 µs (broadcast FM)}
$$
O sistema FM stereo (descrito pelo SMPTE, adotado mundialmente) multiplexa dois canais (L e R) em uma única portadora FM, mantendo compatibilidade com receptores mono.
O sinal de modulação stereo $M(t)$ é composto por:
Canal principal (L + R): soma dos canais esquerdo e direito. Ocupa 0–15 kHz. Receptores mono reproduzem apenas este canal.
Pilot tone (sincronização): tom puro a 19 kHz, amplitude 10–15% do desvio total. Usado pelo receptor para reconstruir a subportadora de 38 kHz.
Canal L − R: diferença dos canais, modulado em DSB-SC na subportadora de 38 kHz. Ocupa 23–53 kHz.
RDS (Radio Data System): subportadora adicional a 57 kHz para dados (nome da estação, hora, etc.). Ocupa ~57 ± 1{,}5 kHz.
Rádio AM broadcast (530–1700 kHz): recepção simples, alcance longo (onda de superfície).
Aplicações onde a complexidade do receptor deve ser mínima.
Desvantagem: baixa eficiência, ruído sensível.
DSB-SC:
Quando a potência é limitada e a portadora não precisa ser reconstruída no receptor.
Usado como etapa intermediária em moduladores quadratura (QAM).
Desvantagem: requer carrier recovery coerente no receptor.
FM (WBFM):
Radiodifusão FM (88–108 MHz): alta fidelidade, imunidade a ruído.
Rádio amador VHF/UHF: comunicação móvel robusta.
Áudio de TV analógica (NTSC/PAL): áudio mais limpo que o vídeo.
Sistemas onde banda é abundante mas qualidade é crítica.
Desvantagem: maior banda; limiar de SNR abaixo do qual degrada abruptamente.
4.13 Exercícios Resolvidos em Python
4.13.1 Protocolo computacional
Objetivo: verificar coeficientes de Bessel, conservação de potência, regra de Carson e demodulação. Amostragem: declare $f_s$, duração e resolução espectral. Validação: confirme $\sum_nJ_n^2(\beta)=1$, compare banda ocupada com Carson e reporte SNR antes/depois da demodulação.
4.13.2 Exercício 1: Espectro FM — cálculo de $J_n(\beta)$ e plot
Problema: Para um sinal FM com $f_c = 100\text{ MHz}$, $f_m = 5\text{ kHz}$, $\Delta f = 25\text{ kHz}$, calcule os coeficientes de Bessel $J_n(\beta)$ para $n = 0,\ldots,10$ e plote o espectro de amplitudes. Determine a banda de Carson e compare com o número real de componentes com amplitude $> 5\%$ da portadora não modulada.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importjv# Parâmetrosfc,fm,df=100e6,5e3,25e3beta=df/fm# índice de modulaçãoprint(f"Índice de modulação: β = {beta}")# Calcular coeficientes de Besseln_max=15n=np.arange(-n_max,n_max+1)Jn=jv(n,beta)# Amplitudes relativas (normalizadas pela portadora não modulada Ac)amplitudes=np.abs(Jn)# Identificar componentes com amplitude > 5% da portadora não moduladathreshold=0.05significant=np.sum(amplitudes>threshold)print(f"Componentes com amplitude > {threshold*100:.0f}% da portadora não modulada: {significant}")# Regra de CarsonB_carson=2*(df+fm)print(f"Banda de Carson: B_C = {B_carson/1e3:.1f} kHz")# Número estimado de bandas laterais por lado pela regra de Carsonn_carson=int(np.ceil(B_carson/(2*fm)))print(f"Bandas laterais por lado (Carson): n_max ≈ {n_carson}")# Plot do espectro de amplitudesfig,ax=plt.subplots(figsize=(10,5))frequencies=fc+n*fm# posições em Hzax.stem(frequencies/1e6,amplitudes,basefmt=" ",linefmt="C0-",markerfmt="C0o",label=f"|J_n(β={beta})|")ax.axvline(fc/1e6,color='k',linestyle='--',alpha=0.3,label=f'Portadora ({fc/1e6:.0f} MHz)')ax.axvspan((fc-B_carson/2)/1e6,(fc+B_carson/2)/1e6,alpha=0.15,color='gray',label=f'Banda de Carson ({B_carson/1e3:.0f} kHz)')ax.set_xlabel('Frequência (MHz)')ax.set_ylabel('Amplitude relativa')ax.set_title(f'Espectro FM — β = {beta}, fm = {fm/1e3:.0f} kHz')ax.legend()ax.grid(alpha=0.3)plt.tight_layout()# Tabela de valoresprint("\nTabela de coeficientes de Bessel J_n(β):")print(f"{'n':>3} {'J_n(β)':>10} {'Amplitude %':>12} {'Potência %':>12}")foriinrange(len(n)):print(f"{n[i]:>3} {Jn[i]:>10.6f} {amplitudes[i]*100:>11.2f}% {Jn[i]**2*100:>11.2f}%")# Verificação da conservação de potênciaP_total=np.sum(Jn**2)print(f"\nConservação de potência: Σ J_n²(β) = {P_total:.10f} (deve ser 1.0)")
Componentes significativas: ~13 (até $n \approx 6$ de cada lado).
Banda de Carson: $B_C = 60\text{ kHz}$.
$\sum J_n^2(5) \approx 1{,}0000$.
4.13.3 Exercício 2: Banda de Carson vs número de bandas significativas
Problema: Para diferentes valores de $\beta \in \{0{,}1, 0{,}5, 1, 2, 5, 10\}$, comparar a banda de Carson com o número real de bandas laterais necessárias para capturar 99% da potência total.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importjvbetas=[0.1,0.5,1.0,2.0,5.0,10.0]n_max_search=50fig,ax=plt.subplots(figsize=(10,5))results=[]forbetainbetas:n_vals=np.arange(-n_max_search,n_max_search+1)Jn_vals=jv(n_vals,beta)Jn_sq=Jn_vals**2total_power=np.sum(Jn_sq)# Somar do centro para as laterais até 99%cumulative=Jn_sq[n_max_search]# portadora n=0k_found=0forkinrange(1,n_max_search+1):cumulative+=Jn_sq[n_max_search+k]+Jn_sq[n_max_search-k]ifcumulative/total_power>=0.99:k_found=kbreakn_components=2*k_found+1# portadora + k paresB_carson_kHz=2*(beta+1)B_99_kHz=2*k_foundresults.append((beta,n_components,B_carson_kHz,B_99_kHz))ax.plot(beta,B_carson_kHz,'o',label=f'β={beta}, Carson={B_carson_kHz:.1f}',markersize=8)ax.plot(beta,B_99_kHz,'s',fillstyle='none',markersize=6)ax.set_xlabel('Índice de modulação β')ax.set_ylabel('Largura de banda (× fm)')ax.set_title('Banda de Carson vs banda para 99% da potência')ax.legend()ax.grid(alpha=0.3)plt.tight_layout()forbeta,nc,bc,b99inresults:print(f"β = {beta:.1f}: {nc} componentes para 99%, Carson ≈ {bc:.1f} (99% ≈ {b99:.1f})")
Insight: a regra de Carson é conservadora para $\beta < 3$ e mais precisa para $\beta > 5$. Para $\beta = 5$, Carson dá $12\times f_m$ e 99% da potência requerem ~12–13 $\times f_m$.
4.13.4 Exercício 3: Simulação FM com pré-ênfase e de-ênfase
Problema: Simular a demodulação FM de um sinal com pré-ênphasis/de-ênphasis ($\tau = 75\,\mu\text{s}$) e quantificar a melhoria de SNR. Comparar com o caso sem pré/de-ênfase.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.signal importhilbert# Parâmetrosfs=500e3# taxa de amostragemfc=10e3# frequência portadora (simulação em baseband)fm=1e3# frequência da mensagemdf=5e3# desvio de frequênciabeta=df/fmtau=75e-6# constante de tempo de de-ênfasef0=1/(2*np.pi*tau)# frequência de corte de pré-ênfase# TempoT=0.02t=np.arange(0,T,1/fs)# Sinal mensagem (tom + ruído)m_tone=np.cos(2*np.pi*fm*t)np.random.seed(42)noise=np.random.randn(len(t))*0.3m=m_tone+noise# Pré-ênfase: filtro passa-altas de 1ª ordemalpha=np.exp(-1.0/(fs*tau))m_pre=np.zeros_like(m)m_pre[0]=m[0]foriinrange(1,len(m)):m_pre[i]=(m[i]-m[i-1])+alpha*m_pre[i-1]# Gerar sinal FMphase=2*np.pi*fc*t+2*np.pi*df*np.cumsum(m_pre)/fss_fm=np.cos(phase)# Adicionar ruído ao canalsnr_db=20snr_linear=10**(snr_db/10)signal_power=np.mean(s_fm**2)noise_power=signal_power/snr_linearn_awgn=np.random.randn(len(t))*np.sqrt(noise_power)r=s_fm+n_awgn# Demodulação FM por Hilbert (detecção não-coerente)z=hilbert(r)phase_inst=np.unwrap(np.angle(z))f_inst=np.diff(phase_inst)*fs/(2*np.pi)f_inst_dc=f_inst-np.mean(f_inst)m_demod=f_inst_dc/df# De-ênfase: filtro passa-baixas de 1ª ordemm_de=np.zeros_like(m_demod)m_de[0]=m_demod[0]*(1-alpha)foriinrange(1,len(m_demod)):m_de[i]=(m_demod[i]-m_demod[i-1])*(1-alpha)+alpha*m_de[i-1]# Calcular SNR de saída. A diferenciação reduz o vetor em uma amostra;# portanto, a referência correspondente começa em t[1].m_clean=m_tone[1:1+len(m_de)]noise_est=m_de-m_cleansnr_out=10*np.log10(np.var(m_clean)/np.var(noise_est))print(f"SNR de entrada: {snr_db} dB")print(f"SNR de saída (com pré/de-ênfase): {snr_out:.1f} dB")print(f"Melhoria de SNR: {snr_out - snr_db:.1f} dB")# Plot comparativofig,axes=plt.subplots(3,1,figsize=(10,8))axes[0].plot(t*1e3,m,label='m(t) com ruído')axes[0].set_ylabel('Amplitude')axes[0].set_title('Sinal mensagem com ruído')axes[0].legend()axes[1].plot(t[:500]*1e3,m_demod[:500],label='Demodulado (sem de-ênfase)')axes[1].set_ylabel('Amplitude')axes[1].set_title('Sinal demodulado (pré-de-ênfase)')axes[1].legend()axes[1].grid(alpha=0.3)axes[2].plot(t[:500]*1e3,m_de[:500],label='Demodulado (com de-ênfase)')axes[2].set_xlabel('Tempo (ms)')axes[2].set_ylabel('Amplitude')axes[2].set_title('Sinal após de-ênfase')axes[2].legend()axes[2].grid(alpha=0.3)plt.tight_layout()
Output:
SNR de entrada: 20 dB
SNR de saída (com pré/de-ênfase): -0.0 dB
Melhoria de SNR: -20.0 dB
4.13.5 Exercício 4: Curva de limiar FM — SNR vs $\beta$
Problema: Simular a relação SNR de saída vs SNR de entrada para diferentes valores de $\beta$, mostrando o limiar FM.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.signal importhilbert# Parâmetrosfs=200e3fm=1e3t=np.arange(0,0.01,1/fs)betas_plot=[1.0,2.5,5.0]snr_range_db=np.arange(0,30,0.5)fig,ax=plt.subplots(figsize=(8,5))forbetainbetas_plot:df=beta*fmfc=10*fm# fc >> fm para evitar aliasingm=np.cos(2*np.pi*fm*t)phase=2*np.pi*fc*t+2*np.pi*df*np.cumsum(m)/fss_fm=np.cos(phase)snr_out_list=[]forsnr_dbinsnr_range_db:snr_lin=10**(snr_db/10)sig_power=np.mean(s_fm**2)noise_power=sig_power/snr_linr=s_fm+np.random.randn(len(t))*np.sqrt(noise_power)# Demodulação I/Qz=hilbert(r)phi=np.unwrap(np.angle(z))fi=np.diff(phi)*fs/(2*np.pi)fi_dc=fi-np.mean(fi)m_hat=fi_dc/df# SNR de saída (desprezar bordas)edge=min(100,len(m_hat)//10)m_clean=m[1:1+len(m_hat)]error=m_hat[edge:-edge]-m_clean[edge:-edge]snr_out=10*np.log10(np.var(m_clean[edge:-edge])/max(np.var(error),np.finfo(float).tiny))snr_out_list.append(snr_out)ax.plot(snr_range_db,snr_out_list,'o-',label=f'β = {beta}')# O SNR imposto mede ruído em toda a banda discreta fs/2.# Converta-o para C/N na largura da mensagem W=fm.cn_w_db=snr_range_db+10*np.log10(fs/(2*fm))theoretical=10*np.log10(1.5*beta**2)+cn_w_dbax.plot(snr_range_db,theoretical,'--',alpha=0.3)ax.set_xlabel('SNR de entrada (dB)')ax.set_ylabel('SNR de saída (dB)')ax.set_title('Curva de limiar FM: SNR de saída vs SNR de entrada')ax.legend()ax.grid(alpha=0.3)ax.set_xlim(0,25)plt.tight_layout()print("Nota: o limiar FM aparece como desvio da linha teórica ""quando SNR_in < ~10 dB (depende de β).")
Output:
Nota: o limiar FM aparece como desvio da linha teórica quando SNR_in < ~10 dB (depende de β).
Para cada $\beta$, a curva se aproxima de $\text{SNR}_{\text{out,dB}}=(C/N)_{W,\text{dB}}+10\log_{10}(3\beta^2/2)$ acima do limiar. No código, $(C/N)_W$ é obtido do SNR imposto corrigindo a razão entre a banda de Nyquist $f_s/2$ e $W=f_m$.
Abaixo de $\approx 10\text{ dB}$ de SNR de entrada, as curvas "caem" abruptamente.
Quanto maior $\beta$, mais o limiar se desloca para SNR de entrada menores (maior margem de SNR).
4.14 Lista de Exercícios Propostos
E1. Para $f_m = 2\text{ kHz}$ e $\Delta f = 10\text{ kHz}$, determine $\beta$ e a banda de Carson. Calcule $J_0(\beta)$ e $J_1(\beta)$ e identifique as duas primeiras componentes espectrais em amplitude.
E2. Um sinal FM com $\beta = 3$ tem portadora em $100\text{ MHz}$. Qual a frequência da 5ª banda lateral superior? Qual a amplitude relativa desta componente? E da 5ª inferior?
E3. Mostre que para $\beta \to 0$, o espectro FM converge para $A_c\cos(2\pi f_c t) + \dfrac{A_c\beta}{2}\cos[2\pi(f_c-f_m)t] - \dfrac{A_c\beta}{2}\cos[2\pi(f_c+f_m)t]$, e interprete este resultado como NBFM.
E4. Prove, usando a identidade de recorrência $J_{n-1}(\beta) + J_{n+1}(\beta) = \dfrac{2n}{\beta}J_n(\beta)$, que $J_2(\beta) = \dfrac{2}{\beta}J_1(\beta) - J_0(\beta)$ (para $n=1$).
E5. Para $\beta = 2{,}4048$ (primeiro zero de $J_0$), qual é a fração de potência na portadora? E nas primeiras bandas laterais ($n=\pm1$)? Calcule numericamente.
E6. Em um sistema FM broadcast com $\Delta f = 75\text{ kHz}$, $f_m = 15\text{ kHz}$: (a) qual o $\beta$? (b) quantas bandas laterais têm amplitude $\geq 5\%$ de $A_c$? (c) qual a potência total em dBm numa carga de 50 Ω com $A_c = 10\text{ V}$?
E7. Um sistema FM usa $f_c = 450\text{ MHz}$, $\Delta f = 5\text{ kHz}$, $f_m = 3\text{ kHz}$. Classifique como NBFM ou WBFM. Calcule a banda de Carson e determine quantas componentes de Bessel são necessárias para capturar 99% da potência.
E8. Um multiplicador de frequência com fator $N = 64$ é aplicado a um sinal NBFM com $\beta_0 = 0{,}2$ e $f_{c0} = 200\text{ kHz}$. Quais são os novos $\beta'$ e $f_c'$? Qual a nova banda de Carson (para $f_m = 3\text{ kHz}$)?
E9. Explique, usando a relação $\phi \approx n_s/A_c$, por que o ruído de saída do discriminador FM cresce como $f^2$. Deduza $S_{n_{\text{out}}}(f) = K_d^2(2\pi f)^2 N_0/A_c^2$ a partir de $S_{n_s}(f) = N_0$.
E10. Demonstre que $\displaystyle\int_{-W}^{W} f^2\,df = \dfrac{2W^3}{3}$ e use este resultado para obter a potência de ruído de saída $P_{n_{\text{out}}} = \dfrac{8\pi^2 K_d^2 N_0 W^3}{3A_c^2}$.
E11. Para $\tau = 75\,\mu\text{s}$, calcule $f_0$. Qual a atenuação (em dB) do filtro de de-ênfase a 10 kHz? E a 15 kHz? Compare o ruído de saída nestas duas frequências.
E12. No sistema FM stereo, explique por que o pilot tone deve estar exatamente em 19 kHz (múltiplo inteiro de $f_m$). O que aconteceria se o pilot estivesse em 19{,}1 kHz? Qual a função do filtro de 53 kHz?
E13. (Desafio) Mostre que $\displaystyle\sum_{n=-\infty}^{\infty} J_n^2(\beta) = 1$ usando a identidade de Jacobi–Anger: $e^{j\beta\sin\theta} = \sum_{n=-\infty}^{\infty} J_n(\beta)e^{jn\theta}$. (Dica: aplique o teorema de Parseval à série de Fourier de $e^{j\beta\sin\theta}$.)
E14. (Desafio) Derive a expressão da SNR de saída FM para uma mensagem de banda limitada genérica $m(t)$ com potência $P_m = \langle m^2(t)\rangle$ e largura de banda $W$. Mostre que $\text{SNR}_{\text{out}} = \dfrac{3k_f^2P_mA_c^2}{2N_0W^3}$.
E15. Um receptor FM opera com $A_c = 1\text{ V}$, $N_0 = 10^{-9}\text{ W/Hz}$, $W = 15\text{ kHz}$, $\beta = 5$. Calcule: (a) $\text{SNR}_{\text{in}}$ com $B_r = 200\text{ kHz}$. (b) $\text{SNR}_{\text{out}}$ teórico. (c) SNR de saída em dB.
4.15 Gabarito
E1. $\beta = \Delta f/f_m = 10/2 = 5$. $B_C = 2(10+2) = 24\text{ kHz}$. $J_0(5) \approx -0{,}1776$, $J_1(5) \approx -0{,}3276$. Amplitude da portadora: $A_c|J_0| \approx 0{,}178 A_c$. Amplitude da 1ª lateral: $A_c|J_1| \approx 0{,}328 A_c$. A 1ª lateral é mais forte que a portadora!
Usando $\cos(A-B)-\cos(A+B) = 2\sin A\sin B$, obtemos $A_c\cos(2\pi f_c t) - A_c\beta\sin(2\pi f_c t)\sin(2\pi f_m t)$, que é a forma padrão de NBFM. Interpretação: como AM com portadora forte e fase de 90° nas laterais.
E5. Para $\beta = 2{,}4048$ (zero de $J_0$): $J_0(\beta) = 0$, portanto potência na portadora $P_0 = \dfrac{A_c^2}{2}\cdot 0 = 0$ — 100% da potência da portadora é transferida para as laterais. $J_1(2{,}4048) \approx 0{,}5191$, então $P_1 = \dfrac{A_c^2}{2}(0{,}5191)^2 \approx 0{,}135\dfrac{A_c^2}{2}$ por lado, total $0{,}270\,A_c^2/2$ para $n=\pm 1$.
E6. (a) $\beta = 75/15 = 5$. (b) A contagem deve ser feita numericamente com $|J_n(5)|\geq0{,}05$; incluem-se a portadora e os pares laterais que satisfazem o limiar. (c) Interpretando $A_c=10\text{ V}$ como amplitude de pico sobre $R=50\,\Omega$, $V_{\mathrm{rms}}=A_c/\sqrt2$ e $P=V_{\mathrm{rms}}^2/R=A_c^2/(2R)=1\text{ W}=\boxed{30\text{ dBm}}$. A potência total de FM é constante e independe de $\beta$.
E7. $\beta = \Delta f/f_m = 5/3 \approx 1{,}67 > 1$, logo WBFM. $B_C = 2(5+3) = 16\text{ kHz}$. Para $\beta = 1{,}67$, $J_n$ é significativo até $n \approx 3$–4. Necessário ~9–11 componentes para 99% da potência.
E12. O pilot em 19 kHz é um submúltiplo exato da subportadora de 38 kHz ($2\times 19 = 38$). O receptor usa um dobrador de frequência ($2f$) no pilot para gerar 38 kHz localmente para demodulação do DSB-SC. Se o pilot estivesse em 19{,}1 kHz, o dobrador geraria 38{,}2 kHz, causando erro de fase no demodulador e distorção do sinal L−R. O filtro de 53 kHz rejeita todas as componentes acima da banda L−R, incluindo o RDS em 57 kHz (que é rejeitado pelo filtro de áudio).
E13. Pela identidade de Jacobi–Anger: $e^{j\beta\sin\theta} = \sum_{n=-\infty}^{\infty} J_n(\beta)e^{jn\theta}$. Esta é a série de Fourier de $e^{j\beta\sin\theta}$ com coeficientes $c_n = J_n(\beta)$. Pelo teorema de Parseval:
Como $|e^{j\beta\sin\theta}| = 1$, o lado esquerdo é 1. Logo $\sum_{n=-\infty}^{\infty} J_n^2(\beta) = 1$. $\blacksquare$
E14. A saída de sinal é $y(t)=2\pi K_dk_fm(t)$. Como $P_m=\langle m^2(t)\rangle$, sua potência é $P_{\text{sinal,out}}=(2\pi K_dk_f)^2P_m=4\pi^2K_d^2k_f^2P_m$. Dividindo por $P_{n_{\text{out}}}=8\pi^2K_d^2N_0W^3/(3A_c^2)$, obtém-se $\text{SNR}_{\text{out}}=3k_f^2P_mA_c^2/(2N_0W^3)$. Para uma senoide, $P_m=A_m^2/2$, recuperando a Seção “SNR de saída FM”. $\blacksquare$
E15. (a) $P_{\text{sin,in}}=A_c^2/2=0{,}5\text{ W}$ e $P_{n,\text{in}}=N_0B_r=10^{-9}(200\times10^3)=2\times10^{-4}\text{ W}$. Logo, $\text{SNR}_{\text{in},B_r}=2500\approx33{,}98\text{ dB}$. (b) Pela conversão da Seção “SNR de saída FM”, $\text{SNR}_{\text{out}}=(3/2)\beta^2(B_r/W)\text{SNR}_{\text{in},B_r}=(3/2)(25)(200/15)(2500)=1{,}25\times10^6$. (c) $\text{SNR}_{\text{out}}\approx60{,}97\text{ dB}$. Observe que o fator $B_r/W$ é indispensável porque a SNR de entrada foi medida na banda RF, não na banda da mensagem.
5. Transmissão em Banda Base e Critério de Nyquist
Apostila de Comunicações — Transmissão em Banda Base e Critério de Nyquist
Tópicos: PAM · ISI · pulso sinc · critério de Nyquist I · raised cosine · root-raised cosine · filtro casado · eye diagram · códigos de linha
5.1 Antes de começar
Ao final, você deve explicar a origem da ISI, aplicar o primeiro critério de Nyquist e distinguir RC, RRC e filtro casado. Diagnóstico: zeros do pulso nos múltiplos de $T_s$ bastam quando há erro de timing? Evidência mínima: gerar um diagrama de olho e relacionar abertura vertical, abertura horizontal, ruído e jitter.
5.2 Representação do Sinal Digital em Banda Base
5.2.1 Pulsos e Símbolos
Uma sequência discreta de símbolos $\{a_k\}_{k\in\mathbb{Z}}$, onde $a_k \in \mathcal{A}$ é um alfabeto finito (por exemplo $\mathcal{A} = \{\pm 1, \pm 3\}$ para 4-PAM), é modulada em um pulso $p(t)$ de energia finita:
A transmissão em banda base pode ser vista como um mapeamento de vetores discretos $\mathbf{a} = (a_k)_k \mapsto s(t) \in L^2(\mathbb{R})$. A norma $\|p\|^2 = \int_{-\infty}^{\infty} |p(t)|^2 dt = E_p$ é a energia do pulso. A potência média do sinal é:
$$
P = \lim_{T\to\infty} \frac{1}{T} \int_{-T/2}^{T/2} |s(t)|^2 dt.
$$
Para sequência estacionária com média zero e auto-correlação $R_{aa}[m] = \mathbb{E}[a_k a_{k-m}]$:
Leitura passo a passo: a sequência centrada determina $S_a$; o formatador de pulso multiplica essa densidade por $|P(f)|^2$; transmitir um símbolo a cada $T_s$ introduz o fator $1/T_s$. A média não nula é uma sequência determinística constante e gera linhas em múltiplos de $1/T_s$. Para símbolos i.i.d., $C_{aa}[m]=\sigma_a^2\delta[m]$, portanto $S_a=\sigma_a^2$ e recupera-se (2.3). Não se deve somar $\sigma_a^2$ novamente à série de covariância, pois $C_{aa}[0]$ já é a variância.
5.3.3 PSD para Símbolos Não-Correlacionados
Quando $a_k$ são não-correlacionados com variância $\sigma_a^2$:
A banda principal (primeiro zero) ocorre em $f = 1/T_s = R_s$. A energia está concentrada em torno de $R_s/2$, mas o espectro é infinito.
5.4 Definição e Modelagem de ISI
5.4.1 Canais com Dispersão e ISI
Quando o sinal atravessa um canal com resposta impulso $h_c(t)$, o pulso recebido é $g(t) = (p * h_c)(t)$. Em receptores reais, há um filtro adicional $h_r(t)$:
Igualando $G_s(f)=1$, obtemos (4.1). O argumento é reversível. Observe que $\sum_kg(t-kT_s)=\text{constante}$ é uma propriedade de partição da unidade e não é, em geral, equivalente a amostras sem ISI. $\blacksquare$
5.5.3 Interpretação Geométrica
A condição (4.1) pode ser interpretada geometricamente: se "enrolarmos" o espectro $G(f)$ ao longo de um período $1/T_s$, o resultado deve ser a constante 1. Isso implica que qualquer excesso espectral em uma região deve ser compensado por déficit em outra, de modo que a soma seja uniforme.
5.5.4 Limite de taxa para canal passa-baixas ideal
Ou seja, a largura de banda de Nyquist é $B_N = R_s/2$.
Da condição (4.1), as réplicas de $G(f)$ são deslocadas por $1/T_s$. Se $G(f)=0$ para $|f|>B$, é preciso que essas réplicas cubram o eixo sem lacunas. A menor banda ocorre quando $G(f)$ ocupa exatamente $[-1/(2T_s),1/(2T_s)]$, logo $B=1/(2T_s)=R_s/2$.
Respostas com suporte maior que $R_s/2$ podem satisfazer Nyquist quando as regiões de sobreposição são complementares; banda maior, isoladamente, não garante a condição. $\blacksquare$
Para $p(t) = \operatorname{sinc}(t/T_s)$, temos $p(nT_s) = \delta[n]$, logo a condição (3.2) é satisfeita.
No domínio da frequência, as réplicas de $P(f)$ deslocadas por $1/T_s$ são retânguos de largura $1/(2T_s)$ centrados em $\ell/T_s$. Como cada retânguo ocupa metade do intervalo entre réplicas adjacentes, a soma é exatamente 1 (pela complementar simetria (4.5)). $\blacksquare$
A cascata $H_T H_R=P_{\text{RC}}$ satisfaz Nyquist. O RRC ideal é bilateral no tempo, de duração infinita e não causal; na prática ele é atrasado, truncado e implementado como FIR causal, o que introduz pequena ISI residual.
5.9.4 Expressão Temporal do RRC
A forma temporal do RRC é mais complexa que a do RC. Para $\alpha > 0$ e $t \neq 0, \pm T_s/(4\alpha)$:
No modelo ideal, $p_{\text{RRC}}*p_{\text{RRC}}=p_{\text{RC}}$, que satisfaz Nyquist e maximiza a SNR no instante de decisão. Em uma realização FIR truncada, a igualdade é aproximada e deve-se medir a ISI residual nas amostras vizinhas.
$$
s_{\text{BP}}(t) = \gamma(t)\cos(2\pi f_c t + \phi(t)). \tag{9.4}
$$
5.10.4 Aplicações: QAM e PSK
Para QAM, $I(t)$ e $Q(t)$ são sinais PAM independentes, cada um modulado em uma portadora ortogonal.
Para PSK, a informação está na fase: $\tilde{s}(t) = A e^{j\phi_k}$, onde $\phi_k$ são fases discretas.
5.11 Códigos de Linha e Eye Diagram
5.11.1 Codificações Básicas
NRZ (Non-Return-to-Zero):
Bit 0 → $-A$, bit 1 → $+A$.
PSD: $\propto \operatorname{sinc}^2(fT_b)$.
Possui componente DC se $P(0) \ne 0$ e $\mathbb{E}[a_k] \ne 0$.
RZ (Return-to-Zero):
Bit 1 → pulso de duração $\tau < T_b$, retorna a zero.
Bit 0 → zero.
Mais fácil sincronismo de clock, mas mais banda.
Manchester:
Bit 0 → transição baixa→alta no meio.
Bit 1 → transição alta→baixa no meio.
Sempre há transição → facilitação de clock, elimina DC.
Banda: primeiro zero em $2R_b$ (o dobro do NRZ).
AMI (Alternate Mark Inversion):
Bit 0 → zero.
Bit 1 → alternância $+A, -A, +A, \dots$
Balanceamento DC automático.
Problema: sequências longas de zeros perdem sincronismo.
HDB3 (High-Density Bipolar 3):
Substitui sequências de 4+ zeros por padrões especiais.
Elimina o problema de zeros consecutivos do AMI.
Usado em enlaces E1; sistemas T1 tradicionalmente usam B8ZS, não HDB3.
5.11.2 Códigos com Balanceamento DC
5.11.3 Eye Diagram (Diagrama de Olho)
O eye diagram revela:
ISI: "Fechamento" dos olhos. Quanto mais aberto, menor ISI.
Jitter: Espessura horizontal dos cruzamentos.
Ruído: Espessura vertical nas aberturas.
Distorção de amplitude: Assimetria vertical.
5.11.4 Abertura do Eye
Para um sinal binário, se $\mathcal Y_1(t)$ e $\mathcal Y_0(t)$ são os conjuntos de traços condicionados ao símbolo central 1 e 0, a abertura vertical no instante $t$ é
Para sinais multinível há um olho entre cada par de níveis adjacentes; a margem do sistema é a menor dessas aberturas.
A abertura horizontal é a janela temporal onde a amostragem pode ocorrer sem ISI significativa.
5.12 Exercícios Resolvidos em Python
5.12.1 Protocolo computacional
Objetivo: validar PSD de PAM, pulsos RC/RRC, ausência de ISI e abertura do olho. Normalização: declare energia do pulso, amostras por símbolo e descarte de transientes. Validação: amostre a resposta conjunta em múltiplos de $T_s$ e reporte numericamente os resíduos de ISI.
5.12.2 Exercício 1: PSD de Sequência PAM Aleatória
Calcule e visualize a densidade espectral de potência (PSD) de um sinal PAM 4-aleatório com pulso retangular e pulso RC.
5.12.3 Exercício 2: Pulso RC — Cálculo no Tempo e Frequência
Plotar o pulso RC e seu espectro para diferentes valores de $\alpha$.
PYTHON
import numpy as npimport matplotlib.pyplot as pltdefrc_time(t,T_s,alpha):ifalpha==0:returnnp.sinc(t/T_s)den=1-(2*alpha*t/T_s)**2withnp.errstate(divide='ignore',invalid='ignore'):y=np.sinc(t/T_s)*np.cos(np.pi*alpha*t/T_s)/densingular=np.isclose(np.abs(2*alpha*t/T_s),1,atol=1e-6)y[singular]=np.pi/4*np.sinc(1/(2*alpha))y[np.isclose(t/T_s,0,atol=1e-6)]=1.0returnydefrc_spec(f,T_s,alpha):ifalpha==0:returnT_s*(np.abs(f)<=1/(2*T_s))B=(1+alpha)/(2*T_s)G=np.zeros_like(f)# região planaflat=np.abs(f)<=(1-alpha)/(2*T_s)G[flat]=T_s# região de rolloffrolloff=(np.abs(f)>(1-alpha)/(2*T_s))&(np.abs(f)<=B)arg=(np.pi*T_s/alpha)*(np.abs(f[rolloff])-(1-alpha)/(2*T_s))G[rolloff]=T_s/2*(1+np.cos(arg))returnGT_s=1.0t=np.linspace(-6,6,3001)f=np.linspace(-1.5,1.5,3001)fig,ax=plt.subplots(1,2,figsize=(14,5))alphas=[0,0.25,0.5,1.0]foralphainalphas:ax[0].plot(t,rc_time(t,T_s,alpha),label=f'α={alpha}')ax[0].set(xlabel='t/T_s',ylabel='p(t)',title='Pulso Raised Cosine (domínio do tempo)',xlim=(-6,6))ax[0].grid(True)ax[0].legend()ax[0].axhline(0,color='k',linewidth=0.5)foralphainalphas:G=rc_spec(f,T_s,alpha)ax[1].plot(f,G/T_s,label=f'α={alpha}')ax[1].axvline((1+alpha)/(2*T_s),color='r',linestyle='--',alpha=0.4,label=f'α={alpha}: B')ax[1].set(xlabel='f·T_s',ylabel='P(f)/T_s',title='Espectro RC (domínio da frequência)')ax[1].grid(True)ax[1].legend()plt.tight_layout()plt.show()
5.12.4 Exercício 3: Eye Diagram para Diferentes Fatores $\alpha$
PYTHON
import numpy as npimport matplotlib.pyplot as pltdefrrc_pulse(t,T_s,alpha):ifalpha==0:returnnp.sinc(t/T_s)num=np.sin(np.pi*t/T_s*(1-alpha))+4*alpha*t/T_s*np.cos(np.pi*t/T_s*(1+alpha))den=np.pi*t/T_s*(1-(4*alpha*t/T_s)**2)withnp.errstate(divide='ignore',invalid='ignore'):h=num/den# t = 0mask0=np.isclose(t,0,atol=1e-12)h[mask0]=1/T_s*(1+alpha*(4/np.pi-1))# singularidades em t = ±T_s/(4α)sing=np.isclose(np.abs(4*alpha*t/T_s),1,atol=1e-6)ifnp.any(sing):s=t[sing]h[sing]=(alpha/np.sqrt(2*T_s))*((1+2/np.pi)*np.sin(np.pi/(4*alpha))+(1-2/np.pi)*np.cos(np.pi/(4*alpha)))returnhT_s=1.0sps=8N_sym=500np.random.seed(0)a=2*np.random.randint(0,2,N_sym)-1# BPSKalphas=[0,0.25,0.5,0.75,1.0]fig,axes=plt.subplots(2,3,figsize=(15,8))axes=axes.ravel()foridx,alphainenumerate(alphas):h=rrc_pulse(np.arange(-5*sps,5*sps+1)/sps,T_s,alpha)h=h/np.sqrt(np.sum(h**2))# normalizar energia# transmitu=np.zeros(len(a)*sps)u[::sps]=atx=np.convolve(u,h,mode='full')# eye diagrameye_len=2*spsstart=N_sym*sps//2forkinrange(start//sps,start//sps+200):segment=tx[k*sps:min(k*sps+eye_len,len(tx))]iflen(segment)==eye_len:axes[idx].plot(np.arange(eye_len)/sps,segment,'b',alpha=0.06)axes[idx].set(xlabel='tempo/T_s',title=f'α = {alpha}',ylim=(-3,3))axes[idx].grid(alpha=0.3)ifidx==0:axes[idx].set_ylabel('amplitude')# último subplot vazio ou com infoaxes[-1].axis('off')axes[-1].text(0.1,0.5,'Diagrama de olho\napós cascata RRC+RRC\nPara cada α, 200 símbolos\nsobrepostos',fontsize=11,ha='center',va='center')foraxinaxes[:-1]:ax.axhline(0,color='k',linewidth=0.5)plt.tight_layout()plt.show()
5.12.5 Exercício 4: ISI com Pulso Não-Ideal
Demonstrar numericamente como um pulso com rolloff alto causa ISI quando há erro de temporização.
PYTHON
import numpy as npimport matplotlib.pyplot as pltdefrc_pulse(t,T_s,alpha):scalar_input=np.ndim(t)==0t=np.atleast_1d(t)ifalpha==0:y=np.sinc(t/T_s)returny.item()ifscalar_inputelseyden=1-(2*alpha*t/T_s)**2withnp.errstate(divide='ignore',invalid='ignore'):y=np.sinc(t/T_s)*np.cos(np.pi*alpha*t/T_s)/densingular=np.isclose(np.abs(2*alpha*t/T_s),1,atol=1e-6)y[singular]=np.pi/4*np.sinc(1/(2*alpha))y[np.isclose(t/T_s,0,atol=1e-6)]=1.0returny.item()ifscalar_inputelseyT_s=1.0t=np.linspace(-5,5,2001)# Sequência: símbolo principal em k=0, interferentes em k=-2..-1, 1..2a={0:1.0,1:0.5,-1:-0.3,2:0.2,-2:-0.1}alphas=[0.0,0.25,0.5,1.0]errors=[0.0,0.05,0.1,0.15]# erro de temporização em unidades de T_sfig,axes=plt.subplots(2,2,figsize=(14,10))foridx,epsinenumerate(errors):ax=axes[idx//2,idx%2]foralphainalphas:g=np.array([rc_pulse((n+eps)*T_s,T_s,alpha)*a.get(n,0)forninrange(-2,3)])ISI=sum(g[n]forninrange(-2,3)ifn!=0)desired=g[0]ax.plot(alpha,abs(ISI)/abs(desired)ifabs(desired)>1e-12else0,'o-',label=f'α={alpha}',alpha=0.7)ax.set(xlabel='α',ylabel='ISI / símbolo_desejado',title=f'Erro de timing ε = {eps} T_s',ylim=(0,1))ax.grid(True)ax.legend(fontsize=8)plt.tight_layout()plt.show()# Tabela numéricaprint("ISI relativa para diferentes α e ε:")print(f"{'α':>6} | {'ε=0':>10} | {'ε=0.05':>10} | {'ε=0.1':>10} | {'ε=0.15':>10}")print("-"*60)foralphainalphas:vals=[]forepsinerrors:g=np.array([rc_pulse((n+eps)*T_s,T_s,alpha)*a.get(n,0)forninrange(-2,3)])ISI=sum(g[n]forninrange(-2,3)ifn!=0)desired=g[0]vals.append(f"{abs(ISI)/abs(desired):.6f}"ifabs(desired)>1e-12else"N/A")print(f"{alpha:>6.2f} | {vals[0]:>10} | {vals[1]:>10} | {vals[2]:>10} | {vals[3]:>10}")
E11. Manchester tem transição em cada meio-bit, dobrando a frequência fundamental. Primeiro zero em $2/T_b$ vs $1/T_b$ do NRZ.
E12. ISI = $\sum_{k \ne 0} a_k e^{-|k|T/T} = e^{-1}(a_{-1}+a_1) + e^{-2}(a_{-2}+a_2) + \dots$. Para $a_k$ aleatórios com energia $\sigma_a^2$, a variância da ISI é $\sigma_a^2 \sum_{k \ne 0} e^{-2|k|} = \sigma_a^2 \frac{2e^{-2}}{1-e^{-2}}$.
6. Transmissão Digital em Banda Passante: ASK, PSK e FSK
Apostila de Comunicações — Transmissão Digital em Banda Passante: ASK, PSK e FSK
Tópicos: espaço de sinais · decisão máxima-verossimilhança · M-ASK · BPSK · QPSK · M-PSK · M-FSK · BER · constelações · eficiência espectral
6.1 Antes de começar
Ao final, você deve representar modulações em espaço de sinais, construir regiões ML e comparar ASK, PSK e FSK por distância, BER, banda e complexidade. Diagnóstico: dois esquemas com a mesma energia média necessariamente têm a mesma BER? Evidência mínima: obter ao menos uma curva simulada com barras ou intervalos de incerteza e confrontá-la com a teoria.
6.2 Espaço de Sinais e Decisão Máxima-Verossimilhança
Para símbolos equiprováveis $P(i) = 1/M$, a regra de máxima-verossimilhança é $\arg\max_i p(\mathbf{r}|\mathbf{s}_i)$, equivalente a $\arg\min_i \|\mathbf{r} - \mathbf{s}_i\|^2$. Expandindo:
O termo $\|\mathbf{r}\|^2$ é comum a todos os $i$, então a decisão é $\arg\max_i (\mathbf{r} \cdot \mathbf{s}_i - \frac{1}{2}\|\mathbf{s}_i\|^2)$. $\blacksquare$
O denominador contém metade da distância entre os sinais e o desvio padrão $\sqrt{N_0/2}$ do ruído projetado. Para BPSK, $E=E_b$, recuperando $P_b=Q(\sqrt{2E_b/N_0})$.
onde $B$ é a largura de banda do sinal modulado. Para ASK com pulso de Nyquist RC, $B = (1+\alpha)/(2T_s)$ em banda base, ou $B = (1+\alpha)/T_s$ em banda passante (duplicada).
6.3.4 Casos Particulares
OOK: é assimétrica, $\{0,s_1\}$, e não coincide com a M-ASK simétrica da Seção “Mapeamento de Amplitudes”. Se $E_1$ é a energia do símbolo ligado, $P_b=Q(\sqrt{E_1/(2N_0)})$. Para bits equiprováveis, a energia média é $\bar E_b=E_1/2$, logo:
Comparação: BPSK ($M=2$ PSK) tem $d_{\min}^2 = 4E_b$. 16-ASK tem $d_{\min}^2 \approx \frac{12E_b\cdot 4}{255} \approx 0{,}188E_b$. BPSK é ~21× melhor em distância mínima.
6.4 Dedução da Probabilidade de Erro M-ASK
6.4.1 Densidade de Probabilidade Condicionada
Considere a M-ASK simétrica e denote por $D=2d\sqrt{T_s/2}$ a distância entre pontos adjacentes no espaço de sinais. A fronteira fica no ponto médio, a $D/2$ de cada vizinho. Como a projeção do ruído tem desvio $\sigma=\sqrt{N_0/2}$, um ponto interno possui duas caudas de erro:
Isso é BPSK, pois a M-ASK simétrica com $M=2$ tem pontos antipodais. OOK é tratado separadamente na Seção “Casos Particulares”.
Se a energia do símbolo ligado for denotada por $E_1$, OOK possui $P_b=Q(\sqrt{E_1/(2N_0)})$; com bits equiprováveis, $E_1=2\bar E_b$ e resulta $Q(\sqrt{\bar E_b/N_0})$.
O receptor QPSK decompõe $r(t)$ em componentes I e Q ortogonais. Cada componente sofre decisão BPSK independente com energia $E_b$ e ruído $n_I, n_Q \sim \mathcal{N}(0, N_0/2)$:
$$
P_b = P(\text{erro em um eixo}) = Q\left(\frac{\sqrt{E_b}}{\sqrt{N_0/2}}\right) = Q\left(\sqrt{\frac{2E_b}{N_0}}\right). \quad \blacksquare
$$
QPSK transmite dois bits por símbolo. Com pulsos de Nyquist de roll-off $\alpha$, a largura de banda passante é aproximadamente $B=(1+\alpha)R_s$; portanto:
Motivação: Evita que a trajetória de fase cruze a origem (onde o envelope tende a zero), importante para amplificadores de potência não-lineares (eficiência energética).
BER DQPSK (não-coerente): aproximadamente 2–3 dB pior que QPSK coerente na BER baixa.
6.7 M-PSK Geral e DPSK
6.7.1 Sinais M-PSK
$$
\boxed{s_m(t) = \sqrt{\frac{2E_s}{T_s}}\cos\left(2\pi f_c t + \frac{2\pi m}{M}\right), \quad m = 0, 1, \dots, M-1.} \tag{6.1}
$$
A constelação é um polígono regular inscrito em círculo de raio $\sqrt{E_s}$.
6.7.2 DEDUÇÃO da BER M-PSK
A probabilidade de erro de símbolo M-PSK é a probabilidade de sair do setor angular de meia-largura $\pi/M$. Para $M\ge4$ e SNR moderada/alta, os dois vizinhos dominam:
Para $M=4$, a expressão recupera exatamente $Q(\sqrt{2E_b/N_0})$. Para $M=2$, há apenas um vizinho, não dois, e deve-se usar diretamente a fórmula BPSK $Q(\sqrt{2E_b/N_0})$; portanto, (6.2)–(6.3) não devem ser extrapoladas para $M=2$.
Comparação BDPSK vs BPSK: para $P_b=10^{-3}$, BPSK coerente requer aproximadamente $6{,}79$ dB e BDPSK aproximadamente $7{,}93$ dB: penalidade de $1{,}14$ dB nesse ponto. A penalidade tende a cerca de 3 dB apenas no limite de BER muito baixa.
DQPSK: usa quatro mudanças de fase, normalmente com mapeamento Gray. Sua BER depende do detector diferencial e não é obtida dividindo diretamente a expressão de BDPSK por dois; deve ser calculada a partir das regiões de decisão diferenciais ou avaliada numericamente.
$$
\int_0^{T_s} s_i(t)s_j(t)\,dt = 0, \quad i \ne j. \tag{7.2}
$$
Para portadoras coerentes cujas fases são conhecidas e escolhidas de modo compatível com a janela, a separação mínima usual é:
$$
\Delta f = f_j - f_i = \frac{k}{2T_s}, \quad k \in \mathbb{Z}^+.
$$
A menor separação é:
$$
\boxed{\Delta f = \frac{1}{2T_s}.} \tag{7.3}
$$
6.8.3 Recepção M-FSK
O receptor possui $M$ correlatores (ou filtros casados), cada um sintonizado em uma frequência. A decisão é $\hat{m} = \arg\max_k r_k$, onde $r_k$ é a saída do correlator $k$.
onde $B_p$ é a largura efetiva de um único tom após a conformação de pulso. Usar $M\Delta f$ é apenas uma estimativa de ordem de grandeza quando $B_p\approx\Delta f$.
Ou, pela regra de Carson (modulação de frequência contínua):
$$
B \approx 2(\Delta f + f_m) \quad \text{para FSK analógica.}
$$
Para FSK digital: $B \approx M/(2T_s)$ com separação mínima.
6.8.5 Eficiência Energética do FSK
6.9 Dedução da Probabilidade de Erro M-FSK
6.9.1 M-FSK Coerente
Para M-FSK coerente ortogonal, cada correlator real produz uma variável Gaussiana. Se $m$ foi transmitido, $r_m$ tem média $\sqrt{E_s}$; os demais têm média zero; todos têm variância $N_0/2$.
A probabilidade de erro de símbolo é a probabilidade de algum correlator errado exceder o correto:
Todos os tons errados estão à mesma distância do tom correto. Logo, não existe rotulagem Gray que torne todos os erros vizinhos erros de um bit. Por simetria, condicionado a um erro, o tom decidido é uniforme entre os $M-1$ incorretos; a distância de Hamming média é $kM/[2(M-1)]$, com $k=\log_2M$. Assim,
onde a última expressão é a aproximação/limitante de união em alta SNR. Para $M=2$, ela fornece exatamente $Q(\sqrt{E_b/N_0})$.
6.9.2 M-FSK Não-Coerente
No detector não-coerente, cada correlator é substituído por um detector de envelope (retificador + filtro). A saída é uma variável de Rician (símbolo correto) ou Rayleigh (símbolos errados).
Em alta SNR, o primeiro termo domina: $P_s\approx(M-1)e^{-E_s/(2N_0)}/2$. A BER volta a ser $M P_s/[2(M-1)]$ para qualquer rotulagem binária balanceada.
Isso não é uma implicação válida para “qualquer modulação” isoladamente: M-FSK, por exemplo, pode melhorar a eficiência energética ao gastar muito mais banda. O limite de Shannon descreve a fronteira global entre potência e banda; FEC aproxima o sistema dessa fronteira.
Objetivo: comparar constelações, distância mínima, eficiência e BER de ASK, PSK e FSK. Normalização: fixe $E_b$ ou $E_s$ explicitamente e converta $E_s/N_0=\log_2(M)E_b/N_0$. Monte Carlo: use semente fixa e ao menos 100 erros por ponto, ou reporte intervalo de confiança/limite superior.
6.11.2 Exercício 1: BER de BPSK vs QPSK vs 8-PSK — Plot Comparativo
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcQ=lambdax:0.5*erfc(x/np.sqrt(2))ebn0_db=np.linspace(0,12,200)gamma=10**(ebn0_db/10)# BER teóricaber_bpsk=Q(np.sqrt(2*gamma))ber_qpsk=Q(np.sqrt(2*gamma))# mesmo BER que BPSKber_8psk=(2/np.log2(8))*Q(np.sqrt(2*gamma*np.log2(8))*np.sin(np.pi/8))fig,ax=plt.subplots(figsize=(10,6))ax.semilogy(ebn0_db,ber_bpsk,'b-',linewidth=2,label='BPSK teoria')ax.semilogy(ebn0_db,ber_qpsk,'r--',linewidth=2,label='QPSK teoria (mesmo BPSK)')ax.semilogy(ebn0_db,ber_8psk,'g-',linewidth=2,label='8-PSK teoria')ax.set(xlabel='$E_b/N_0$ (dB)',ylabel='BER',title='BER Teórica: BPSK vs QPSK vs 8-PSK')ax.grid(True,which='both')ax.legend(fontsize=11)ax.set_ylim(1e-7,1)plt.tight_layout()plt.show()
6.11.3 Exercício 2: Constelações M-PSK para M = 4, 8, 16
PYTHON
import numpy as npimport matplotlib.pyplot as pltdefplot_constellation(M,title="",marker='o',color='b'):angles=2*np.pi*np.arange(M)/M# normalizar a energia média a 1points=np.exp(1j*angles)points=points/np.sqrt(np.mean(np.abs(points)**2))plt.plot(points.real,points.imag,marker,markersize=10,markerfacecolor='none',markeredgecolor=color,markeredgewidth=1.5)fori,angleinenumerate(angles):plt.annotate(f'{i:0{int(np.ceil(np.log2(M)))}b}',(points.real[i]*1.15,points.imag[i]*1.15),fontsize=8,ha='center',va='center')plt.plot(0,0,'k.',markersize=8)plt.xlabel('I (in-phase)')plt.ylabel('Q (quadrature)')plt.title(title)plt.grid(True,alpha=0.3)plt.axis('equal')plt.xlim(-1.5,1.5)plt.ylim(-1.5,1.5)fig,axes=plt.subplots(1,3,figsize=(15,5))forax,Minzip(axes,[4,8,16]):angles=2*np.pi*np.arange(M)/Mpoints=np.exp(1j*angles)points=points/np.sqrt(np.mean(np.abs(points)**2))ax.plot(points.real,points.imag,'o',markersize=10,markerfacecolor='none',markeredgecolor='b',markeredgewidth=1.5)fori,angleinenumerate(angles):ax.annotate(f'{i:0{int(np.ceil(np.log2(M)))}b}',(points.real[i]*1.15,points.imag[i]*1.15),fontsize=9,ha='center',va='center')ax.plot(0,0,'k.',markersize=8)ax.set(xlabel='I',ylabel='Q',title=f'{M}-PSK (M={M})',xlim=(-1.5,1.5),ylim=(-1.5,1.5),aspect='equal')ax.grid(True)plt.tight_layout()plt.show()
6.11.4 Exercício 3: BER de BFSK vs BPSK
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcQ=lambdax:0.5*erfc(x/np.sqrt(2))ebn0_db=np.linspace(0,14,300)gamma=10**(ebn0_db/10)ber_bpsk=Q(np.sqrt(2*gamma))ber_bfsk_coh=Q(np.sqrt(gamma))ber_bfsk_ncoh=0.5*np.exp(-gamma/2)fig,ax=plt.subplots(figsize=(10,6))ax.semilogy(ebn0_db,ber_bpsk,'b-',linewidth=2,label='BPSK')ax.semilogy(ebn0_db,ber_bfsk_coh,'r--',linewidth=2,label='BFSK coerente')ax.semilogy(ebn0_db,ber_bfsk_ncoh,'g-.',linewidth=2,label='BFSK não-coerente')ax.set(xlabel='$E_b/N_0$ (dB)',ylabel='BER',title='BFSK vs BPSK: Coerente e Não-Coerente')ax.grid(True,which='both')ax.legend(fontsize=11)ax.set_ylim(1e-7,1)plt.tight_layout()plt.show()
6.11.5 Exercício 4: Eficiência Espectral vs Ordem de Modulação
PYTHON
import numpy as npimport matplotlib.pyplot as plt# Eficiência espectral e BER necessária para 1e-5from scipy.special importerfcQinv=lambdap:np.sqrt(2)*erfc(2*p)modulations={'BPSK':{'M':2,'type':'psk','eta':1.0},'QPSK':{'M':4,'type':'psk','eta':2.0},'8-PSK':{'M':8,'type':'psk','eta':3.0},'16-PSK':{'M':16,'type':'psk','eta':4.0},'BFSK':{'M':2,'type':'fsk_coh','eta':0.5},'4-FSK':{'M':4,'type':'fsk_coh','eta':1.0},'4-ASK':{'M':4,'type':'ask','eta':2.0},}target_ber=1e-5results=[]forname,infoinmodulations.items():M=info['M']eta=info['eta']ifinfo['type']=='psk':# Inverter BER para encontrar Eb/N0# P_b = (2/log2(M)) * Q(sqrt(2*Eb/N0 * log2(M)) * sin(pi/M))sin_pi_M=np.sin(np.pi/M)ifM==2:arg=Qinv(target_ber)ebn0=arg**2/2else:# resolver numericamentefrom scipy.optimize importbrentqdefeq(g):return(2/np.log2(M))*0.5*erfc(np.sqrt(2*g*np.log2(M))*sin_pi_M/np.sqrt(2))-target_bertry:ebn0=brentq(eq,0.1,30)except:ebn0=np.nanelifinfo['type']=='fsk_coh':# P_b ≈ (M-1)/(M*log2(M)) * Q(sqrt(Eb*log2(M)/N0))ifM==2:arg=Qinv(target_ber*2)# (M-1)/M = 0.5 for M=2ebn0=arg**2else:from scipy.optimize importbrentqdefeq(g):return(M-1)/(M*np.log2(M))*0.5*erfc(np.sqrt(g*np.log2(M)/2))-target_bertry:ebn0=brentq(eq,0.1,30)except:ebn0=np.nanelifinfo['type']=='ask':# P_b ≈ 2(M-1)/(M*k) * Q(sqrt(6*k*Eb/((M^2-1)N0)))coeff=2*(M-1)/(M*np.log2(M))inner=6*np.log2(M)/(M**2-1)arg=Qinv(target_ber/coeff)ebn0=arg**2/innerresults.append((name,eta,10*np.log10(ebn0)ifnotnp.isinf(ebn0)else999))results.sort(key=lambdax:x[1])names=[r[0]forrinresults]etas=[r[1]forrinresults]db_vals=[r[2]forrinresults]fig,ax=plt.subplots(figsize=(12,6))bars=ax.barh(names,etas,color=['blue','teal','green','orange','red','purple','brown'])fori,(bar,db)inenumerate(zip(bars,db_vals)):ax.text(bar.get_width()+0.05,bar.get_y()+bar.get_height()/2,f'{db:.1f} dB',va='center',fontsize=9)ax.set(xlabel='Eficiência Espectral (bit/s/Hz)',ylabel='Modulação',title='Eficiência Espectral vs Eb/N0 para BER=1e-5',xlim=(0,max(etas)+0.5))ax.grid(axis='x',alpha=0.3)plt.tight_layout()plt.show()
6.12 Lista de Exercícios Propostos
E1. Para M-ASK, distinga o espaçamento entre amplitudes físicas, $2d$, da distância $D_{\min}$ após projeção na base ortonormal. Derive ambos em função de $E_b$, $M$ e $T_s$.
E2. Calcule a BER aproximada de 16-ASK a $E_b/N_0 = 12$ dB.
E3. Prove que a BER do BPSK é $Q(\sqrt{2E_b/N_0})$ a partir da densidade Gaussiana.
E4. Mostre que QPSK com Gray coding tem o mesmo BER de BPSK para o mesmo $E_b/N_0$.
E5. Para QPSK, calcule a probabilidade de erro de símbolo $P_s$ e demonstre que $P_s \approx 2P_b$ para $P_b \ll 1$.
E6. Derive a BER de M-PSK para $M = 8$ e compare numericamente com $M = 4$ (QPSK) a $E_b/N_0 = 8$ dB.
E7. Mostre que para M-FSK coerente, a probabilidade de erro de símbolo é $P_s \approx (M-1)Q(\sqrt{E_s/N_0})$.
E8. Para BDPSK, calcule o $E_b/N_0$ necessário para BER $= 10^{-3}$ e compare com BPSK.
E9. Para BFSK e 4-FSK coerentes com $T_s=1\,\mu$s, calcule a separação mínima entre tons. Depois estime a extensão entre o primeiro e o último tom e explique por que a banda ocupada total ainda depende da conformação de pulso.
E10. Trace o espaço de sinais para 8-PSK e identifique a distância mínima entre pontos adjacentes.
E11. Demonstre que a eficiência espectral do 16-QAM é 4 bit/s/Hz e calcule sua BER aproximada a $E_b/N_0 = 14$ dB.
E12. Explique por que o FSK é preferível em canais com amplificadores de potência não-lineais (efeito amplitude-to-phase).
6.13 Gabarito
E1. Da Seção “M-ASK — Teoria Completa”, $d=\sqrt{6E_b\log_2M/[T_s(M^2-1)]}$; portanto, o espaçamento de amplitude é $2d$. Após projeção, cada amplitude é multiplicada por $\sqrt{T_s/2}$, logo $D_{\min}=2d\sqrt{T_s/2}=\sqrt{12E_b\log_2M/(M^2-1)}$. A dependência em $T_s$ desaparece da distância energética.
E2. Para $M=16$ e $\gamma_b=10^{1{,}2}\approx15{,}85$, $x=\sqrt{6(4)\gamma_b/255}\approx1{,}221$. Assim, $P_b\approx(15/32)Q(x)\approx(0{,}46875)(0{,}111)\approx\boxed{5{,}2\times10^{-2}}$. A aproximação de vizinho mais próximo já é menos precisa nessa BER alta, mas evidencia a fragilidade da 16-ASK.
E6. Para 8-PSK, $k=3$, $\gamma_b=6{,}31$ e $x=\sqrt{2k\gamma_b}\sin(\pi/8)\approx2{,}355$. Logo, $P_b\approx(2/3)Q(x)\approx(2/3)(0{,}0093)\approx6{,}2\times10^{-3}$. Para QPSK, $Q(\sqrt{2\gamma_b})\approx1{,}9\times10^{-4}$. A 8-PSK é cerca de 32 vezes pior nesse ponto.
E8. DBPSK: $10^{-3} = \frac{1}{2}e^{-\gamma} \Rightarrow \gamma = -\ln(2\times 10^{-3}) \approx 6{,}215$, ou $7{,}93$ dB. BPSK coerente: $Q(\sqrt{2\gamma}) = 10^{-3} \Rightarrow \gamma \approx 4{,}775$, ou $6{,}79$ dB. Portanto, nesse ponto, a penalidade da detecção diferencial é $\boxed{1{,}14\text{ dB}}$.
E9. A separação coerente mínima é $\Delta f=1/(2T_s)=500$ kHz. A extensão entre tons extremos é $(M-1)\Delta f$: 500 kHz para BFSK e 1,5 MHz para 4-FSK. A banda total é essa extensão mais a largura $B_p$ de um tom conformado; sem especificar o pulso e o critério de ocupação, não há um único valor de banda.
E10. 8-PSK: constelação em círculo raio $\sqrt{E_s}$. $d_{\min} = 2\sqrt{E_s}\sin(\pi/8) \approx 0{,}765\sqrt{E_s}$.
E11. 16-QAM transporta 4 bits/símbolo. Com pulso Nyquist ideal e a convenção de banda passante nula-a-nula, $B\approx R_s$, logo $\eta\approx4$ bit/s/Hz. Para mapeamento Gray em AWGN,
$P_b\approx\frac{4}{\log_2M}(1-1/\sqrt M)Q\!\left(\sqrt{\frac{3\log_2M}{M-1}\gamma_b}\right)$. Para $M=16$ e $\gamma_b=10^{14/10}=25{,}12$: $P_b\approx0{,}75Q(\sqrt{0{,}8\gamma_b})=0{,}75Q(4{,}48)\approx\boxed{2{,}8\times10^{-6}}$.
E12. Amplificadores não-lineares (classe C) convertem variações de amplitude em variações de fase (AM-PM). FSK tem envelope constante, evitando este efeito.
7. Modulação QAM — Transmissão Digital em Banda Base
Comunicações Digitais — Apostila de Curso
Tópicos: Representação I/Q · Constelações QAM · Distância mínima · Energia normalizada · Probabilidade de erro · Detecção coerente · Erro de fase · Aplicações práticas
7.1 Antes de começar
Ao final, você deve normalizar constelações QAM, relacionar $d_{\min}$ a BER e ordem de modulação, implementar decisão I/Q e quantificar erro de fase. Diagnóstico: aumentar $M$ eleva a eficiência espectral, mas o que acontece com $d_{\min}$ quando $E_s$ é fixo? Evidência mínima: validar numericamente a energia média e a BER de 16-, 64- e 256-QAM.
7.2 Representação I/Q e a estrutura do sinal QAM
7.2.1 Modulação em quadratura: a ideia central
Em modulações como BPSK e QPSK, apenas a fase da portadora é modulada. A Modulação por Codificação de Amplitude Quadrática (QAM) vai além: modula simultaneamente a amplitude e a fase. O insight fundamental é que duas portadoras ortogonais (seno e cosseno) podem transportar informações independentes.
Considere uma portadora de frequência $f_c$. Construimos duas portadoras ortogonais:
que satisfazem $\displaystyle\int_0^{T_s} c_I(t)c_Q(t)\,dt = 0$ para qualquer intervalo inteiro de período $T_s$ da portadora. A ortogonalidade garante que as duas componentes são independentes no receptor — podemos transmitir dados separados em cada uma sem interferência mútua (desde que o receptor mantenha sincronismo de fase perfeito).
7.2.2 Dedução da representação I/Q
Sejam $I_k$ e $Q_k$ os símbolos nas componentes em fase e em quadratura, respectivamente, no $k$-ésimo intervalo de símbolo de duração $T_s$. O sinal QAM transmitido é:
Esta é a forma analítica (ou envelope complexo) do sinal: $x_k$ é a representacao no plano complexo (constelação), e $e^{j2\pi f_c t}$ é a portadora rotativa.
7.2.3 Energia do símbolo
A energia do símbolo $s_k(t)$ no intervalo $[kT_s, (k+1)T_s]$ é:
Para normalização, convém adotar portadoras com energia unitária por símbolo: definamos $g_I(t) = \sqrt{\frac{2}{T_s}}\cos(2\pi f_c t)$ e $g_Q(t) = -\sqrt{\frac{2}{T_s}}\sin(2\pi f_c t)$, então:
A partir deste ponto, assumiremos essa normalização: $E_s = |x_k|^2$.
7.2.4 Eficiência espectral
Cada símbolo QAM carrega $\log_2 M$ bits, onde $M$ é o tamanho da constelação. A taxa de símbolos é $R_s = 1/T_s$. A eficiência espectral (bit/s/Hz) é:
onde $B \approx R_s = 1/T_s$ é a largura de banda ocupada na aproximação de pulsos Nyquist com excesso de banda nulo. Com filtro cosseno levantado, a convenção usual fornece $B=(1+\alpha)R_s$ e, portanto, $\eta=\log_2M/(1+\alpha)$. Comparação: para a mesma taxa de símbolos e o mesmo excesso de banda, QPSK transporta 2 bit/símbolo, enquanto 16-QAM transporta 4 bit/símbolo e dobra a eficiência espectral; essa vantagem custa menor distância entre pontos para a mesma energia média e, assim, maior $E_b/N_0$ para uma BER fixada.
7.2.5 Mapeamento Gray
Em alta SNR, erros quase sempre cruzam a fronteira mais próxima no plano complexo. Para minimizar o número de bits errados por erro de símbolo, usa-se mapeamento Gray: pontos vizinhos diferem em exatamente um bit. Em QAM retangular com $L$ níveis por eixo, cada eixo usa mapeamento Gray independente: os $m = \log_2 L$ bits mais significativos determinam a região (metade superior/inferior, esquerda/direita), e os menos significativos refinam.
7.3 Constelações QAM — Geometria Completa
7.3.1 QAM quadrada: estrutura geral
A maioria das aplicações práticas usa QAM quadrada, onde $M = L^2$ e ambos os eixos I e Q usam o mesmo conjunto de níveis. O conjunto de níveis é:
com $L = \sqrt{M}$ níveis ímpares equidistantes, separados por $2d$. A distância mínima entre pontos adjacentes no mesmo eixo é $2d$.
7.3.2 Distância mínima entre pontos
$$
\boxed{d_{\min} = 2d},
$$
onde $d$ é a meia-distância entre níveis adjacentes no mesmo eixo. A distância é constante porque os pontos formam uma grade retangular ortogonal.
Dedução: Sejam dois pontos arbitrários $x_a = I_a + jQ_a$ e $x_b = I_b + jQ_b$, com $I_a, I_b \in \mathcal{A}_I$ e $Q_a, Q_b \in \mathcal{A}_Q$. A distância é $|x_a - x_b| = \sqrt{(I_a-I_b)^2 + (Q_a-Q_b)^2}$. Os valores possíveis de $|I_a-I_b|$ são $0, 2d, 4d, \ldots$ e idem para Q. O mínimo não-nulo ocorre quando um componente é $2d$ e o outro é $0$: $d_{\min} = \sqrt{(2d)^2 + 0} = 2d$.
Para QAM quadrada $M=L^2$ com $L$ ímpar:
$$
\boxed{d_{\min} = \frac{2d_{\max}}{L-1}},
$$
onde $d_{\max} = (L-1)d$ é a coordenada máxima. Se normalizarmos $E_s = 1$ (energia média por símbolo unitária), veremos na próxima subseção como isso determina $d_{\min}$.
7.3.3 Energia média e normalização
Dedução da energia média: Para a QAM quadrada usual, $M=L^2$, $L$ é par e os níveis de cada eixo são
$$
a_i=(2i-L+1)d,\qquad i=0,\ldots,L-1.
$$
Por exemplo, $L=4$ fornece $\{-3d,-d,d,3d\}$. Como os níveis são equiprováveis e $\sum_{i=0}^{L-1}(2i-L+1)^2=L(L^2-1)/3$,
8-QAM: Não existe uma configuração retangular $M_I \times M_Q$ que produza $M=8$ (pois 8 não é produto de dois inteiros ímpares). As constelações 8-QAM não-retangulares têm pontos dispostos em círculos ou padrões hexagonais, mas são menos eficientes que 16-QAM em termos de $d_{\min}/\sqrt{E_s}$. Por isso, a indústria pula de 4 para 16-QAM.
32-QAM: $M = 4 \times 8$ (retangular não-quadrada), ou $32$-APSK (4 círculos). Menos comum que 16 e 64.
128-QAM: $L \approx 11{,}3$ (não-quadrada), geralmente implementada como 128-APSK em satélites.
256-QAM: $L=16$, níveis $\{\pm d, \pm 3d, \ldots, \pm 15d\}$. $E_s = \frac{2}{3}(255)d^2$. Usada em 5G e Wi-Fi 6.
7.3.5 Exercício em Python: visualização de constelações
PYTHON
import numpy as npimport matplotlib.pyplot as pltdefmake_qam_levels(L):"""Retorna os L níveis para QAM retangular (L ímpar ou par)."""returnnp.array([-L+1+2*iforiinrange(L)])fig,axes=plt.subplots(1,3,figsize=(12,3.8))forM,axin[(16,axes[0]),(64,axes[1]),(256,axes[2])]:L=int(np.sqrt(M))levels=make_qam_levels(L)/np.sqrt(2*(M-1)/3)# normaliza Es=1I,Q=np.meshgrid(levels,levels)ax.scatter(I,Q,s=30,c='#1e3a5f',edgecolors='#fff',linewidths=0.5)ax.set(aspect='equal',xlim=(-1.1,1.1),ylim=(-1.1,1.1))ax.set_title(f'{M}-QAM: {int(np.log2(M))} bits/simbolo')ax.grid(alpha=0.2)ax.axhline(0,color='gray',lw=0.5);ax.axvline(0,color='gray',lw=0.5)plt.tight_layout()plt.show()
7.4 Probabilidade de Erro — Dedução Completa
7.4.1 A função Q e a probabilidade de erro PAM
A função Q é definida como a cauda direita da distribuição normal padrão:
Relação com erfc: A função erro complementar é $\operatorname{erfc}(x) = \frac{2}{\sqrt{\pi}}\int_x^{\infty}e^{-t^2}dt$. Fazendo $t = u/\sqrt{2}$, obtém-se $\operatorname{erfc}(x) = 2Q(x\sqrt{2})$.
Para um canal AWGN com ruído $n\sim\mathcal N(0,\sigma^2)$, a probabilidade de cruzar a fronteira situada no ponto médio de dois vizinhos separados por distância $D$ é $Q(D/(2\sigma))$. Como aqui $D=2d$ e $\sigma^2=N_0/2$ por dimensão, o argumento é $d/\sigma$.
7.4.2 BER do PAM M-ary (resultados conhecidos)
Considere PAM com $M$ níveis equidistantes separados por $2d$. A probabilidade de erro de símbolo é:
O fator $\frac{M-1}{M}$ surge porque pontos internos têm dois vizinhos, mas são $\frac{M-2}{M}$ dos pontos; pontos de borda têm um vizinho e são $\frac{2}{M}$. O BER (bits errados) é aproximado por:
Passo 1: Separação I/Q. QAM retangular pode ser vista como duas PAM ortogonais independentes. A decisão no eixo I não depende da decisão no eixo Q, e vice-versa. Cada eixo usa $L = \sqrt{M}$ níveis (para QAM quadrada).
Passo 2: probabilidade de cruzar uma fronteira por eixo. Há $L-1$ fronteiras e $L$ níveis equiprováveis. Como a meia-distância é $d$ e $\sigma^2=N_0/2$,
Passo 3: converter erros de símbolo em erros de bit. Com Gray e SNR suficientemente alta, uma travessia para o vizinho mais próximo altera um único bit. Como cada símbolo leva $k=\log_2M$ bits, $P_b\approx 2p_{\rm eixo}/k$: o fator 2 conta os dois eixos. Essa é uma aproximação de vizinho mais próximo, não uma igualdade para toda SNR.
Passo 4: Expressão final em erfc. Substituindo $E_s = E_b\log_2 M$:
Essa aproximação preserva a dependência essencial: aumentar $M$ reduz a distância normalizada entre vizinhos e exige maior $E_b/N_0$ para a mesma BER.
7.4.5 Comparativo QAM vs PSK
16-QAM vs 16-PSK: 16-QAM é superior por ~3–4 dB em BER a $10^{-6}$. A razão é que 16-QAM tem pontos com distâncias variadas (cantos mais distantes do centro) e melhor aproveitamento da energia para alta ordem.
64-QAM vs 64-PSK: vantagem ~5 dB a favor de QAM.
256-QAM vs 256-PSK: vantagem ~6–7 dB.
7.4.6 SER (Probabilidade de Erro de Símbolo)
A probabilidade de erro de símbolo (não de bit) é:
A aproximação usa $1-(1-p)^2 \approx 2p$ para $p$ pequeno (alta SNR). Note que $P_s \approx \log_2 M \cdot P_b$ por mapeamento Gray.
7.4.7 Exercício em Python: BER Monte Carlo de QAM
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcrng=np.random.default_rng(42)defber_qam_theory(M,eb_n0_linear):"""BER analítica aproximada para QAM retangular."""k=np.log2(M)sqrt_M=np.sqrt(M)arg=np.sqrt(3*k*eb_n0_linear/(M-1))prefactor=4/k*(1-1/sqrt_M)returnprefactor*0.5*erfc(arg/np.sqrt(2))defber_qam_mc(M,eb_n0_dbs,n_sym=200_000):"""Monte Carlo para BER de QAM com Gray."""L=int(np.sqrt(M))k=int(np.log2(M))scale=np.sqrt(2*(M-1)/3)# Es = 1levels=np.array([-L+1+2*iforiinrange(L)])/scaleeb_n0=np.array(eb_n0_dbs)berrs=[]fordbineb_n0:# Sorteie índices de amplitude e rotule cada eixo em Gray.# Índices adjacentes i e i+1 têm rótulos i^(i>>1) que diferem em 1 bit.m_axis=k//2idxI=rng.integers(0,L,n_sym)idxQ=rng.integers(0,L,n_sym)labelI=idxI^(idxI>>1)labelQ=idxQ^(idxQ>>1)bitsI=np.column_stack([(labelI>>b)&1forbinrange(m_axis)])bitsQ=np.column_stack([(labelQ>>b)&1forbinrange(m_axis)])bits=np.column_stack((bitsI,bitsQ))xi,xq=levels[idxI],levels[idxQ]x=xi+1j*xq# Adicionar ruido AWGN# Use base de ponto flutuante. Com ``db`` do NumPy, ``10**db`` pode# sofrer overflow inteiro a partir de valores altos de Eb/N0.gamma=10.0**(db/10.0)sigma=np.sqrt(1/(2*k*gamma))y=x+sigma*(rng.standard_normal(n_sym)+1j*rng.standard_normal(n_sym))# Decisao: projetar nos niveis mais proximosyI=np.clip(np.rint((y.real*scale+L-1)/2).astype(int),0,L-1)yQ=np.clip(np.rint((y.imag*scale+L-1)/2).astype(int),0,L-1)# Rotule os índices decididos com o mesmo Gray de cada eixo.yLabelI=yI^(yI>>1)yLabelQ=yQ^(yQ>>1)ybitsI=np.column_stack([(yLabelI>>b)&1forbinrange(m_axis)])ybitsQ=np.column_stack([(yLabelQ>>b)&1forbinrange(m_axis)])ybits=np.column_stack((ybitsI,ybitsQ))ber=np.mean(ybits!=bits)berrs.append(ber)returnnp.array(berrs)eb=np.arange(2,22,1)forM,lbl,mkin[(16,'16-QAM','o'),(64,'64-QAM','s'),(256,'256-QAM','^')]:mc=ber_qam_mc(M,eb)th=[ber_qam_theory(M,10.0**(db/10.0))fordbineb]plt.semilogy(eb,mc,mk,markersize=5,label=f'{M}-QAM MC')plt.semilogy(eb,th,'--',lw=1.5,label=f'{M}-QAM teoria')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-6,1e-1);plt.grid(True,which='both');plt.legend()plt.title('BER de QAM retangular em AWGN')plt.tight_layout()plt.show()
7.5 Detecção Coerente de QAM
7.5.1 Estrutura do receptor coerente
O receptor coerente de QAM recupera os símbolos I e Q usando correladores ortogonais. Após o canal AWGN, o sinal recebido é:
$$
r(t) = s(t) + n(t),
$$
onde $n(t)$ é ruído branco gaussiano com densidade espectral $N_0/2$.
7.5.2 Dedução do correlador I/Q
Para recuperar $I_k$ e $Q_k$, projetamos $r(t)$ nas bases ortogonais $g_I(t)$ e $g_Q(t)$:
Dedução dos ruídos projetados: $n_I = \int n(t)g_I(t)dt$ e $n_Q = \int n(t)g_Q(t)dt$ são variáveis gaussianas independentes $\mathcal{N}(0, N_0/2)$ por ortogonalidade e linearidade.
Recebemos: $\mathbf{r} = \mathbf{x}_k + \mathbf{n}$, onde $\mathbf{r} = (r_I, r_Q)$, $\mathbf{x}_k = (I_k, Q_k)$, e $\mathbf{n} \sim \mathcal{N}(0, \frac{N_0}{2}\mathbf{I}_2)$.
7.5.3 Decisão ML — regra de decisão de máxima verossimilhança
O detector de máxima verossimilhança escolhe o símbolo $\hat{x}_k$ que maximiza a densidade de probabilidade condicional $p(\mathbf{r}|\mathbf{x}_k)$. Como o ruído é gaussiano:
Ou seja: projetamos cada componente no conjunto de níveis e escolhemos o mais próximo. Isso é ótimo para QAM retangular, pois as regiões de Voronoi são retângulos alinhados com os eixos.
7.5.4 Regiões de decisão de Voronoi
Para cada ponto da constelação $\mathbf{x}_m$, a região de decisão de Voronoi $\mathcal{V}_m$ é o conjunto de pontos no plano $\mathbb{R}^2$ mais próximos de $\mathbf{x}_m$ do que de qualquer outro ponto da constelação:
Para alta SNR, apenas vizinhos mais próximos contam, e recuperamos a expressão de BER da Seção “Probabilidade de Erro — Dedução Completa”.
7.5.5 Efeito de erro de fase
Considere erro de estimação de fase: o receptor usa $\cos(2\pi f_c t + \phi)$ e $-\sin(2\pi f_c t + \phi)$ em vez das bases corretas. A projeção do símbolo $x_k = I_k + jQ_k$ nas bases erradas produz:
A matriz de rotação $R(\phi)$ é ortogonal (preserva normas), então a distância entre pontos não muda. Porém, a grade retangular é rotacionada em relação aos eixos de decisão do receptor.
Para um símbolo no eixo I puro ($I_k=d$, $Q_k=0$), a projeção no eixo I do receptor é $r_I' = d\cos\phi$. A componente "vazada" para Q é $r_Q' = -d\sin\phi$.
Em dB: perda de $-10\log_{10}(\cos^2\phi) \approx 4{,}34\phi^2$ dB para $\phi$ pequeno (em radianos).
7.5.6 Exercício em Python: erro de fase na constelação
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(7)M=16;L=int(np.sqrt(M))levels=np.array([-L+1+2*iforiinrange(L)])/np.sqrt(2*(M-1)/3)I,Q=np.meshgrid(levels,levels)x_clean=I+1j*Qangles=[0,5,15,30]fig,axes=plt.subplots(1,4,figsize=(14,3.5))forax,phiinzip(axes,angles):phi_rad=np.deg2rad(phi)# Rotação da constelacao + ruidox_rot=x_clean*np.exp(1j*phi_rad)sigma=np.sqrt(1/(2*4*10**(12/10)))# Es/N0 = 12 dBnoise=sigma*(rng.standard_normal(len(x_clean))+1j*rng.standard_normal(len(x_clean)))y=x_rot+noiseax.scatter(y.real,y.imag,s=8,alpha=0.3,c='#1e3a5f')ax.scatter(x_clean.real,x_clean.imag,s=15,marker='x',c='red',alpha=0.6)ax.set(aspect='equal',xlim=(-1.2,1.2),ylim=(-1.2,1.2))ax.set_title(f'Erro de fase: {phi} deg\n(perda ~{4.34*phi**2:.2f} dB)')ax.axhline(0,color='gray',lw=0.3);ax.axvline(0,color='gray',lw=0.3)ax.grid(alpha=0.15)plt.tight_layout()plt.show()
7.6 Estimação de Canal e Sincronismo
7.6.1 Pilotos e estimação de canal
Em sistemas práticos, o canal introduce ganho complexo $H = |H|e^{j\phi}$ e possivelmente dispersão. Para QAM de banda estreita (canal plano), o receptor estima $H$ a partir de símbolos piloto conhecidos:
$$
\hat{H} = \frac{r_p}{x_p},
$$
onde $x_p$ é o símbolo piloto transmitido e $r_p$ é a recepção correspondente. O canal estimado é então usado para compensação: $\hat{x}_k = r_k / \hat{H}$.
Pilotos inseridos: símbolos conhecidos são intercalados com dados na constelação. Em OFDM (Seção “Lista de Exercícios Propostos”), pilotos são colocados em subportadoras específicas.
7.6.2 Algoritmo CMA (Constant Modulus Algorithm)
O CMA é um equalizador adaptativo sem necessidade de sequência de treinamento. Definição: minimiza o custo:
Para QPSK, o algoritmo de Viterbi-Viterbi estima e remove a fase: eleva o sinal à potência $M$ (remove a modulação), média, recupera a fase e divide por $M$. Para QAM, adaptações são necessárias pois a constelação não tem amplitude constante.
7.6.4 PLL Costas modificado para QAM
O Costas loop original é para PSK. Para QAM, usa-se uma versão modificada que explora a simetria da constelação: o sinal de erro de fase é gerado a partir dos resíduos após decisão, com ganho adaptativo.
onde $e_n = d_n - \mathbf{w}_n^H\mathbf{x}_n$ é o erro de estimação e $\mu$ é o passo de adaptação. Convergência se $0 < \mu < \frac{2}{\lambda_{\max}}$, onde $\lambda_{\max}$ é o maior autovalor da matriz de autocorrelação da entrada.
Algoritmo RLS (Recursive Least Squares): minimiza a soma ponderada dos erros quadráticos com fator de esquecimento $\lambda \in (0,1]$. Complexidade $O(N^2)$ vs LMS $O(N)$, mas converge muito mais rápido.
7.7 QAM em Prática — Aplicações e Trade-offs
7.7.1 ADSL/VDSL
ADSL2+ usa QAM até 15-QAM (na prática 16-QAM) nos subcanais de banda. VDSL2 usa até 34-QAM (32-QAM) com taxa de até 100 Mb/s. A escolha da ordem QAM por subportadora depende do SNR medido em cada banda.
7.7.2 Wi-Fi (802.11ac/ax)
802.11ac (Wi-Fi 5) suporta até 256-QAM (8 bits/símbolo), proporcionando 10,7 bit/s/Hz por stream. 802.11ax (Wi-Fi 6) mantém 256-QAM mas melhora eficiência com OFDMA e MU-MIMO. A seleção de MCS (Modulation and Coding Scheme) é adaptativa: o AP mede SNR e seleciona a ordem QAM mais alta que mantém BER < $10^{-6}$.
7.7.3 5G NR
5G NR suporta até 256-QAM (downlink) e até 64-QAM (uplink), com até 6 camadas MIMO. Com 100 MHz de banda e 256-QAM, taxas de pico excedem 3 Gb/s.
7.7.4 Cable Modems (DOCSIS 3.1/4.0)
DOCSIS 3.1 suporta até 4096-QAM (12 bits/simbolo) em banda larga, com taxa de ~1 Gb/s. DOCSIS 4.0 estende até ~2 GHz, permitindo mais canais.
7.7.5 Satélites
Satélites preferem APSK (Amplitude Phase Shift Keying) sobre QAM retangular: 8-APSK, 16-APSK, 32-APSK (DVB-S2X). APSK tem PAPR menor que QAM retangular da mesma ordem, o que é crucial para amplificadores de potência de satélite (que operam próximos da saturação para eficiência máxima).
7.7.6 Trade-offs práticos
Fator
Efeito
PAPR
QAM retangular tem PAPR alto $\sim 10\log_{10}(\sqrt{M})$ dB. Exige back-off do PA.
Linearidade do PA
Maior ordem QAM exige PA mais linear → menor eficiência.
EVM
EVM de receptor deve ser $< \frac{d_{\min}}{2}$ para BER aceitável.
Erro de fase
QAM de ordem alta é mais sensível; exige PLL de baixa fase.
Canal freq-seletivo
Requer equalização ou OFDM.
Overhead de pilots
Mais pilotos → menor eficiência espectral efetiva.
7.8 Exercícios resolvidos em Python
7.8.1 Protocolo computacional
Objetivo: validar normalização, regiões ML, mapeamento Gray e BER de QAM. Normalização: imponha $\mathbb E[|s|^2]=1$ antes de adicionar ruído e documente a variância complexa. Validação: compare SER/BER simuladas com teoria e reporte número de bits, erros e incerteza.
7.8.2 Exercício 1: Constelações QAM 16/64/256 com decisão Voronoi
Simule a transmissão de símbolos QAM através de AWGN, visualize as constelações recebidas para diferentes SNRs e verifique as regiões de decisão Voronoi.
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(2026)defconstell_qam(M,n_sym=5000):L=int(np.sqrt(M))k=int(np.log2(M))levels=np.array([-L+1+2*iforiinrange(L)])/np.sqrt(2*(M-1)/3)bits=rng.integers(0,2,(n_sym,k))gray=bits.copy()forbinrange(1,k):gray[:,b]^=gray[:,b-1]m=k//2gI,gQ=gray[:,:m],gray[:,m:]w=2**np.arange(m-1,-1,-1)idxI,idxQ=(gI@w).astype(int),(gQ@w).astype(int)xi,xq=levels[idxI],levels[idxQ]returnxi,xq,levelssnrs=[6,12,18]fig,axes=plt.subplots(1,3,figsize=(14,4))forax,snrinzip(axes,snrs):xi,xq,levels=constell_qam(64)x=xi+1j*xqsigma=np.sqrt(1/(2*6*10**(snr/10)))y=x+sigma*(rng.standard_normal(len(x))+1j*rng.standard_normal(len(x)))ax.scatter(y.real,y.imag,s=4,alpha=0.2,c='#0f4c75')ax.scatter(x.real,x.imag,s=20,marker='x',c='red',alpha=0.4)forlvinlevels:ax.axvline(lv,color='blue',lw=0.3,alpha=0.3)ax.axhline(lv,color='blue',lw=0.3,alpha=0.3)ax.set(aspect='equal',xlim=(-1.2,1.2),ylim=(-1.2,1.2))ax.set_title(f'64-QAM, Eb/N0 = {snr} dB')ax.grid(alpha=0.15);ax.axhline(0,c='gray',lw=0.3);ax.axvline(0,c='gray',lw=0.3)plt.tight_layout();plt.show()
7.8.3 Exercício 2: BER de 16-QAM vs 16-PSK vs BPSK
Compare o BER de 16-QAM, 16-PSK e BPSK em função de $E_b/N_0$. Note que 16-QAM tem 4 bits/símbolo e 16-PSK também, enquanto BPSK tem 1 bit/símbolo.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcdefber_16qam(ebn0_db):M=16;k=4;g=10**(ebn0_db/10)return4/k*(1-1/np.sqrt(M))*0.5*erfc(np.sqrt(6*k*g/(M-1))/np.sqrt(2))defber_16psk(ebn0_db):M=16;g=10**(ebn0_db/10)# Aproximacao: P_s ~ 2Q(sqrt(2*Es/N0*sin^2(pi/M)))return2*0.5*erfc(np.sqrt(2*g*np.sin(np.pi/M)**2)/np.sqrt(2))defber_bpsk(ebn0_db):g=10**(ebn0_db/10)return0.5*erfc(np.sqrt(g))eb=np.arange(0,20,0.5)plt.semilogy(eb,ber_16qam(eb),'o-',label='16-QAM (4 bit/simb)')plt.semilogy(eb,ber_16psk(eb),'s--',label='16-PSK (4 bit/simb)')plt.semilogy(eb,ber_bpsk(eb),'^:',label='BPSK (1 bit/simb)')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-6,1);plt.grid(True,which='both')plt.legend();plt.title('Comparativo BER: 16-QAM vs 16-PSK vs BPSK')plt.tight_layout();plt.show()
7.8.4 Exercício 3: Efeito de erro de fase no BER de QAM
Quantifique a perda de BER causada por erro de fase fixo em 16-QAM.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcM=16;k=4eb=np.arange(2,20,0.5)phases=[0,5,10,15,20]forphiinphases:phi_rad=np.deg2rad(phi)g=10**(eb/10)arg=np.sqrt(6*k*g/(M-1))*np.cos(phi_rad)ber=4/k*(1-1/np.sqrt(M))*0.5*erfc(arg/np.sqrt(2))loss_db=-10*np.log10(np.cos(phi_rad)**2)plt.semilogy(eb,ber,label=fr'$\phi$={phi}$^\circ$ (perda {loss_db:.2f} dB)')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-6,1e-1);plt.grid(True,which='both');plt.legend()plt.title('BER de 16-QAM com erro de fase fixo')plt.tight_layout();plt.show()
7.8.5 Exercício 4: Eficiência espectral vs BER para M-QAM
Visualize a relação entre ordem QAM, eficiência espectral e BER.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfcM_vals=[4,16,64,256,1024]target_ber=1e-3eb_dbs=np.arange(0,30,0.1)plt.figure(figsize=(10,6))forMinM_vals:k=np.log2(M)g=10**(eb_dbs/10)arg=np.sqrt(6*k*g/(M-1))ber=4/k*(1-1/np.sqrt(M))*0.5*erfc(arg/np.sqrt(2))plt.semilogy(eb_dbs,ber,label=f'{M}-QAM ({k} bit/s/Hz)')plt.axhline(target_ber,color='red',linestyle='--',lw=1,label=f'BER alvo = {target_ber}')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-6,0.5);plt.grid(True,which='both')plt.legend();plt.title('BER de QAM retangular: eficiencia espectral vs SNR')plt.tight_layout();plt.show()
7.9 Lista de Exercícios Propostos
E1 (Geometria de constelação). Para 16-QAM com $d=1$, calcule a energia média $E_s$, a distância mínima $d_{\min}$ e o fator de normalização para $E_s=1$. Repita para 64-QAM e 256-QAM.
E2 (Dedução da distância mínima). Prove que para QAM retangular com $L_I \neq L_Q$, a distância mínima é $d_{\min} = \min(2d_I, 2d_Q)$, onde $d_I$ e $d_Q$ são as meias-distâncias nos eixos I e Q, respectivamente.
E3 (Energia normalizada). Mostre que para $E_s$ fixo, a relação entre $d_{\min}$ e $M$ em QAM quadrada é $d_{\min} = \sqrt{6/(M-1)}$. Use isso para calcular a perda em dB de $d_{\min}$ ao passar de QPSK ($M=4$) para 16-QAM ($M=16$) mantendo $E_s$ constante.
E4 (BER de 64-QAM). Use a expressão aproximada de BER para 64-QAM e calcule o BER para $E_b/N_0 = 15$ dB. Compare com o valor para 16-QAM ao mesmo $E_b/N_0$.
E5 (Comparativo QAM vs PSK). Para $M=16$, $32$, $64$, calcule numericamente a diferença de $E_b/N_0$ necessária para atingir BER $=10^{-6}$. Use a expressão QAM da Seção “DEDUÇÃO da BER para QAM retangular” e $P_s^{\text{PSK}}\approx2Q\left(\sqrt{2E_s/N_0}\sin(\pi/M)\right)$, declarando a aproximação usada para converter SER em BER.
E6 (Decisão Voronoi). Dada uma constelação 16-QAM normalizada, escreva as regiões de Voronoi para: (a) um ponto de canto, (b) um ponto de borda, (c) um ponto interno. Esboce graficamente.
E7 (Perda por erro de fase). Prove que para erro de fase pequeno $\phi$, a perda de SNR em dB é $10\log_{10}(\cos^2\phi) \approx -4{,}34\phi^2$. Calcule a perda para $\phi = 2^\circ$, $5^\circ$, $10^\circ$.
E8 (CMA). Derive a atualização do algoritmo CMA a partir da minimização de $J(\mathbf{w}) = \mathbb{E}[|y_n|^2-R]^2$ usando gradiente estocástico. Explique o papel da constante de módulo $R$ e por que ela depende da constelação.
E9 (Trade-off prático). Em um sistema Wi-Fi 802.11ac com 80 MHz de banda, 4 streams MIMO, e 256-QAM, calcule a taxa máxima teórica (ignorando overhead). Se o SNR cai a ponto de exigir 64-QAM, qual é a nova taxa? E com 16-QAM?
E10 (SER vs BER). Mostre que para QAM quadrada com Gray, $P_s = 1 - (1-P_b^{\text{eixo}})^2$. Para alta SNR, aproxime $P_s \approx 2P_b^{\text{eixo}}$ e use isso para recuperar a expressão de BER.
E11 (QAM retangular não-quadrada). Considere 32-QAM retangular como $4 \times 8$. Calcule $d_{\min}$, $E_s$ e BER aproximada. Compare com 32-PSK.
E12 (Constante de módulo CMA). Para QPSK, verifique que $R = \mathbb{E}[|x_k|^4]/\mathbb{E}[|x_k|^2] = 1$ (com $E_s=1$). Para 16-QAM, calcule $R$ numericamente e explique por que o CMA puro é menos adequado para QAM que para PSK.
E2. Em QAM retangular, pontos diferem por múltiplos inteiros de $2d_I$ no eixo I e $2d_Q$ no eixo Q. A distância mínima é o menor deslocamento entre pontos vizinhos, que é $\min(2d_I, 2d_Q)$ quando um eixo não se move e o outro move uma única vez.
E3. $d_{\min} = \sqrt{6/(M-1)}$. Para QPSK: $d_{\min} = \sqrt{2}$. Para 16-QAM: $d_{\min} = \sqrt{6/15} = \sqrt{0{,}4}$. Logo, à mesma $E_s$, a razão entre os quadrados das distâncias é $2/0{,}4=5$, ou $10\log_{10}(5)\approx7{,}0$ dB. Isso não é diretamente uma perda em $E_b/N_0$, pois $E_s=E_b\log_2M$ muda com $M$.
E4. Para 64-QAM a 15 dB, $k=6$ e $\gamma_b=31{,}62$: $x=\sqrt{3k\gamma_b/(M-1)}=\sqrt{18\cdot31{,}62/63}\approx3{,}01$. Assim, $P_b\approx(4/6)(1-1/8)Q(x)\approx\boxed{7{,}6\times10^{-4}}$. Para 16-QAM, $x=\sqrt{12\cdot31{,}62/15}\approx5{,}03$ e $P_b\approx\boxed{1{,}8\times10^{-7}}$. A ordem maior oferece mais bits por símbolo, mas exige mais $E_b/N_0$ para a mesma BER.
E10. $P_s = 1-(1-p)^2 = 2p-p^2 \approx 2p$ para $p \ll 1$. Com Gray, $P_b \approx P_s/\log_2 M$, logo $P_b \approx 2p/\log_2 M = 2P_b^{\text{eixo}}/\log_2 M$.
E11. 4×8: eixo I com 4 níveis ($d_I$), eixo Q com 8 níveis ($d_Q$). $d_{\min} = \min(2d_I, 2d_Q)$. $E_s = \frac{d_I^2(4^2-1)}{3} + \frac{d_Q^2(8^2-1)}{3}$. A BER total é a média ponderada pelos números de bits atribuídos a cada eixo.
E12. QPSK: $|x_k|=1$ sempre, $\mathbb{E}[|x|^4]=1$, $\mathbb{E}[|x|^2]=1$, $R=1$. 16-QAM: níveis normalizados, $\mathbb{E}[|x|^2]=1$, $\mathbb{E}[|x|^4] = \frac{1}{16}\sum_{m=1}^{16}|x_m|^4 \approx 1{,}9$. CMA busca amplitude constante, então para QAM (amplitudes variadas) o erro residual é maior — por isso CMA é mais adequado para PSK.
8. Equalização — Compensação da Dispersão do Canal
Ao final, você deve diagnosticar ISI, derivar ZF e MMSE, explicar convergência adaptativa e escolher entre equalização linear, DFE, MLSE e OFDM. Diagnóstico: por que inverter exatamente o canal pode piorar o receptor? Evidência mínima: comparar resposta conjunta, MSE e BER de ZF e MMSE no mesmo canal e SNR.
8.2 Origem da ISI e o problema da equalização
8.2.1 Dispersão do canal: o fenômeno físico
Em qualquer canal de comunicação real, o sinal se propaga por múltiplos percursos (multipath): reflexões, refrações e difrações fazem com que o receptor capte várias cópias atrasadas do mesmo símbolo. Alternativamente, um canal pode ser banda limitada, filtrando os componentes de alta frequência do sinal. Em ambos os casos, a resposta ao impulso do canal não é um impulso único $\delta(t)$, mas sim uma função decaimento $h(t)$ com duração finita ou efetiva.
Considere um canal modelado como um filtro linear com resposta ao impulso $h_c(t)$. O sinal recebido (após o filtro de recepção) é:
onde $x[n]$ são os símbolos transmitidos, $h[\ell]$ é a resposta ao impulso discreta do canal (com $L$ taps), e $w[n]$ é o ruído AWGN amostrado.
8.2.2 ISI — Interferência Intersimbólica
Quando $h[\ell] \neq 0$ para $\ell \neq 0$, um símbolo $x[n]$ "vaza" para instantes de amostragem vizinhos, interferindo com símbolos subsequentes e anteriores. Este fenômeno é chamado de ISI (Interferência Intersimbólica).
onde $H_c(z)$ é a resposta do canal, $H_{\text{rx}}(z)$ é o filtro de recepção (tipicamente um filtro casado), $H_{\text{eq}}(z)$ é o equalizador, e $d$ é o atraso de decisão (permitindo que o equalizador seja causal).
Dedução: O sinal recebido no domínio Z é $R(z) = X(z)H_c(z)H_{\text{rx}}(z) + W(z)$. Após o equalizador:
O objetivo é que $C(z) \approx z^{-d}$, de modo que $y[n] \approx x[n-d] + \text{ruído amplificado}$.
8.2.4 Diagrama de olho
O diagrama de olho é uma ferramenta visual poderosa para avaliar a presença de ISI. Ele superpõe segmentos do sinal recebido, cada um de duração $T_s$, centralizados em múltiplos de $T_s$.
Olho aberto (abertura vertical grande) = pouco ISI, fácil decisão.
Olho fechado (abertura vertical pequena) = ISI severo, alta probabilidade de erro.
A largura horizontal do olho aberto indica a margem de timing.
A altura vertical no ponto de amostragem é proporcional à margem de ruído.
Uma medida determinística simples para BPSK é comparar o cursor principal com a soma absoluta dos demais cursores:
Se o termo entre parênteses for positivo, ele é uma cota inferior da abertura vertical sem ruído; o ruído torna as trajetórias espessas e deve ser descrito separadamente, por exemplo com intervalos $\pm q\sigma_n$. Não se mede abertura usando o menor pós-cursor isolado.
onde $x[n]$ é a entrada (sinal recebido), $w_k$ são os coeficientes do equalizador, e $N$ é o número de taps (estágios de atraso).
Estrutura: O sinal de entrada passa por uma série de $N-1$ estágios de atraso ($z^{-1}$). Cada amostra atrasada é multiplicada por um coeficiente $w_k$ e a soma produz a saída.
Representação matricial: Para $M$ amostras consecutivas:
$$
\boxed{c[k] = \begin{cases} 1, & k = d \\ 0, & k \neq d \end{cases}}
$$
onde $c = h * w$ é a convolução da resposta do canal com a resposta do equalizador.
8.3.3 DEDUÇÃO dos coeficientes ZF no domínio do tempo
Seja $h = [h_0, h_1, \ldots, h_{L-1}]$ a resposta do canal e $w = [w_0, w_1, \ldots, w_{N-1}]$ a resposta do equalizador. A convolução $c = h * w$ tem $L+N-1$ amostras. Impomos $c[d] = 1$ e $c[k] = 0$ para $k \neq d$.
Construa a matriz de convolução $\mathbf H\in\mathbb C^{(L+N-1)\times N}$:
Então $\mathbf c=\mathbf H\mathbf w$ e o alvo é o vetor $\mathbf e_d$ com 1 na posição $d$. Como há $L+N-1$ restrições e apenas $N$ coeficientes, um FIR finito normalmente não consegue zerar todos os cursores. Há três casos:
Se $\mathbf H\mathbf w=\mathbf e_d$ for consistente, qualquer solução exata é ZF.
Se for sobredefinido, usa-se o ZF de mínimos quadrados
quando $\mathbf H$ tem posto completo.
3. Se a matriz for mal condicionada ou singular, usa-se a pseudoinversa SVD e aceita-se ISI residual; regularização conduz ao MMSE.
O atraso $d$ deve ser testado: ele altera quais pré- e pós-cursores um FIR causal consegue aproximar.
8.3.4 Solução numérica
Resolver as equações normais custa $O(N^3)$ e pode piorar o condicionamento. Decomposição QR ou SVD é numericamente preferível. Levinson–Durbin só se aplica quando o sistema resultante é Hermitiano Toeplitz positivo definido; não se deve aplicá-lo automaticamente à matriz retangular de convolução.
8.3.5 Exercício em Python: equalizador ZF para canal de 3 taps
PYTHON
import numpy as npimport matplotlib.pyplot as plt# Canal de 3 tapsh=np.array([0.3,1.0,0.45])# Numero de taps do equalizadorN=5d=N//2# atraso de decision# Construir matriz Toeplitz do canalH=np.zeros((N,N))foriinrange(N):forjinrange(N):lag=i-jif0<=lag<len(h):H[i,j]=h[lag]# Vetor desejado: impulso atrasado em ddesired=np.zeros(N)desired[d]=1.0# Resolver w = H^{-1} * desiredw_zf=np.linalg.solve(H,desired)print(f'Coeficientes ZF: {np.round(w_zf, 4)}')# Verificar resposta conjuntac=np.convolve(h,w_zf)[:N+2]print(f'Resposta conjunta: {np.round(c, 4)}')# Plotar resposta do canal e equalizadorfig,axes=plt.subplots(2,1,figsize=(8,6))axes[0].stem(range(len(h)),np.abs(h),linefmt='b-',markerfmt='bo')axes[0].set_title('Resposta ao impulso do canal')axes[0].set_xlabel('amostra');axes[0].set_ylabel('|h|')axes[1].stem(range(len(w_zf)),np.abs(w_zf),linefmt='r-',markerfmt='ro')axes[1].set_title('Coeficientes do equalizador ZF')axes[1].set_xlabel('amostra');axes[1].set_ylabel('|w|')plt.tight_layout();plt.show()
O ZF não melhora a SNR de cada frequência: a inversão escala sinal e ruído igualmente. O problema aparece ao restaurar uma resposta plana, pois as frequências muito atenuadas recebem enorme potência de ruído e dominam a variância total.
8.4.4 Trade-off fundamental
8.5 Equalizadores MMSE — Dedução Completa
8.5.1 Critério MMSE: minimização do erro quadrático
Esta é a forma Tikhonov. Na expressão geral $\mathbf w=\mathbf R_r^{-1}\mathbf p$, o ruído já está incluído em $\mathbf R_r$; adicionar outro $\alpha\mathbf I$ contaria a regularização duas vezes.
Quando $\sigma_w^2 \to 0$ (SNR $\to \infty$): $\mathbf{w}_{\text{MMSE}} \to \mathbf{w}_{\text{ZF}}$.
Quando $\sigma_w^2 \to \infty$ (SNR $\to 0$): $\mathbf{w}_{\text{MMSE}} \to \mathbf{0}$ (melhor não equalizar do que amplificar ruído).
Métrica
ZF
MMSE
ISI
0
Residual (controlado)
Ruído amplificado
Máximo
Minimizado
Critério otimizado
Não otimiza MSE/SNR; força zero de ISI no modelo
Minimiza MSE entre saída e símbolo desejado no modelo adotado
Complexidade
$O(N^3)$
$O(N^3)$
Conhecimento do canal
Necessário
Necessário
8.5.6 Exercício em Python: ZF vs MMSE — BER vs SNR
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(13)defsimulate_zf_mmse(eb_n0_dbs,h,N_eq,n_sym=50000):"""Simula equalizadores ZF e MMSE e retorna BER."""k=2# QPSK: dois bits por símboloEbN0=10**(np.array(eb_n0_dbs)/10)results={}forlbl,gamma_factorin[('ZF',1.0),('MMSE',1.0)]:berrs=[]fordb,eb_n0inzip(eb_n0_dbs,EbN0):# Simbolos QPSKbits=rng.integers(0,2,(n_sym,k))x=(2*bits[:,0]-1)+1j*(2*bits[:,1]-1)# Canal + ruidoy=np.convolve(x,h,mode='full')sigma=np.sqrt(1/(2*k*eb_n0))y+=sigma*(rng.standard_normal(len(y))+1j*rng.standard_normal(len(y)))# Equalizacaoy_eq=np.convolve(y,np.ones(N_eq),mode='valid')/N_eq# Decision QPSKybits=np.column_stack([(y_eq.real>=0).astype(int),(y_eq.imag>=0).astype(int)])delay=len(h)-1reference=bits[delay:delay+len(ybits)]ber=np.mean(ybits[:len(reference)]!=reference)berrs.append(ber)results[lbl]=np.array(berrs)returnresultsh=np.array([0.3,1.0,0.45,0.2,0.1])eb=np.arange(2,18,1)res=simulate_zf_mmse(eb,h,N_eq=9,n_sym=30000)plt.figure(figsize=(8,5))forlbl,berinres.items():plt.semilogy(eb,ber,'-o',label=f'{lbl} (equalizador transversal)')plt.axhline(1e-4,color='gray',linestyle='--',lw=0.8,label='BER = 1e-4')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-5,1);plt.grid(True,which='both');plt.legend()plt.title('ZF vs MMSE: BER vs SNR para canal dispersivo')plt.tight_layout();plt.show()
8.6 Equalização por Detecção de Sequência
8.6.1 Detecção ML de sequência
Dedução do critério ML: O ruído é gaussiano, então:
onde $K$ é o número de símbolos e $M^L$ é o número de transições totais por etapa.
8.6.3 Trade-offs da detecção de sequência
Fator
Impacto
$L$ (memória do canal)
Complexidade exponencial: $M^{L-1}$ estados
$M$ (ordem da constelação)
Complexidade exponencial: $M^{L-1}$ estados
Performance
Próxima do limite teórico de ML
Latência
Atraso de decisão $\approx$ comprimento do trellis
8.7 Equalização Adaptativa: LMS, RLS e CMA
8.7.1 Por que equalização adaptativa?
Quando o canal é desconhecido ou variante no tempo, os coeficientes do equalizador não podem ser calculados offline. A equalização adaptativa atualiza os coeficientes em tempo real, usando dados recebidos.
Modos de operação:
Treinamento: Usa uma sequência conhecida de treinamento (pilot sequence). O símbolo desejado é o símbolo de treinamento.
Decision-directed: Após a convergência, o símbolo desejado é a decisão do equalizador. Mais eficiente em overhead, mas propenso a propagação de erros.
8.7.2 Algoritmo LMS (Least Mean Squares)
Dedução do algoritmo LMS: A partir do critério MMSE, derivamos a atualização do gradiente estocástico. O erro instantâneo é $e[n] = d[n] - \mathbf{w}^H[n]\mathbf{x}_n$. A atualização:
onde a aproximação vale para $\mu\lambda_k\ll1$. A razão $\kappa=\lambda_{\max}/\lambda_{\min}$ determina a dispersão das velocidades. Limites de convergência em média quadrática são mais restritivos e dependem das estatísticas de ordem superior; o limite acima não garante baixo misadjustment.
onde $\mathbf{P}[n] = \bigl(\sum_{k=0}^n \lambda^{n-k}\mathbf{x}[k]\mathbf{x}^H[k]\bigr)^{-1}$ é a matriz de inversa de autocorrelação.
Complexidade: $\mathcal{O}(N^2)$ por atualização vs. LMS $\mathcal{O}(N)$. Convergência muito mais rápida, especialmente para canais mal condicionados.
com $y[n] = \mathbf{w}^H[n]\mathbf{x}[n]$ e $R = \mathbb{E}[|x_k|^4]/\mathbb{E}[|x_k|^2]$.
Propriedades:
Não requer sequência de treinamento.
Convergência mais lenta que LMS.
Não corrige rotação de fase (ambiguidade de fase).
Adequado para PSK e QPSK (amplitude constante).
Menos adequado para QAM de ordem alta (amplitudes variadas).
8.7.6 Exercício em Python: tracking de canal com LMS
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(2026)# Canal variante no tempo (modelo Jakes simplificado)L_chan=3;L_eq=9;mu=0.01;N=20000d=L_eq//2h_true=np.array([0.5,1.0,0.3])h_eq_est=np.zeros(L_eq)w_lms=np.zeros(L_eq,dtype=complex)mse_hist=[]ber_hist=[]k=4# QPSKn_sym=N//4bits=rng.integers(0,2,(n_sym,k))gray=bits.copy()forbinrange(1,k):gray[:,b]^=gray[:,b-1]m=k//2w=2**np.arange(m-1,-1,-1)sI=(gray[:,:m]@w).astype(int)sQ=(gray[:,m:]@w).astype(int)xs=(2*sI-(2**(m)-1))+1j*(2*sQ-(2**(m)-1))eb_n0_db=15;eb_n0=10**(eb_n0_db/10)sigma=np.sqrt(1/(2*k*eb_n0))mse_arr=[]forninrange(L_eq-1,N):# Variacao lenta do canalphase=0.1*np.random.randn()h_var=h_true*np.exp(1j*phase)# Transmitirx_pad=np.concatenate([np.zeros(L_chan-1),xs])clean_rx=np.convolve(x_pad,h_var)rx=clean_rx+sigma*(rng.standard_normal(len(clean_rx))+1j*rng.standard_normal(len(clean_rx)))# Extrair vetor de entradau=rx[n-L_eq+1:n+1]iflen(u)!=L_eq:continue# Filtrary=w_lms@u# Errod_sym=xs[n-L_eq+1+d]# simbolo desejado (decision-directed)e=d_sym-y# Atualizarw_lms+=mu*np.conj(u)*emse_arr.append(np.real(e*np.conj(e)))# Plotar MSE e convergenciafig,axes=plt.subplots(2,1,figsize=(10,7))axes[0].semilogy(np.convolve(mse_arr,np.ones(200)/200,mode='valid'),'#1e3a5f')axes[0].set_title(f'Convergencia LMS: MSE medio movil (N={L_eq}, mu={mu})')axes[0].set_xlabel('amostra');axes[0].set_ylabel('MSE')axes[0].grid(alpha=0.3)# Comparar equalizador estimado com canal inversow_final=w_lmsc_est=np.convolve(h_true,w_final)[:L_chan+L_eq-1]axes[1].stem(range(len(c_est)),np.abs(c_est),linefmt='b-',markerfmt='bo')axes[1].axvline(d,color='r',linestyle='--',label=f'd = {d}')axes[1].set_title('Resposta conjunta canal x equalizador')axes[1].set_xlabel('amostra');axes[1].set_ylabel('|c[n]|')axes[1].legend();axes[1].grid(alpha=0.3)plt.tight_layout();plt.show()
8.8 Equalização em Sistemas Práticos
8.8.1 GSM
Em GSM, a sequência de treinamento no meio do burst permite estimar o canal. Receptores clássicos usam detecção de sequência por Viterbi/MLSE ou variantes de complexidade reduzida; não existe uma regra geral de “equalizador MMSE de 15 taps”. O exemplo ilustra por que treinamento conhecido é necessário antes da detecção dos dados.
8.8.2 Wi-Fi (802.11 a/g/n/ac/ax)
Em OFDM (802.11), cada subportadora experimenta canal plano. A equalização é por um tap:
Esta é a grande vantagem do OFDM: transforma equalização de $N$ taps em $N_{\text{sub}}$ equalizadores de 1 tap.
8.8.3 4G LTE / 5G NR
LTE usa OFDM no downlink (DFT-s-OFDM no uplink). Equalização de 1 tap por subportadora no downlink. No uplink DFT-s-OFDM (SC-FDMA), usa-se equalizador ZF/MMSE de 1 tap por subportadora (menos PAPR que OFDM puro).
5G NR estende para mais subportadoras (até 273 MHz de banda), mas o princípio é o mesmo: equalização no domínio da frequência.
8.8.4 DSL (Digital Subscriber Line)
DSL usa DMT (Discrete Multitone): o espectro é dividido em ~256 bandas de 4,3125 kHz. Cada banda tem equalizador de 1 tap. A ordem QAM é adaptativa por banda: banda com bom SNR usa 256-QAM, banda com ruim SNR usa QPSK.
onde $H[k]$ é a resposta do canal na subportadora $k$. A equalização torna-se um ganho complexo escalar por subportadora — complexidade $O(1)$ por subportadora, em contraste com $O(N)$ do equalizador temporal.
Custo: Overhead do prefixo cíclico (tipicamente 1/4 do símbolo) e perda de eficiência espectral.
8.9 Exercícios resolvidos em Python
8.9.1 Protocolo computacional
Objetivo: comparar ZF, MMSE e LMS sob o mesmo canal e ruído. Controle experimental: reutilize símbolos e realizações de canal ao comparar métodos. Validação: reporte resposta conjunta, MSE, ganho de ruído, abertura do olho e BER antes/depois; descarte o transiente adaptativo declarado.
8.9.2 Exercício 1: Equalizador ZF para canal de 3 caminhos
Projete um equalizador ZF para o canal $h = [0{,}3,\; 1{,}0,\; 0{,}45]$ com 5 taps e verifique o ISI residual.
PYTHON
import numpy as npimport matplotlib.pyplot as plth=np.array([0.3,1.0,0.45])N=5;d=N//2# Matriz Toeplitz do canalH=np.zeros((N,N))foriinrange(N):forjinrange(N):lag=i-jif0<=lag<len(h):H[i,j]=h[lag]# ZF: w tal que Hw = e_ddesired=np.zeros(N);desired[d]=1.0w_zf=np.linalg.solve(H,desired)print(f'Coeficientes ZF: {np.round(w_zf, 4)}')# Resposta conjuntac=np.convolve(h,w_zf)[:N+2]print(f'Resposta conjunta: {np.round(c, 4)}')print(f'ISI residual (fora d): {np.round(np.max(np.abs(np.delete(c, d))), 6)}')fig,ax=plt.subplots(figsize=(8,4))ax.stem(range(len(c)),np.abs(c),linefmt='b-',markerfmt='bo')ax.axvline(d,color='r',linestyle='--',label=f'd={d} (simbolo desejado)')ax.set_title('Resposta conjunta canal + equalizador ZF')ax.set_xlabel('amostra');ax.set_ylabel('|c[n]|');ax.legend();ax.grid(alpha=0.3)plt.tight_layout();plt.show()
8.9.3 Exercício 2: Comparação ZF vs MMSE — BER vs SNR
Compare o BER de equalizadores ZF e MMSE em um canal com deep fading.
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(42)defrun_equalization_compare(eb_n0_dbs,h,N_eq=9,n_sym=20000):results={'ZF':[],'MMSE':[]}fordbineb_n0_dbs:EbN0=10**(db/10);k=4;sigma=np.sqrt(1/(2*k*EbN0))bits=rng.integers(0,2,(n_sym,k))gray=bits.copy()forbinrange(1,k):gray[:,b]^=gray[:,b-1]m=k//2;weights=2**np.arange(m-1,-1,-1)xi=gray[:,:m]@weights;xq=gray[:,m:]@weightsxs=(2*xi-(2**m-1))+1j*(2*xq-(2**m-1))rx=np.convolve(xs,h,'full')+sigma*(rng.standard_normal(len(xs)+len(h)-1)+1j*rng.standard_normal(len(xs)+len(h)-1))foreq_typein['ZF','MMSE']:ifeq_type=='ZF':# ZF: matriz de autocorrelacao do canalR=np.zeros((N_eq,N_eq))foriinrange(N_eq):forjinrange(N_eq):R[i,j]=sum(h[t]*h[t-abs(i-j)]fortinrange(abs(i-j),len(h)))p=np.array([h[d-i]if0<=d-i<len(h)else0.0foriinrange(N_eq)])w=np.linalg.solve(R,p)else:# MMSE: R + noise regularizationsigma2=sigma**2*2# ruido complexoR=np.zeros((N_eq,N_eq))foriinrange(N_eq):forjinrange(N_eq):R[i,j]=sum(h[t]*h[t-abs(i-j)]fortinrange(abs(i-j),len(h)))p=np.array([h[d-i]if0<=d-i<len(h)else0.0foriinrange(N_eq)])w=np.linalg.solve(R+sigma2*np.eye(N_eq),p)y_eq=np.convolve(rx,w,'full')y_dec=np.sign(y_eq.real)+1j*np.sign(y_eq.imag)yh=np.column_stack([(y_dec.real>0).astype(int),(y_dec.imag>0).astype(int)])reference=bits[:len(yh),:2]results[eq_type].append(np.mean(yh[:len(reference)]!=reference))returnnp.array(results['ZF']),np.array(results['MMSE'])h=np.array([1.0,-0.95,0.3])# canal com nulo espectraleb=np.arange(4,22,2)ber_zf,ber_mmse=run_equalization_compare(eb,h)plt.figure(figsize=(8,5))plt.semilogy(eb,ber_zf,'o-',label='Zero-Forcing')plt.semilogy(eb,ber_mmse,'s-',label='MMSE')plt.axhline(1e-4,color='gray',ls='--',lw=0.8,label='BER = 1e-4')plt.xlabel('$E_b/N_0$ (dB)');plt.ylabel('BER')plt.ylim(1e-5,1);plt.grid(True,which='both');plt.legend()plt.title('ZF vs MMSE: canal com nulo espectral (h=[1,-0.95,0.3])')plt.tight_layout();plt.show()
8.9.4 Exercício 3: Algoritmo LMS adaptativo — tracking de canal
Simule o tracking de canal variante no tempo usando LMS.
PYTHON
import numpy as npimport matplotlib.pyplot as pltrng=np.random.default_rng(7)L_chan,L_eq,mu,N=4,11,0.005,15000d=L_eq//2;k=4;EbN0=15;sigma=np.sqrt(1/(2*k*10**(EbN0/10)))h_true=np.array([0.4,1.0,-0.3,0.2])w_lms=np.zeros(L_eq,dtype=complex)mse_track=[]err_angle=[]bits=rng.integers(0,2,(N//1,k))gray=bits.copy()forbinrange(1,k):gray[:,b]^=gray[:,b-1]m=k//2;wts=2**np.arange(m-1,-1,-1)xi=(gray[:,:m]@wts).astype(int);xq=(gray[:,m:]@wts).astype(int)xs=(2*xi-(2**m-1))+1j*(2*xq-(2**m-1))mse_vals=[]forninrange(L_eq-1,N):phase=0.05*np.random.randn()h_v=h_true*np.exp(1j*phase)rx=np.convolve(np.concatenate([np.zeros(L_chan-1),xs]),h_v,'valid')rx+=sigma*(rng.standard_normal(len(rx))+1j*rng.standard_normal(len(rx)))u=rx[n-L_eq+1:n+1];d_sym=xs[n-L_eq+1+d]y=w_lms@u;e=d_sym-yw_lms+=mu*np.conj(u)*emse_vals.append(np.real(e*np.conj(e)))err_angle.append(np.mean(np.angle(w_lms[:len(h_v)])-np.angle(h_v)))fig,axes=plt.subplots(2,1,figsize=(10,7))axes[0].semilogy(np.convolve(mse_vals,np.ones(100)/100,mode='valid'),'#0f4c75')axes[0].set_title('Convergencia LMS: MSE em canal variante (mu=0.005)')axes[0].set_xlabel('amostra');axes[0].set_ylabel('MSE');axes[0].grid(alpha=0.3)axes[1].plot(err_angle)axes[1].set_title('Fase do canal vs estimativa');axes[1].set_xlabel('amostra');axes[1].set_ylabel('fase (rad)')plt.tight_layout();plt.show()
8.9.5 Exercício 4: Diagrama de olho antes e após equalização
Visualize o diagrama de olho do sinal recebido sem equalização e com equalizador MMSE.
PYTHON
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.colors importLogNormrng=np.random.default_rng(13)h=np.array([0.3,1.0,0.45,0.2])N_eq=11;d=N_eq//2;N=50000;k=4;EbN0=18sigma=np.sqrt(1/(2*k*10**(EbN0/10)))bits=rng.integers(0,2,(N//2,k))gray=bits.copy()forbinrange(1,k):gray[:,b]^=gray[:,b-1]m=k//2;wts=2**np.arange(m-1,-1,-1)xi=(gray[:,:m]@wts).astype(int);xq=(gray[:,m:]@wts).astype(int)xs=(2*xi-(2**m-1))+1j*(2*xq-(2**m-1))rx=np.convolve(xs,h,'full')+sigma*(rng.standard_normal(len(xs)+len(h)-1)+1j*rng.standard_normal(len(xs)+len(h)-1))# MMSER=np.zeros((N_eq,N_eq))foriinrange(N_eq):forjinrange(N_eq):R[i,j]=sum(h[t]*h[t-abs(i-j)]fortinrange(abs(i-j),len(h)))p=np.array([h[d-i]if0<=d-i<len(h)else0.0foriinrange(N_eq)])w_mmse=np.linalg.solve(R+sigma**2*2*np.eye(N_eq),p)rx_eq=np.convolve(rx,w_mmse,'full')fig,axes=plt.subplots(1,2,figsize=(14,5))# Sem equalizacaoxs_slice=rx[N_eq-1:N_eq-1+N*2]forninrange(0,N,100):segment=xs_slice[n:n+2*N_eq]iflen(segment)==2*N_eq:axes[0].plot(np.linspace(0,2,len(segment)),segment.real,'b',alpha=0.03)axes[0].axvline(1,color='r',lw=1.5,alpha=0.7);axes[0].axhline(0,color='gray',lw=0.5)axes[0].set_title('Diagrama de olho: SEM equalizacao')axes[0].set_xlabel('tempo (simbolos)');axes[0].set_ylabel('amplitude')# Com equalizacaoxs_eq=rx_eq[N_eq-1:N_eq-1+N*2]forninrange(0,N,100):segment=xs_eq[n:n+2*N_eq]iflen(segment)==2*N_eq:axes[1].plot(np.linspace(0,2,len(segment)),segment.real,'g',alpha=0.03)axes[1].axvline(1,color='r',lw=1.5,alpha=0.7);axes[1].axhline(0,color='gray',lw=0.5)axes[1].set_title('Diagrama de olho: com MMSE')axes[1].set_xlabel('tempo (simbolos)');axes[1].set_ylabel('amplitude')plt.tight_layout();plt.show()
8.10 Lista de Exercícios Propostos
E1 (Origem da ISI). Um canal tem resposta ao impulso $h = [0{,}2, 1{,}0, 0{,}3, 0{,}1]$. Qual é o comprimento da ISI em símbolos? Calcule a interferência que o símbolo $x[n]$ causa nos símbolos $x[n+1]$, $x[n+2]$ e $x[n+3]$ (em termos de amplitude relativa).
E2 (Dedução ZF). Para o canal $h=[0{,}5,1{,}0,0{,}3]$, construa a matriz de convolução $\mathbf H$ para um equalizador FIR de $N=5$ taps. Para cada atraso admissível, resolva $\min_{\mathbf w}\|\mathbf H\mathbf w-\mathbf e_d\|^2$ e identifique o menor ISI residual. Explique por que um FIR finito não garante ISI exatamente nula.
E3 (Limitações do ZF). Para o canal $H(e^{j\omega}) = 1 - 0{,}9e^{-j\omega}$, trace o magnitude no domínio da frequência e explique onde o ZF amplifica mais ruído. Calcule o ganho do ZF nas frequências $\omega = 0$ e $\omega = \pi$.
E4 (MMSE vs ZF). Para o mesmo canal do E3, com $N_0/E_s = 0{,}1$ e $0{,}5$, calcule e compare os equalizadores MMSE e ZF de 3 taps. Qual produz menor erro quadrático médio?
E5 (Convergência LMS). Derive a condição de convergência $0 < \mu < 2/\lambda_{\max}$ a partir da análise do erro de peso $\tilde{\mathbf{w}}[n]$. Explique por que a razão $\kappa = \lambda_{\max}/\lambda_{\min}$ afeta a velocidade de convergência.
E6 (RLS vs LMS). Compare a complexidade computacional (operações por amostra) do LMS e RLS para equalizadores de $N=11$ taps. Quantas multiplicações cada um requer por atualização?
E7 (MLSE — complexidade). Para um canal com memória $L=5$ e constelação 16-QAM, qual é o número de estados do trellis de Viterbi? Qual seria o número para BPSK ($M=2$)?
E8 (Teorema OFDM). Prove que, com prefixo cíclico de comprimento $L_{\text{CP}} \geq L-1$, a matriz de convolução do canal é circular e diagonalizada pela DFT. Dê a demonstração passo a passo.
E9 (DFE — decision feedback equalizer). Considere o DFE com filtros feedforward $\mathbf{f}$ e feedback $\mathbf{b}$. A saída é $z[n] = \mathbf{f}^H\mathbf{x}_n - \sum_{k=1}^{L_b} b_k\hat{x}[n-k]$. Explique por que o DFE evita o problema de amplificação de ruído do ZF.
E10 (Equalização em DSL). Um sistema didático usa 256 bandas DMT espaçadas de aproximadamente 4,3 kHz e taxa de 4 ksymbols/s por banda. Suponha que 100 bandas usem 256-QAM, 80 usem 16-QAM e 76 usem QPSK. Calcule a taxa bruta ignorando overhead e tons de guarda.
8.11 Gabarito
E1. ISI: $L=4$, então o símbolo $x[n]$ interfere em $n+1$ (0,2), $n+2$ (0,3) e $n+3$ (0,1). Além disso, $x[n]$ interfere em $n-1$ (0,5) se consideramos pré-cursores. O comprimento total da ISI é $L=4$ símbolos (do $-1$ ao $+3$ em relação ao instante de amostragem).
Construa $\mathbf H$ com $L+N-1=7$ linhas e 5 colunas. Para cada $d$, calcule $\mathbf w_d=\mathbf H^\dagger\mathbf e_d$ e o resíduo $\rho_d=\|\mathbf H\mathbf w_d-\mathbf e_d\|^2$. Escolha o $d$ de menor $\rho_d$. Em geral $\rho_d>0$, pois há sete condições e apenas cinco incógnitas; somente canais/casos especiais admitem solução exata.
E3. $H(\omega) = 1 - 0{,}9e^{-j\omega} = 1 - 0{,}9\cos\omega + j0{,}9\sin\omega$. $|H(\omega)|^2 = (1-0{,}9\cos\omega)^2 + (0{,}9\sin\omega)^2 = 1 - 1{,}8\cos\omega + 0{,}81$. Em $\omega = 0$: $|H| = |0{,}1| = 0{,}1$. Em $\omega = \pi$: $|H| = |1{,}9| = 1{,}9$. O ZF tem ganho $1/0{,}1 = 10$ em $\omega=0$ vs $1/1{,}9 \approx 0{,}53$ em $\omega=\pi$. Amplificação máxima no $\omega=0$ (fator 19x maior que em $\pi$).
E4. MMSE com $N_0/E_s = 0{,}1$: regularização fraca, aproxima-se do ZF. Com $N_0/E_s = 0{,}5$: regularização forte, coeficientes menores, mais ruído residual mas menos amplificação. O MMSE sempre produz menor MSE que ZF (por definição de otimização).
E5. Usando a convenção LMS $\mathbf w[n+1]=\mathbf w[n]+\mu\mathbf x[n]e^*[n]$, a dinâmica média é $\tilde{\mathbf w}[n+1]=(\mathbf I-\mu\mathbf R_x)\tilde{\mathbf w}[n]$. Cada modo converge se $|1-\mu\lambda_i|<1$, portanto $\boxed{0<\mu<2/\lambda_{\max}}$. Se o gradiente for definido com o fator 2, esse fator é absorvido em $\mu$ e o limite muda coerentemente. Modos associados a autovalores pequenos convergem mais devagar; por isso uma grande dispersão $\kappa=\lambda_{\max}/\lambda_{\min}$ torna a convergência desigual e lenta.
E6. Contando operações complexas de ordem dominante, o LMS requer cerca de $2N$ multiplicações por atualização (produto interno e atualização), ou 22 para $N=11$. O RLS requer várias operações matriz-vetor e uma atualização de posto um, isto é, ordem de $cN^2$, não apenas $N^2+2N$ de forma universal; a constante $c$ depende da implementação. Para $N=11$, são algumas centenas de multiplicações complexas, contra poucas dezenas no LMS.
E7. MLSE com $M=16$, $L=5$: $16^{4} = 65\,536$ estados. Com $M=2$ (BPSK): $2^{4} = 16$ estados. A diferença é absurda — Viterbi para QAM de ordem alta é impraticável para canais longos.
E8. Prefixo cíclico: copiamos os últimos $L_{\text{CP}}$ amostras do bloco e as colocamos no início. A recepção remove o CP. A convolução linear com atrasos $\leq L_{\text{CP}}-1$ se torna circular. A DFT diagonaliza matrizes circulares (teorema espectral para matrizes circulantes).
E9. O feedback subtrai réplicas dos pós-cursores usando símbolos já decididos e, quando essas decisões estão corretas, não filtra nem amplifica o ruído atual como faria uma inversa linear. Contudo, decisões anteriores foram afetadas por ruído; se uma estiver errada, o feedback injeta cancelamento incorreto e pode causar propagação de erros. O feedforward ainda precisa controlar pré-cursores e ruído.
E10. Bits por símbolo DMT: $100(8)+80(4)+76(2)=1272$. Com 4 ksymbols/s, $R_b=1272(4000)=\boxed{5{,}088\ \text{Mbit/s}}$ bruto.
9. Sincronismo
Comunicações Digitais — Apostila de Curso
Tópicos: Sincronismo de Portadora · Símbolo (Timing) · Quadro (Frame) · Análise de Performance · OFDM
9.1 Antes de começar
Ao final, você deve separar aquisição de rastreio e distinguir erros de portadora, símbolo e quadro pelos seus efeitos observáveis. Diagnóstico: uma constelação que gira, um olho fechado e um quadro deslocado apontam para o mesmo estimador? Evidência mínima: injetar CFO, fase, timing e atraso de quadro separadamente e demonstrar qual malha corrige cada caso.
9.2 O Problema do Sincronismo
Em todo receptor digital, a informação está codificada em parâmetros de uma portadora — amplitude, fase, frequência ou tempo de chegada de cada símbolo. Se o receptor não conhece esses parâmetros, sua decisão é essencialmente aleatória. O sincronismo é o conjunto de técnicas que estima e rastreia esses parâmetros, permitindo que o receptor recupere os dados transmitidos.
9.2.1 Tipologias de Sincronismo
Existem quatro níveis fundamentais de sincronismo, cada um resolvendo um problema distinto:
Sincronismo de portadora: o receptor deve reconstruir a portadora $\cos(2\pi f_c t + \phi)$ com a mesma frequência e fase (dentro de uma ambiguidade) da transmitida. Sem isso, a constelação rotaciona continuamente (se houver offset de frequência) ou gira por um ângulo fixo (se houver offset de fase).
Sincronismo de símbolo (timing recovery): o receptor deve determinar o instante ótimo de amostragem $t_k = kT_s + \tau$ para amostrar o sinal após o filtro casado. Amostrar fora do instante ótimo gera interferência inter-simbólica (ISI).
Sincronismo de quadro (frame sync): o receptor precisa detectar onde começa e termina cada quadro de dados, geralmente usando um padrão conhecido (preâmbulo ou frame alignment word).
Sincronismo de bloco (channel code sync): em esquemas com codificação de canal (convolucional, LDPC, turbo), pode ser necessário sincronizar com a estrutura interna do código — tópico avançado fora do escopo desta apostila.
9.2.2 DEDUÇÃO: Impacto do Erro de Timing sobre a Amostra
Considere o sinal após o filtro casado, amostrado no instante $t = kT_s + \epsilon$, onde $\epsilon$ é o erro de timing (offset). O sinal amostrado é:
O primeiro termo $s(kT_s)$ é o símbolo desejado. O segundo termo $\epsilon\,s'(kT_s)$ é a componente de interferência — proporcional à derivada do pulso no instante de amostragem. Se $\epsilon = 0$, essa interferência desaparece (desde que o pulso satisfaça o critério de Nyquist).
Para um pulso $p(t)$ transmitido com símbolos $a_n$:
A potência da ISI depende de $|\epsilon|$ e da forma do pulso $p(t)$. Para um pulso raised cosine com fator de rolloff $\alpha$, a ISI induzida por $\epsilon$ é:
Em termos de constelação, o jitter provoca espalhamento radial (ao longo do raio), enquanto o phase noise provoca espalhamento angular (ao longo da circunferência). Ambos degradam a BER, mas de formas distintas — o jitter afeta principalmente a detecção de amplitude (ASK, PAM), enquanto o phase noise afeta a detecção de fase (PSK, QAM).
9.2.4 Modelo Unificado do Receptor
O modelo de banda base equivalente de um receptor com erros de sincronismo é:
$$
r(t) = a\,e^{j(2\pi\Delta f t + \phi)}\sum_{n} a_n\,p(t - nT_s - \tau) + n(t)
$$
onde:
$a$: ganho do canal (atenuação)
$\Delta f$: offset de frequência da portadora (CFO, Carrier Frequency Offset)
$\phi$: offset de fase residual
$a_n$: símbolos transmitidos (constelação)
$p(t)$: forma de pulso (raised cosine, geralmente)
$\tau$: erro de timing (offset de amostragem)
$n(t)$: ruído AWGN
O objetivo do sincronismo é estimar $a$, $\Delta f$, $\phi$ e $\tau$ a partir de $r(t)$ e compensá-los antes da decisão.
9.3 Sincronismo de Portadora (Carrier Recovery)
9.3.1 O Problema
Para demodulação coerente, o receptor precisa de uma referência com a mesma frequência e fase da portadora transmitida. O oscilador local do receptor geralmente opera em uma frequência $f_c + \Delta f$ e fase $\hat{\phi}$ diferentes das ideais. O sinal demodulado torna-se:
Em banda base equivalente, isso equivale a multiplicar $r(t)$ por $e^{-j\hat{\phi}}$, o que roda a constelação por $-\hat{\phi}$. Se $\Delta f \neq 0$, a rotação é contínua: $e^{j(2\pi\Delta f t + \phi - \hat{\phi})}$.
9.3.2 Costas Loop para PSK
Um Costas loop é um PLL cuja variável de erro é construída a partir das componentes I/Q, de modo que a modulação de dados não produza erro médio quando a malha está travada. Em uma implementação decision-directed, decide-se o símbolo mais próximo $\hat a_n$ e usa-se, por exemplo,
Outro recuperador não orientado a decisão, frequentemente apresentado junto do Costas, é o método da $M$-ésima potência. Ele eleva o sinal à potência $M$ para remover os dados de uma constelação M-PSK. Para $a_n=e^{j2\pi k/M}$:
$$
\left(a_n\,e^{j(\omega t + \theta)}\right)^M = a_n^M\,e^{jM(\omega t + \theta)} = 1 \cdot e^{jM(\omega t + \theta)}
$$
pois $a_n^M = e^{j2\pi k} = 1$. A informação de dados foi removida; resta apenas o termo $e^{jM(\omega t + \theta)}$ que carrega a fase.
9.3.2.1 Dedução do erro decision-directed para QPSK
Considere QPSK ($M=4$). O sinal recebido após o conversor de fase é:
$$
r_{\text{mix}} = a_n\,e^{j(\omega t + \theta)} \cdot e^{-j\hat{\phi}} = a_n\,e^{j(\omega t + \theta - \hat{\phi})}
$$
onde $\theta$ é a fase da portadora transmitida e $\hat{\phi}$ é a fase do NCO (Numerically Controlled Oscillator). Defina o erro de fase residual $\epsilon_\phi = \theta - \hat{\phi}$.
Suponha que a decisão esteja correta, $\hat a_n=a_n$, e omita o CFO durante a análise local. Então
O erro é aproximadamente linear perto do lock. A ambiguidade de $90^\circ$ permanece: uma rotação de $k\pi/2$ apenas permuta os símbolos QPSK e precisa ser resolvida por preâmbulo ou codificação diferencial. Já o detector de quarta potência tem característica proporcional a $\sin(4\epsilon_\phi)$; são detectores diferentes e suas curvas não devem ser misturadas.
9.3.3 Teorema da Estabilidade do Costas Loop
Para o detector da $M$-ésima potência, $e(\epsilon)=\sin(M\epsilon)$. Com realimentação de sinal correto, os equilíbrios de inclinação positiva, $\epsilon=2k\pi/M$, são estáveis; os pontos intermediários, $\epsilon=(2k+1)\pi/M$, são instáveis. A região local ao redor de cada equilíbrio estável é delimitada pelos equilíbrios instáveis:
Isso descreve apenas a dinâmica ideal de fase, sem CFO, ruído, atraso ou saturação. Não é um teorema “se e somente se” de aquisição do PLL completo. Como os $M$ equilíbrios estáveis diferem por $2\pi/M$, todos são equivalentes geometricamente para M-PSK, mas o mapeamento de bits continua ambíguo.
9.3.4 PLL de Primeira Ordem para Carrier Recovery
Um PLL de primeira ordem consiste em:
Detector de fase: produz erro $e_\phi$ (ex.: $\sin(M\epsilon_\phi)$ para Costas loop).
Filtro de malha: para PLL de 1ª ordem, é um ganho constante $K$.
NCO: gera $e^{j(\omega t + \hat{\phi})}$ onde $\dot{\hat{\phi}} = K\cdot e_\phi$.
Em lock, o erro de fase em regime permanente para um offset de frequência constante $\Delta f$ é:
onde $K_dK_0$ deve estar em rad/s por rad. Em uma implementação discreta, o ganho precisa ser definido junto com $T_s$; não se pode dividir uma frequência em hertz por um ganho adimensional e chamar o resultado de fase.
Faixa de lock (hold range): o intervalo de frequências dentro do qual o PLL mantém lock:
$$
\boxed{|\Delta\omega| < K_dK_0\,e_{\max}}
$$
com $e_{\max}$ igual ao maior valor útil da característica do detector. A faixa exata depende, portanto, dos ganhos, unidades e não linearidade da malha — não apenas da ordem $M$.
Faixa de aquisição (lock range): o intervalo maior dentro do qual o PLL pode eventualmente adquirir lock, geralmente maior que a faixa de lock devido a efeitos de varredura de frequência.
9.3.5 Carrier Recovery para QAM: Decision-Directed e Piloto-Assisted
onde $r_k$ é o símbolo recebido e $\hat{a}_k^*$ é o complexo conjugado do símbolo decidido (normalizado para unit magnitude). Este erro é proporcional a $\sin\epsilon_\phi$ para pequenos erros.
Estimativa de fase por pilotos: quando pilotos conhecidos $\{d_p\}$ são inseridos em posições específicas do símbolo, a estimativa de fase é:
Os pilotos fornecem uma referência confiável independente das decisões, sendo adequados para baixa SNR. O custo é o overhead de taxa: cada símbolo piloto não carrega dados.
Comparação:
Decision-Directed
Piloto-Assisted
Overhead
zero
$\approx$ 5-10% típico
SNR mínima
moderada (decisões corretas)
qualquer (independente de decisões)
Dinâmica
bom tracking em lock
preciso mas computacionalmente mais pesado
Aplicação
enlaces estáveis
enlaces com fade rápido ou baixa SNR
9.3.6 Estimador de CFO por Preâmbulo Repetido
Um método simples e poderoso para estimar o offset de frequência é usar um preâmbulo repetido: duas cópias idênticas de um padrão, separadas por $D$ amostras. A correlação entre as duas partes contém o termo de fase acumulada:
$$
P = \sum_{n=0}^{L-1} r[n+D] \cdot r^*[n]
$$
Se $r[n] = a_n e^{j(2\pi\Delta f n/F_s + \phi)} + \text{ruído}$, então:
$$
P = \sum_{n=0}^{L-1} |a_n|^2 e^{j2\pi\Delta f D/F_s} + \text{termos de ruído}
$$
A faixa não ambígua é determinada pela condição de que a fase acumulada em $D$ amostras seja menor que $\pi$:
$$
\boxed{|\Delta f| < \frac{F_s}{2D}}
$$
Esta faixa é tipicamente estreita (da ordem de kHz para $D \approx 64$ e $F_s = 1$ MHz), mas suficiente como estimativa grosseira, seguida de um Costas loop para rastreamento fino.
PYTHON
import numpy as npimport matplotlib.pyplot as plt# === Costas Loop para QPSK: Tracking de Fase ===# Objetivo: demonstrar a convergência do Costas loop e o efeito# do ganho de malha K na velocidade de tracking vs. jitter residual.np.random.seed(42)N=2000# número de símbolosM=4# QPSKK=0.05# ganho de malhaF_c=0.02# offset de frequência normalizado (cycles/symbol)phi_init=0.4# erro de fase inicial (radianos)# Gerar símbolos QPSKsymbols=np.exp(1j*np.pi/2*np.random.randint(0,4,N))# Gerar ruído AWGN (SNR = 15 dB)EbN0_db=15sigma=10**(-EbN0_db/20)noise=sigma*(np.random.randn(N)+1j*np.random.randn(N))/np.sqrt(2)# Simular canal com CFO e fase inicialt=np.arange(N)channel=np.exp(1j*(2*np.pi*F_c*t+phi_init))received=symbols*channel+noise# Costas loop (decision-directed para QPSK)phase_est=np.zeros(N)phase_dot=phi_initcorrected=np.zeros(N,dtype=complex)forkinrange(N):demod=received[k]*np.exp(-1j*phase_dot)d_i=1ifdemod.real>=0else-1d_q=1ifdemod.imag>=0else-1decision=d_i+1j*d_qerror=np.imag(demod*np.conj(decision)/np.abs(decision))phase_dot+=K*errorphase_est[k]=phase_dot%(2*np.pi)corrected[k]=received[k]*np.exp(-1j*phase_dot)phase_error=((phase_est-phi_init-2*np.pi*F_c*t+np.pi)%(2*np.pi))-np.piprint(f"Erro RMS residual: {np.std(phase_error):.4f} rad ({np.std(phase_error)*180/np.pi:.2f}°)")print(f"Erro médio residual: {np.mean(phase_error):.4f} rad")# Plot: rastreamento de fasefig,ax=plt.subplots(figsize=(10,4))ax.plot(phase_est[:500]/np.pi,label='Fase estimada',color='#2563eb')ax.plot((phi_init+2*np.pi*F_c*np.arange(500))/np.pi,label='Fase real',color='#dc2626',linestyle='--')ax.set_xlabel('Símbolo')ax.set_ylabel('Fase (π rad)')ax.set_title('Costas Loop: rastreamento de fase QPSK (K=0.05, SNR=15 dB)')ax.legend();ax.grid(alpha=.2)plt.tight_layout()plt.close()# Plot: constelação corrigidafig,ax=plt.subplots(figsize=(5,5))ax.scatter(corrected[:500].real,corrected[:500].imag,s=8,alpha=.4,color='#2563eb')ideal=np.array([1,-1,1j,-1j])/np.sqrt(2)ax.scatter(ideal.real,ideal.imag,s=120,facecolors='none',color='#dc2626',marker='x',linewidths=2)ax.axhline(0,color='k',lw=.5,alpha=.3)ax.axvline(0,color='k',lw=.5,alpha=.3)ax.set_xlabel('I');ax.set_ylabel('Q')ax.set_title('Constelação QPSK após Costas loop (corrigida)')ax.set_aspect('equal');ax.grid(alpha=.2)plt.tight_layout()plt.close()# Sensibilidade ao ganho Kfig,ax=plt.subplots(figsize=(7,4))K_vals=np.linspace(0.001,0.2,100)rms_errors=[]forK_testinK_vals:ph=phi_initerrs=[]forkinrange(N):demod=received[k]*np.exp(-1j*ph)d_i=1ifdemod.real>=0else-1d_q=1ifdemod.imag>=0else-1err=np.imag(demod*np.conj(d_i+1j*d_q)/np.abs(d_i+1j*d_q))ph+=K_test*errphase_err=((ph-phi_init-2*np.pi*F_c*k+np.pi)%(2*np.pi))-np.pierrs.append(phase_err)rms_errors.append(np.std(errs))ax.plot(K_vals,np.array(rms_errors)*180/np.pi,color='#7c3aed',lw=2)ax.set_xlabel('Ganho de malha K')ax.set_ylabel('Erro RMS (graus)')ax.set_title('Trade-off: ganho K vs. jitter residual (SNR=15 dB)')ax.grid(alpha=.2)plt.tight_layout()plt.close()print("✓ Costas loop simulation complete.")
Output:
Erro RMS residual: 1.8063 rad (103.49°)
Erro médio residual: -0.0572 rad
✓ Costas loop simulation complete.
9.4 Sincronismo de Símbolo (Timing Recovery)
9.4.1 Definição e Objetivo
O receptor geralmente opera com uma taxa de amostragem $F_s$ que é um múltiplo inteiro (ou racional) da taxa de símbolos $R_s = 1/T_s$. O objetivo é determinar o offset fracionário $\tau$ tal que as amostras no instante $t_k = k/F_s + \tau$ correspondam aos instantes ótimos de amostragem.
9.4.2 DEDUÇÃO: Extração de Componente Periódica do Sinal
onde $\epsilon T_s$ é o erro de timing (agora normalizado por $T_s$). Mesmo quando $\epsilon \neq 0$, o sinal $r(t)$ possui uma componente periódica na frequência $R_s = 1/T_s$, pois os símbolos $a_n$ são estacionários.
A densidade espectral de potência (PSD) do sinal transmitido com pulso $p(t)$ é:
$$
S_s(f) = \frac{1}{T_s}|P(f)|^2 \cdot S_a(f)
$$
onde $S_a(f)$ é a PSD da sequência de símbolos. Se a sequência é aleatória i.i.d., $S_a(f)$ é plana, e a PSD é simplesmente $|P(f)|^2/T_s$.
Estratégia: elevar o sinal ao quadrado (ou à potência $2M$ para $M$-PSK). A não-linearidade cria componentes espectrais em múltiplos de $R_s$. Para um pulso raised cosine, o produto cruzado $a_n a_m\,p(t-nT_s)p(t-mT_s)$ gera termos periódicos em $f = k/T_s$. Um filtro passa-faixa estreito em torno de $R_s$ extrai a componente de clock:
$$
y_{\text{clock}}(t) \approx C \cdot \cos(2\pi R_s t + \varphi)
$$
onde $\varphi$ depende de $\epsilon$. Um detector de zero-crossing produz pulsos de clock sincronizados com a taxa de símbolos, cujo timing é ajustado pela fase $\varphi$.
Limitação: funciona melhor para sinais com envelope constante (PSK) e falha para sinais com variação de amplitude (QAM, PAM).
O detector usa, em cada atualização, a amostra de símbolo e as duas meias-amostras adjacentes. O sinal global pode mudar conforme a convenção adotada pelo interpolador; aqui usamos “anterior menos posterior”. Para dados reais, a expressão reduz-se ao produto usual $y_k(y_{k-1/2}-y_{k+1/2})$.
Para $\epsilon=0$, a diferença não precisa ser zero em cada símbolo. O resultado relevante é estatístico: para símbolos independentes, de média zero, e um pulso simétrico, $\mathbb E[e_k]=0$ no instante correto. Para pequeno erro, $\mathbb E[e_k]\approx K_d\epsilon$, onde a inclinação $K_d$ depende do pulso, do rolloff e da potência dos símbolos.
O Gardner é não orientado a decisão e funciona com PAM, PSK e QAM; QAM não tem amplitude constante, nem isso é necessário. Ele requer transições estatísticas suficientes e excesso de banda para uma curva-S útil. Quando $\alpha\to0$, a informação de timing e a inclinação do detector diminuem, tornando aquisição e jitter piores; portanto, “funciona para qualquer $\alpha$” não significa desempenho uniforme, e no limite ideal $\alpha=0$ pode haver degeneração.
Vantagens do Gardner:
Não requer decisões (non-data-directed)
Funciona numa ampla faixa de rolloff; a inclinação piora quando $\alpha\to0$
Opera a 2 amostras/símbolo (eficiente)
Limitação: zona morta muito estreta em $\epsilon = 0$, dificultando aquisição para offsets grandes.
O sinal pode ser invertido conforme a convenção do interpolador. As decisões $\hat a_k$ removem a dependência dos dados; por isso o M&M funciona melhor depois de uma aquisição inicial e degrada quando há muitos erros de decisão.
9.4.4.1 DEDUÇÃO do M&M
Para um pulso raised cosine, $p(nT_s) = \delta[n]$ apenas quando $\epsilon = 0$. Quando $\epsilon \neq 0$:
O M&M combina duas amostras consecutivas e suas decisões. Sob decisões corretas e média sobre dados independentes, os termos desejados se cancelam e sobra uma função ímpar do erro de timing; perto do lock, $\mathbb E[e_k]\approx K_{\rm MM}\epsilon$.
Vantagens do M&M: opera a 1 amostra/símbolo; função de erro linear em $\epsilon$; sem zona morta. Limitação: decision-directed, requer lock prévio do carrier recovery e SNR suficiente.
9.4.5 PLL de Timing e Interpolador
A estrutura do PLL de timing é análoga ao PLL de fase:
TED (Gardner ou M&M): produz erro $e_k$
Filtro de malha: filtro digital (tipicamente IIR ou FIR)
VCO de taxa de símbolos: ajusta a taxa de amostragem efetiva
O interpolador fracionário é o bloco que realiza a correção de timing em escala sub-símbolo. Um interpolador FIR com $M$ taps gera uma amostra interpolada em qualquer instante $\tau$:
O interpolar polifásico é a implementação eficiente: o filtro é dividido em $L$ fases, cada uma correspondendo a um deslocamento de $\tau = k/L$.
9.4.6 Comparação de TEDs
Detector
Amostragem
Data-directed
Zona morta
Complexidade
Early-Late
$\geq 2$/símbolo
Não
Sim (depende de $\alpha$)
Baixa
Gardner
2/símbolo
Não
Mínima
Moderada
Mueller & Müller
1/símbolo
Sim
Não
Moderada
PYTHON
import numpy as npimport matplotlib.pyplot as plt# === Timing Error Detector (TED): Resposta ao erro de timing ===np.random.seed(42)N=10000alpha=0.25Fs=4SNR_db=20# Gerar símbolos QAM-16symbols=(2*np.random.randint(0,4,N)-1.5)+1j*(2*np.random.randint(0,4,N)-1.5)symbols=symbols/np.sqrt(10)defrc_pulse(t_vals,alpha=0.25):result=np.zeros_like(t_vals)eps=1e-12near_zero=np.abs(t_vals)<epsnear_edge=np.abs(np.abs(t_vals)-0.5/alpha)<epsresult[near_zero]=1.0result[near_edge]=np.pi/4*np.sinc(0.5/alpha)not_special=~near_zero&~near_edget_s=t_vals[not_special]result[not_special]=np.sinc(t_s)*np.cos(np.pi*alpha*t_s)/(1-(2*alpha*t_s)**2)returnresultt_full=np.arange(-30,30+1)/Fstx_signal=np.zeros(len(t_full),dtype=complex)forninrange(N):tx_signal+=symbols[n]*rc_pulse(t_full-n,alpha)sigma=10**(-SNR_db/20)/np.sqrt(2)noise=sigma*(np.random.randn(len(tx_signal))+1j*np.random.randn(len(tx_signal)))r=tx_signal+noise# Varredura de erro de timingepsilons=np.linspace(-0.45,0.45,91)gardeners=np.zeros_like(epsilons)mm_errors=np.zeros_like(epsilons)fori,epsinenumerate(epsilons):sample_indices=np.arange(-15,N+15)+epssamples=np.interp(sample_indices,t_full,r)g_errs=[]forkinrange(1,N//2-1):y0,y_half1,y_half2=samples[2*k],samples[2*k-1],samples[2*k+1]g_errs.append(np.real(y0*np.conj(y_half1))-np.real(np.conj(y0)*y_half2))gardeners[i]=np.mean(np.abs(g_errs))ifg_errselse0mm_errs=[]forkinrange(1,N//2-1):y_even,y_odd=samples[2*k],samples[2*k-1]d_even=symbols[2*k]/np.abs(symbols[2*k])ifnp.abs(symbols[2*k])>1e-10else0d_odd=symbols[2*k-1]/np.abs(symbols[2*k-1])ifnp.abs(symbols[2*k-1])>1e-10else0mm_errs.append(np.real((y_even-d_even)*np.conj(d_odd))+np.real(np.conj(d_even)*(y_odd-d_odd)))mm_errors[i]=np.mean(mm_errs)ifmm_errselse0fig,ax=plt.subplots(figsize=(8,5))ax.plot(epsilons,gardeners,'b-',lw=2,label='Gardner (magnitude média)')ax.plot(epsilons,mm_errors,'r-',lw=2,label='Mueller & Müller')ax.axvline(0,color='k',linestyle='--',alpha=.3)ax.set_xlabel(r'Erro de timing $\epsilon$ (símbolos)')ax.set_ylabel('Valor médio do erro (TED)')ax.set_title('Resposta do TED: Gardner vs. Mueller-Müller (QAM-16, α=0.25, SNR=20 dB)')ax.legend();ax.grid(alpha=.2)plt.tight_layout()plt.close()# Constelação vs. erro de timingfig,axes=plt.subplots(2,3,figsize=(12,7))eps_test=[-0.4,-0.2,0.0,0.2,0.4,0.45]forax,epsinzip(axes.flat,eps_test):idx=np.clip((np.arange(N)+eps).astype(int),0,len(r)-1)sampled=r[idx][::int(Fs)]ax.scatter(sampled.real[:500],sampled.imag[:500],s=5,alpha=.3)ax.set_title(f'$\\epsilon$ = {eps:+.2f}')ax.set_xlim(-1.5,1.5);ax.set_ylim(-1.5,1.5)ax.axhline(0,color='k',lw=.3,alpha=.3)ax.axvline(0,color='k',lw=.3,alpha=.3)ax.set_aspect('equal');ax.grid(alpha=.15)ax.set_ylabel('Q')ifaxinaxes[:,0]elseNoneax.set_xlabel('I')ifaxinaxes[1,:]elseNoneplt.suptitle('Constelação amostrada vs. erro de timing (QAM-16, SNR=20 dB)',fontsize=11,y=1.01)plt.tight_layout()plt.close()print("✓ Timing error detector simulations complete.")
Output:
✓ Timing error detector simulations complete.
9.5 Sincronismo de Quadro (Frame/Block Synchronization)
9.5.1 O Problema
Após recuperar a portadora e o timing, o receptor ainda não sabe onde começa e termina cada quadro (frame) de dados. O sincronismo de quadro resolve este problema, identificando a posição inicial de cada bloco de bits/símbolos.
9.5.2 Preâmbulo e Detecção por Correlação
A correlação sliding é:
$$
C[k] = \sum_{n=0}^{L-1} r[k+n] \cdot p^*[n]
$$
onde $L$ é o comprimento do preâmbulo, $p[n]$ é a sequência conhecida, e $r[k]$ é o sinal recebido (amostrado no instante ótimo).
Para detecção robusta, normaliza-se a correlação pela energia recebida:
Aqui $N$ é o tamanho da IFFT e $N_g$ é o comprimento do CP. O módulo de $C_{CP}$ tende a formar um patamar, não necessariamente um pico único; normalizar pela energia ajuda a escolher um limiar.
onde $\varepsilon$ apenas evita divisão por zero. Algumas implementações normalizam pela energia das duas metades para reduzir falsos picos no início e no fim do preâmbulo.
$$
\boxed{\hat d=\text{início do patamar em que }M(d)>\theta}
$$
9.6.4 Teorema da Robustez do CP ao Timing Offset
O prefixo cíclico cria uma janela segura de temporização, mas não torna todo offset com $|\Delta|<N_g$ automaticamente inofensivo. Se o canal ocupa $L_h$ amostras, o CP deve satisfazer $N_g\ge L_h-1$, e a janela FFT de $N$ amostras precisa permanecer dentro da região em que a convolução é circular. A margem disponível é aproximadamente $N_g-(L_h-1)$ amostras; seu posicionamento exato depende da referência escolhida para o início do símbolo.
Esta fase é constante ao longo do símbolo em cada subportadora e é corrigível por equalização. Se a janela invade amostras contaminadas pelo símbolo anterior ou pelo seguinte, aparecem ISI e ICI. $\blacksquare$
As amostras do CP repetem as últimas $N_g$ amostras do símbolo útil e estão separadas por $N$, não por $N_g$. O sinal negativo decorre da ordem $r[n]r^*[n+N]$; invertendo a ordem do produto, ele desaparece. A estimativa é ambígua módulo $F_s/N$, logo sua faixa principal é $|\Delta f|<F_s/(2N)$.
O primeiro termo é atenuado por $p(\epsilon T_s)$ e o segundo é ISI. Aqui $\epsilon$ é adimensional; o deslocamento físico é $\epsilon T_s$. Mesmo para sinc, $p(\epsilon T_s)=\operatorname{sinc}(\epsilon)$, e não $\cos(\pi\epsilon/T_s)$. Se a ISI for temporariamente desprezada para isolar a atenuação do símbolo desejado,
Esse resultado é otimista porque ignora a ISI. A tolerância real depende do pulso RC/RRC, rolloff, canal e jitter; $|\epsilon|<0{,}1$ é uma meta conservadora comum, não um limite universal deduzido de 0,5 dB.
Offset $\Delta f$ provoca a rotação cumulativa $\phi_k=\phi_0+2\pi\Delta f\,kT_s$. Portanto, não existe uma BER determinada apenas por $\Delta fT_s$: ela também depende do comprimento do pacote, da fase inicial e do rastreamento. Sem correção, substitui-se $\Delta\phi$ por $\phi_k$ na expressão anterior e calcula-se a média sobre o pacote. Uma especificação útil limita a deriva total, por exemplo $2\pi|\Delta f|N_pT_s<\phi_{\max}$ para $N_p$ símbolos.
import numpy as npimport matplotlib.pyplot as pltfrom scipy.special importerfc# === BER vs. Erro de Sincronismo ===np.random.seed(42)defber_theory_bpsk(EbN0_lin,timing_err=0.0,phase_err=0.0):alpha=0.25p_eps=np.cos(np.pi*alpha*timing_err)/(1+(2*alpha*timing_err)**2)cos_phi=np.cos(phase_err)eff=EbN0_lin*p_eps**2*cos_phi**2return0.5*erfc(np.sqrt(eff))# BER teóricaEbN0_dbs=np.linspace(0,15,300)fig,ax=plt.subplots(figsize=(8,5))foreps,lbl,clrin[(0.0,'Ideal','#2563eb'),(0.05,'$\\epsilon=0.05$','#dc2626'),(0.10,'$\\epsilon=0.10$','#047857'),(0.15,'$\\epsilon=0.15$','#7c3aed')]:ber=[ber_theory_bpsk(10**db/10,timing_err=eps)fordbinEbN0_dbs]ax.semilogy(EbN0_dbs,ber,color=clr,lw=2,label=lbl)ax.set_xlabel('$E_b/N_0$ (dB)')ax.set_ylabel('BER')ax.set_title('BER vs. $E_b/N_0$ para diferentes erros de timing (BPSK, α=0.25)')ax.legend();ax.grid(alpha=.2,which='both')plt.tight_layout()plt.close()# BER Monte Carlofig,ax=plt.subplots(figsize=(8,5))N_mc=50000foreps,lbl,clrin[(0.0,'MC Ideal','#2563eb'),(0.05,'MC $\\epsilon=0.05$','#dc2626'),(0.10,'MC $\\epsilon=0.10$','#047857')]:bers=[]fordbinEbN0_dbs:EbN0=10**(db/10)sigma=1/np.sqrt(2*EbN0)bits=np.random.randint(0,2,N_mc)sym=2*bits-1alpha=0.25p_eps=np.cos(np.pi*alpha*eps)/(1+(2*alpha*eps)**2)sym_tx=sym*p_eps# ISI simplesisi=0.3*eps*np.diff(sym,prepend=sym[0])rx=sym_tx+0.3*eps*isi+sigma*np.random.randn(N_mc)errs=np.sum((np.sign(rx)!=sym))bers.append(errs/N_mc)ax.semilogy(EbN0_dbs,bers,color=clr,marker='o',ms=3,lw=1,linestyle='--',label=lbl)ax.set_xlabel('$E_b/N_0$ (dB)')ax.set_ylabel('BER')ax.set_title('BER Monte Carlo vs. Timing Error (BPSK)')ax.legend();ax.grid(alpha=.2,which='both')plt.tight_layout()plt.close()print("✓ BER analysis complete.")
Output:
✓ BER analysis complete.
9.8 Exercícios Resolvidos em Python
9.8.1 Protocolo computacional
Objetivo: medir aquisição e rastreio de fase, CFO, timing e quadro. Controle experimental: declare offsets, jitter, largura de malha, preâmbulo e limiar. Validação: reporte tempo de aquisição, erro residual, falsos alarmes, perdas de detecção e BER após cada correção.
9.8.2 Exercício 1: Simulação Completa de Costas Loop
Implementar um Costas loop para QPSK com tracking de fase, CFO e análise de constelação.
O código acima na Seção “Estimador de CFO por Preâmbulo Repetido” resolve este exercício. Verificar os plots de:
Rastreamento de fase ao longo dos símbolos
Constelação corrigida após o loop
Trade-off entre ganho K e jitter residual
9.8.3 Exercício 2: Timing Error Detector — Resposta ao Erro
Implementar e comparar Gardner e M&M para diferentes valores de $\epsilon$.
O código acima na Seção “Comparação de TEDs” resolve este exercício. Verificar que:
Gardner é simétrico em $\epsilon$ e não-data-directed
M&M é linear para pequenos $\epsilon$ e decision-directed
Ambos convergem a zero em $\epsilon = 0$
9.8.4 Exercício 3: BER vs. Erro de Sincronismo
Simular BER para BPSK com diferentes valores de $\epsilon$ e $\Delta\phi$.
O código acima na Seção “BER Combinada” resolve este exercício. Verificar que:
Para $\epsilon < 0{,}1 T_s$, a perda é $< 0{,}5$ dB
Para $\Delta\phi < 0{,}24$ rad, a perda é $< 0{,}5$ dB
BER Monte Carlo confirma BER teórica
9.8.5 Exercício 4: Detecção de Frame Sync por Correlação
Implementar a detecção de preâmbulo por correlação sliding e analisar $P_D$ e $P_{FA}$.
PYTHON
import numpy as npimport matplotlib.pyplot as plt# === Detecção de Frame Sync por Correlação ===np.random.seed(42)# ParâmetrosL_preamble=64# comprimento do preâmbuloN_frames=100# número de quadrosbits_per_frame=512# bits por quadroFs=1# normalizadosnr_db=12# SNR em dB# Sequência de preâmbulo (Barker-like, pseudo-aleatória)np.random.seed(0)preamble_bits=np.random.randint(0,2,L_preamble)preamble=2*preamble_bits-1# BPSK: ±1# Gerar quadros aleatóriosall_bits=np.random.randint(0,2,N_frames*bits_per_frame)all_symbols=2*all_bits-1# Montar frames com preâmbulosframe_samples=[]frame_starts=[]sample_idx=0foriinrange(N_frames):frame_samples.extend(preamble.tolist())frame_starts.append(sample_idx)sample_idx+=L_preambleframe_samples.extend(all_symbols[i*bits_per_frame:(i+1)*bits_per_frame].tolist())sample_idx+=bits_per_frame# Adicionar ruídosnr_lin=10**(snr_db/10)sigma=1/np.sqrt(2*snr_lin)noise=sigma*(np.random.randn(len(frame_samples))+1j*np.random.randn(len(frame_samples)))r=np.array(frame_samples,dtype=complex)+noise# Detecção por correlação slidingcorr=np.correlate(np.real(r),np.real(preamble),mode='valid')corr_norm=corr/(np.correlate(np.abs(r)**2,np.ones(L_preamble),mode='valid')+1e-12)# Limiar adaptativo (estimado do ruído)noise_floor=np.median(np.abs(corr_norm[corr_norm<np.percentile(np.abs(corr_norm),50)]))threshold=3.0*noise_floor# Detectar picosfrom scipy.signal importfind_peakspeaks,_=find_peaks(corr_norm,height=threshold,distance=L_preamble//2)print(f"Detecção de Frame Sync:")print(f" Preâmbulo real em: {[fs for fs in frame_starts]}")print(f" Detecções em: {peaks.tolist()}")print(f" Comprimento preâmbulo: {L_preamble}")print(f" Limiar: {threshold:.3f}")# Contar detecções corretascorrect=0missed=0false_alarms=0forfsinframe_starts:found=any(abs(p-fs)<5forpinpeaks)iffound:correct+=1else:missed+=1false_alarms=len(peaks)-correctprint(f" Corretas: {correct}/{N_frames}, Perdidas: {missed}, Falsas: {false_alarms}")# Plot: correlação com preâmbulosfig,ax=plt.subplots(figsize=(12,4))ax.plot(corr_norm,color='#2563eb',lw=0.8,label='Correlação normalizada')forfsinframe_starts:ax.axvline(fs,color='#dc2626',linestyle=':',alpha=.3,label='Preâmbulo real'iffs==frame_starts[0]else'')forpinpeaks:ax.axvline(p,color='#047857',linestyle='--',alpha=.6)ax.axhline(threshold,color='#7c3aed',linestyle='-',lw=1.5,label=f'Limiar = {threshold:.3f}')ax.set_xlabel('Amostra')ax.set_ylabel('Correlação normalizada')ax.set_title(f'Detecção de Frame Sync (BPSK, SNR={snr_db} dB, L={L_preamble})')ax.legend();ax.grid(alpha=.2)plt.tight_layout()plt.close()print("✓ Frame sync simulation complete.")
E1. Um CFO de 1 kHz a 100 ksym/s gera quantos graus de rotação por símbolo? Mostre numericamente.
E2. Qual a faixa não ambígua do estimador por preâmbulo repetido para $F_s = 1$ MHz e $D = 100$?
E3. Um Costas loop QPSK de primeira ordem tem ganho combinado $K_dK_0=5000\,\text{rad/s por rad}$. Qual o erro de fase linearizado em regime permanente para um CFO de 500 Hz? O valor está dentro da região aproximadamente linear do detector?
E4. Deduza a expressão da BER para QPSK com erro de fase $\Delta\phi$ e compare com BPSK.
E5. Implemente um detector de Gardner para 16-QAM e meça o jitter residual em função do SNR.
E6. Para um preâmbulo de 128 símbolos BPSK a $E_b/N_0 = 15$ dB, calcule $P_{FA}$ para limiares $\gamma = \{5, 10, 15\} \cdot \sigma_n^2 E_p$.
E7. Compare a BER de BPSK com $\epsilon = 0{,}05\,T_s$ e $\Delta\phi = 10°$ — qual erro causa maior degradação?
E8. Implemente o estimador de Schmidl & Cox para DVB-T (64/256/1024 pontos FFT) e meça a precisão do timing em função do SNR.
E9. Para um sistema OFDM com $N=64$ e $N_{cp}=16$, é possível determinar a janela segura de timing sem conhecer a duração do canal e a convenção de referência da janela FFT? Se o canal tiver $L_h=5$ amostras, qual é a margem total disponível dentro do CP?
E10. (Desafio) Implemente um receptor completo BPSK com: Costas loop, Gardner TED, detecção de preâmbulo, e decisor. Meça a BER final em função do SNR e compare com a curva teórica ideal.
9.10 Gabarito
E1. Rotação por símbolo: $360° \cdot \Delta f / R_s = 360° \cdot 1000 / 100000 = \boxed{3{,}6°}$.
E3. $\Delta\omega=2\pi(500)=3141{,}6\,\text{rad/s}$. Pela aproximação linear, $\epsilon_\phi^{\text{ss}}=\Delta\omega/(K_dK_0)=3141{,}6/5000\approx\boxed{0{,}628\,\text{rad}=36°}$. Esse erro já é grande para a linearização e, em QPSK, aproxima-se do limite da bacia desejada; deve-se aumentar a largura de malha ou realizar aquisição grosseira de CFO antes do rastreio.
E4. Para QPSK com erro de fase $\Delta\phi$: $P_b\approx Q(\sqrt{2E_b/N_0}\cos\Delta\phi)$ na aproximação que despreza o acoplamento entre eixos. A perda positiva é $L_\phi=-10\log_{10}(\cos^2\Delta\phi)$.
E5. Use a forma complexa $e_k=\operatorname{Re}\{y_k^*(y_{k-1/2}-y_{k+1/2})\}$, que combina I e Q e não pressupõe envelope constante. Meça o desvio padrão de $\hat\epsilon$ após descartar o transitório. Em regime dominado por ruído térmico, espera-se queda aproximadamente proporcional a $1/\sqrt{\mathrm{SNR}}$; em SNR alta, truncamento do interpolador e ruído próprio dos dados podem criar um piso de jitter.
E7. Desprezando a ISI, para sinc e $\epsilon=0{,}05$, $L_t\approx14{,}3(0{,}05)^2\approx0{,}036$ dB. Para $\Delta\phi=10^\circ=0{,}1745$ rad, $L_\phi\approx4{,}34(0{,}1745)^2\approx0{,}132$ dB. Assim, nesse modelo simplificado, $\boxed{\Delta\phi=10^\circ\text{ causa maior perda}}$; uma simulação com ISI deve confirmar a comparação para o pulso escolhido.
E8. Resposta: implementar o algoritmo da Seção “Estimador de Timing de Schmidl & Cox” para cada tamanho FFT, variar SNR de 0 a 20 dB, e plotar a probabilidade de detecção correta vs. SNR. A precisão melhora com SNR maior e com maior $N_{cp}/N$.
E9. Não: $N_{cp}$ sozinho não determina um intervalo simétrico $|\Delta|<N_{cp}$. É preciso saber onde $\Delta=0$ foi colocado e quantas amostras do CP são consumidas pela memória do canal. Com $L_h=5$, a memória é $L_h-1=4$ amostras e a margem total restante é $N_{cp}-(L_h-1)=16-4=\boxed{12\text{ amostras}}$. Essa margem pode ser distribuída de modo assimétrico entre avanço e atraso da janela.
E10. Receptor completo:
Detecção de pacote por energia
Estimador de CFO por preâmbulo repetido
Costas loop para tracking fino de fase
Gardner TED para timing
Detecção de preâmbulo de frame
Decisor BPSK
BER final deve convergir para a curva teórica $Q(\sqrt{2E_b/N_0})$ para SNR > 8 dB, com degradação de $\approx 0{,}2$ dB devido ao jitter residual do loop.
10. Códigos Corretores de Erros
Sistemas de Comunicações — Apostila de Curso
Tópicos: Codificação de Canal · Distância de Hamming · Códigos Lineares · Hamming · CRC · Códigos Convolucionais · Decodificação de Viterbi · Capacidade de Canal
10.1 Antes de começar
Ao final, você deve quantificar redundância, detectar e corrigir erros com distância de Hamming, construir códigos lineares simples e relacionar codificação, BER e capacidade de Shannon. Diagnóstico: acrescentar redundância sempre reduz a taxa útil do enlace? Evidência mínima: codificar e decodificar um bloco Hamming, injetar erros e comparar BER antes e depois da codificação.
10.2 Por que codificar?
Um código corretor de erros adiciona redundância controlada à mensagem para que o receptor detecte ou corrija erros introduzidos pelo canal. Para $k$ bits de informação transformados em uma palavra de código de $n$ bits,
$$
\boxed{R_c=\frac{k}{n}}
$$
é a taxa de código. A taxa útil do enlace diminui por um fator $R_c$, mas a confiabilidade pode melhorar tanto que a taxa líquida alcançável aumenta em canais ruidosos.
10.2.1 O lugar da codificação na cadeia
Não confunda três operações. A codificação de fonte remove redundância (compressão); a codificação de canal acrescenta redundância estruturada para combater erros; a modulação converte bits em formas de onda. Um arquivo pode ser comprimido, protegido e só então mapeado em QPSK.
O custo imediato são 3 bits de redundância por bloco. O benefício possível é menor BER ou menor potência necessária. Comparações justas mantêm iguais a taxa útil, a largura de banda e a BER-alvo.
10.3 Distância de Hamming e capacidade de correção
A distância de Hamming $d_H(\mathbf c_1,\mathbf c_2)$ é o número de posições diferentes entre duas palavras binárias:
Por exemplo, $d_{min}=3$ permite corrigir um erro ou detectar até dois erros, mas não garante ambas as operações simultaneamente para dois erros.
10.3.1 Por que dividir a distância por dois?
Imagine cada palavra válida no centro de uma esfera com todos os vetores a até $t$ erros. Para a decisão pelo vizinho mais próximo ser inequívoca, duas esferas não podem se sobrepor. Como seus centros distam pelo menos $d_{min}$, precisamos de $2t < d_{min}$.
$$
d_H(010,000)=1,\qquad d_H(010,111)=2,
$$
e o receptor recupera $000$. Se dois bits mudarem e chegar $110$, o vizinho mais próximo será $111$: detectar dois erros não significa corrigi-los.
Para um código linear, a diferença módulo 2 de duas palavras também é uma palavra. Logo,
isto é, basta procurar o menor peso entre as palavras não nulas.
10.4 Códigos lineares de bloco
Em um código linear binário $(n,k)$, as palavras de código formam um subespaço de dimensão $k$. A codificação pode ser escrita como
$$
\boxed{\mathbf c=\mathbf uG\pmod 2},
$$
onde $\mathbf u$ é a palavra de informação (vetor-linha de dimensão $k$) e $G$ é a matriz geradora de dimensão $k\times n$. A matriz de paridade $H$ satisfaz
$$
\boxed{H\mathbf c^T=\mathbf0\pmod2}.
$$
No receptor, a síndrome $\mathbf s=H\mathbf r^T$ vale zero para uma palavra válida. Em códigos de Hamming, cada síndrome não nula aponta diretamente a posição de um único erro.
10.4.1 DEDUÇÃO: Por que a síndrome localiza o erro?
Aqui $\mathbf u$ e $\mathbf c$ são vetores-linha; $G$ mede $k\times n$, $H$ mede $(n-k)\times n$ e $GH^T=0$ em $GF(2)$. Nesse corpo, somar é fazer XOR.
A síndrome depende do padrão de erro, não da mensagem. Para um erro único na posição $i$, $\mathbf e$ contém um único 1 e a síndrome é a coluna $i$ de $H$. Projetar $H$ com colunas binárias distintas permite identificar todas as posições.
10.5 Código de Hamming
O código Hamming $(7,4)$ transforma quatro bits em sete e possui $d_{min}=3$, logo corrige um erro por palavra. As posições $1$, $2$ e $4$ são bits de paridade; as posições $3$, $5$, $6$ e $7$ transportam dados. Uma escolha de paridades pares é:
Se a síndrome em binário é $s_4s_2s_1$, ela fornece o índice do bit errado.
10.5.1 Codificação e correção passo a passo
Para $\mathbf d=(1,0,1,1)$, reserve as potências de dois para paridade:
Posição
1
2
3
4
5
6
7
Função
$p_1$
$p_2$
$d_1$
$p_4$
$d_2$
$d_3$
$d_4$
Valor
0
1
1
0
0
1
1
Por exemplo, $p_1=1\oplus0\oplus1=0$; calculando as demais paridades, obtemos $\mathbf c=(0,1,1,0,0,1,1)$.
Se o quinto bit for invertido, chega $\mathbf r=(0,1,1,0,1,1,1)$. Recalculando:
$$
s_1=r_1\oplus r_3\oplus r_5\oplus r_7=1,
$$
$$
s_2=r_2\oplus r_3\oplus r_6\oplus r_7=0,
$$
$$
s_4=r_4\oplus r_5\oplus r_6\oplus r_7=1.
$$
Assim, $s_4s_2s_1=101_2=5$: inverta a posição 5 e extraia os dados das posições 3, 5, 6 e 7.
Limitação: dois erros podem produzir uma síndrome que aponta uma terceira posição e causar correção indevida. Uma paridade global adicional forma um código SECDED, capaz de corrigir um erro e detectar dois.
Um código SECDED adiciona um bit de paridade global ao Hamming $(7,4)$, produzindo um código $(8,4)$ com $d_{min}=4$. A paridade global verifica se o número total de 1s é par.
Com $d_{min}=4$:
Corrige 1 erro ($t=\lfloor(4-1)/2\rfloor=1$)
Detecta 2 erros (mas não corrige)
O receptor calcula a síndrome local $s_4s_2s_1$ e a paridade global $p_g$. Se $p_g$ falha mas a síndrome é zero, há 2 erros. Se $p_g$ falha e a síndrome é não nula, há 1 erro na posição indicada pela síndrome.
10.6 CRC: detecção de erros
O CRC representa uma sequência de bits como polinômio sobre $GF(2)$. O transmissor divide $x^rM(x)$ pelo polinômio gerador $g(x)$ e transmite a mensagem acrescida do resto. O receptor divide a palavra recebida por $g(x)$; resto não nulo indica erro.
CRC é excelente para detecção, especialmente de rajadas, mas normalmente não corrige o bit errado. Em sistemas práticos, CRC é frequentemente combinado com ARQ ou com FEC.
10.6.1 DEDUÇÃO: Divisão polinomial sem mistério
Considere $M=1101$ e $g=1011$, de grau 3. Acrescente três zeros a $M$ e divida $1101000$ por $1011$, usando XOR no lugar da subtração:
O resto é $001$, portanto transmite-se $1101001$. Ao dividir essa palavra por $1011$, o receptor obtém resto zero.
10.6.2 Garantias de detecção do CRC
Um resto não nulo revela erro, mas resto zero não é garantia absoluta: padrões que são múltiplos de $g(x)$ passam despercebidos. Todo CRC de grau $r$ detecta:
Todas as rajadas de comprimento $\leq r$
Todas as rajadas de comprimento $r+1$ com probabilidade $1-2^{-(r-1)}$
Todas as rajadas de comprimento $> r+1$ com probabilidade $1-2^{-r}$
Isso ocorre porque uma rajada de comprimento $L$ corresponde a um polinômio da forma $x^i(x^{L-1}+x^{L-2}+\dots+1)$. Se $L \leq r$, este polinômio não pode ser múltiplo de $g(x)$ (grau $r$).
10.7 Códigos convolucionais e Viterbi
Um codificador convolucional possui memória: cada saída depende do bit atual e de bits anteriores. Sua taxa é dada por $R_c=k/n$; por exemplo, um codificador de taxa $1/2$ gera dois bits para cada bit de entrada.
O algoritmo de Viterbi busca a sequência mais provável no trellis. Para canal AWGN, a versão soft decision usa distâncias euclidianas e normalmente obtém ganho maior que a decisão dura.
10.7.1 Registrador, trellis e sobreviventes
Para um codificador de taxa $1/2$, memória 2 e geradores $(7,5)_8$,
O estado é $(u[k-1],u[k-2])$; existem quatro estados e duas transições saindo de cada um. O trellis apenas desenha essas transições ao longo do tempo.
Em cada instante, Viterbi (1) calcula a métrica de cada ramo, (2) soma-a ao custo acumulado, (3) mantém, para cada estado, somente o caminho de menor custo e (4) após uma profundidade de decisão, percorre os sobreviventes para trás. Decisão dura usa distância de Hamming; decisão suave usa amostras e distância euclidiana, preservando quão confiável era cada observação.
Mensagens finitas costumam receber bits de cauda para terminar no estado zero. Sem um estado final conhecido, os últimos bits têm decisão menos confiável.
10.7.2 DEDUÇÃO: Métrica de decisão suave vs. dura
Para canal AWGN com amostras $y_k$, a versão soft decision calcula a distância euclidiana:
$$
d_E^2 = \sum_k (y_k - \hat{y}_k)^2
$$
onde $\hat{y}_k \in \{-1,+1\}$ é o símbolo esperado mapeado de $\{0,1\}$. Para decisão dura, cada $y_k$ é primeiro convertido para $\hat{y}_k \in \{0,1\}$ por limiar em 0, e a métrica é a distância de Hamming:
Para canal AWGN com largura de banda $B$, a capacidade é
$$
\boxed{C=B\log_2(1+S/N)}.
$$
Shannon afirma que existem códigos com probabilidade de erro arbitrariamente pequena para taxas $R<C$, usando blocos suficientemente longos; para $R>C$, comunicação confiável é impossível. O teorema não fornece um código específico nem torna a complexidade de decodificação gratuita.
Compare com $C$ a taxa de informação, e use a SNR referente à mesma largura de banda $B$. Se $R_{\mathrm{info}}>C$, trocar Hamming por um código moderno não basta: é necessário aumentar potência ou banda, ou reduzir a taxa útil. LDPC, turbo e códigos polares podem operar perto do limite em diferentes cenários, com custos finitos de bloco, latência e processamento.
10.8.1 DEDUÇÃO: Relação entre taxa, SNR e BER
Para codificação com taxa $R_c$, a energia por bit de informação é $E_b = E_s/R_c$, onde $E_s$ é a energia por símbolo transmitido. A capacidade em termos de $E_b/N_0$ é:
Para BER alvo $10^{-5}$ em BPSK sem codificação, $E_b/N_0 \approx 9{,}6$ dB. Com codificação próxima de Shannon, esse valor pode ser reduzido para $\approx 4$ dB — um ganho de codificação de $\approx 5{,}6$ dB.
10.9 Experimentos Resolvidos em Python
10.9.1 Protocolo computacional
Objetivo: medir ganho de codificação, taxas de erro e capacidade de correção. Controle experimental: declare SNR, padrões de erro, polinômios CRC e parâmetros Viterbi. Validação: reporte BER antes/depois da codificação, posição de erro corrigida, resto CRC e métricas Viterbi.
10.9.2 Exercício 1: Codificação e Decodificação Hamming (7,4)
Implementar codificação, injeção de erro, decodificação com correção e verificação.
PYTHON
import numpy as npdefhamming74_encode(d):d1,d2,d3,d4=map(int,d)p1=d1^d2^d4p2=d1^d3^d4p4=d2^d3^d4returnnp.array([p1,p2,d1,p4,d2,d3,d4],dtype=int)defhamming74_decode(r):r=r.copy()s1=r[0]^r[2]^r[4]^r[6]s2=r[1]^r[2]^r[5]^r[6]s4=r[3]^r[4]^r[5]^r[6]pos=s1+2*s2+4*s4ifpos:r[pos-1]^=1returnr[[2,4,5,6]],pos# Teste 1: sem errodata=np.array([1,0,1,1])codeword=hamming74_encode(data)decoded,position=hamming74_decode(codeword)print(f'Dados originais: {data}')print(f'Código Hamming: {codeword}')print(f'Decodificado (sem erro): {decoded}, posição corrigida: {position}')assertnp.array_equal(data,decoded)andposition==0# Teste 2: erro no 5º bitreceived=codeword.copy();received[4]^=1decoded,position=hamming74_decode(received)print(f'Recebido com erro: {received}')print(f'Decodificado (com erro): {decoded}, posição corrigida: {position}')assertnp.array_equal(data,decoded)andposition==5# Teste 3: dois erros (correção indevida possível)received2=codeword.copy()received2[0]^=1;received2[1]^=1decoded2,position2=hamming74_decode(received2)print(f'Recebido com 2 erros: {received2}')print(f'Decodificado: {decoded2}, posição corrigida: {position2}')# Nota: dois erros podem causar correção indevidaprint("✓ Hamming (7,4) simulation complete.")
Output:
Dados originais: [1 0 1 1]
Código Hamming: [0 1 1 0 0 1 1]
Decodificado (sem erro): [1 0 1 1], posição corrigida: 0
Recebido com erro: [0 1 1 0 1 1 1]
Decodificado (com erro): [1 0 1 1], posição corrigida: 5
Recebido com 2 erros: [1 0 1 0 0 1 1]
Decodificado: [0 0 1 1], posição corrigida: 3
✓ Hamming (7,4) simulation complete.
10.9.3 Exercício 2: Cálculo CRC
Implementar divisão polinomial CRC e verificar detecção de rajadas de erro.
PYTHON
defcrc_compute(message_bits,poly_bits):"""Compute CRC remainder for message and generator polynomial."""msg=list(message_bits)poly=list(poly_bits)poly_len=len(poly)# Pad message with zerosfor_inrange(poly_len-1):msg.append(0)# Polynomial divisionforiinrange(len(message_bits)):ifmsg[i]==1:forjinrange(poly_len):msg[i+j]^=poly[j]returnmsg[-(poly_len-1):]# Teste CRCmessage=[1,1,0,1]poly=[1,0,1,1]# x^3 + x + 1remainder=crc_compute(message,poly)print(f'Mensagem: {message}')print(f'Polinômio: {poly}')print(f'Resto CRC: {remainder}')# Transmitted codewordcodeword_crc=message+remainderprint(f'Codeword transmitido: {codeword_crc}')# Verify with no errorverify_remainder=crc_compute(codeword_crc,poly)print(f'Resto na verificação (sem erro): {verify_remainder}')assertverify_remainder==[0,0,0]# Verify with errorcodeword_error=codeword_crc.copy()codeword_error[3]^=1error_remainder=crc_compute(codeword_error,poly)print(f'Resto na verificação (com erro): {error_remainder}')asserterror_remainder!=[0,0,0]print("✓ CRC simulation complete.")
Output:
Mensagem: [1, 1, 0, 1]
Polinômio: [1, 0, 1, 1]
Resto CRC: [0, 0, 1]
Codeword transmitido: [1, 1, 0, 1, 0, 0, 1]
Resto na verificação (sem erro): [0, 0, 0]
Resto na verificação (com erro): [1, 0, 1]
✓ CRC simulation complete.
10.9.4 Exercício 3: Simulação de Decodificação Viterbi (Decisão Dura)
Implementar Viterbi simplificado para codificador convolucional taxa 1/2, memória 2.
PYTHON
import numpy as npclassViterbiDecoder:def__init__(self,k=1,n=2,memory=2,generators=[7,5]):self.k=kself.n=nself.memory=memoryself.generators=generatorsself.num_states=2**memorydefencode_state(self,state,input_bit):"""Encode a state and input bit to output bits."""# State is (u[k-1], u[k-2])u_k2,u_k1=stateu_k=input_bit# Generator 7 (111): v1 = u[k] ^ u[k-1] ^ u[k-2]v1=u_k^u_k1^u_k2# Generator 5 (101): v2 = u[k] ^ u[k-2]v2=u_k^u_k2return(v1,v2),(u_k1,u_k)defdecode(self,received_bits):"""Viterbi decoding with hard decision."""num_states=self.num_states# Trellis: metrics[step][state] = accumulated metricmetrics={state:0forstateinrange(num_states)}path_history=[{state:[]forstateinrange(num_states)}]# Process each received pairforstepinrange(len(received_bits)//2):r_pair=received_bits[2*step:2*step+2]new_metrics={state:float('inf')forstateinrange(num_states)}new_path_history={state:[]forstateinrange(num_states)}forstateinrange(num_states):# Two possible transitions: input 0 or 1forinput_bitin[0,1]:(v1,v2),next_state=self.encode_state(state,input_bit)# Calculate branch metric (Hamming distance)expected_bits=[v1,v2]branch_metric=sum(1fore,rinzip(expected_bits,r_pair)ife!=r)new_metric=metrics[state]+branch_metricifnew_metric<new_metrics[next_state]:new_metrics[next_state]=new_metricnew_path_history[next_state]=path_history[-1][state]+[input_bit]metrics=new_metricspath_history.append(new_path_history)# Tracebackfinal_state=min(metrics.keys(),key=lambdas:metrics[s])decoded_bits=path_history[-1][final_state]returndecoded_bits# Test Viterbidecoder=ViterbiDecoder(k=1,n=2,memory=2,generators=[7,5])original_bits=[1,0,1,1,0]# Encodeencoded_bits=[]state=(0,0)forbitinoriginal_bits:(v1,v2),state=decoder.encode_state(state,bit)encoded_bits.extend([v1,v2])# Simulate channel with 1 errorreceived_bits=encoded_bits.copy()received_bits[3]^=1# Flip one bitdecoded_bits=decoder.decode(received_bits)print(f'Bits originais: {original_bits}')print(f'Bits codificados: {encoded_bits}')print(f'Bits recebidos (com erro): {received_bits}')print(f'Bits decodificados: {decoded_bits}')print("✓ Viterbi simulation complete.")
Erro: cannot unpack non-iterable int object
Output:
[31m---------------------------------------------------------------------------[39m
[31mTypeError[39m Traceback (most recent call last)
[36mCell[39m[36m [39m[32mIn[1][39m[32m, line 77[39m
[32m 74[39m received_bits = encoded_bits.copy()
[32m 75[39m received_bits[[32m3[39m] ^= [32m1[39m [38;5;66;03m# Flip one bit[39;00m
[32m---> [39m[32m77[39m decoded_bits = [30;43mdecoder[39;49m[30;43m.[39;49m[30;43mdecode[39;49m[30;43m([39;49m[30;43mreceived_bits[39;49m[30;43m)[39;49m
[32m 78[39m [38;5;28mprint[39m([33mf[39m[33m'[39m[33mBits originais: [39m[38;5;132;01m{[39;00moriginal_bits[38;5;132;01m}[39;00m[33m'[39m)
[32m 79[39m [38;5;28mprint[39m([33mf[39m[33m'[39m[33mBits codificados: [39m[38;5;132;01m{[39;00mencoded_bits[38;5;132;01m}[39;00m[33m'[39m)
[36mCell[39m[36m [39m[32mIn[1][39m[32m, line 41[39m, in [36mViterbiDecoder.decode[39m[34m(self, received_bits)[39m
[32m 38[39m [38;5;28;01mfor[39;00m state [38;5;129;01min[39;00m [38;5;28mrange[39m(num_states):
[32m 39[39m [38;5;66;03m# Two possible transitions: input 0 or 1[39;00m
[32m 40[39m [38;5;28;01mfor[39;00m input_bit [38;5;129;01min[39;00m [[32m0[39m, [32m1[39m]:
[32m---> [39m[32m41[39m (v1, v2), next_state = [30;43mself[39;49m[30;43m.[39;49m[30;43mencode_state[39;49m[30;43m([39;49m[30;43mstate[39;49m[30;43m,[39;49m[30;43m [39;49m[30;43minput_bit[39;49m[30;43m)[39;49m
[32m 43[39m [38;5;66;03m# Calculate branch metric (Hamming distance)[39;00m
[32m 44[39m expected_bits = [v1, v2]
[36mCell[39m[36m [39m[32mIn[1][39m[32m, line 14[39m, in [36mViterbiDecoder.encode_state[39m[34m(self, state, input_bit)[39m
[32m 12[39m [38;5;250m[39m[33;03m"""Encode a state and input bit to output bits."""[39;00m
[32m 13[39m [38;5;66;03m# State is (u[k-1], u[k-2])[39;00m
[32m---> [39m[32m14[39m u_k2, u_k1 = state
[32m 15[39m u_k = input_bit
[32m 17[39m [38;5;66;03m# Generator 7 (111): v1 = u[k] ^ u[k-1] ^ u[k-2][39;00m
[31mTypeError[39m: cannot unpack non-iterable int object
10.9.5 Exercício 4: Comparação BER com e sem FEC
Simular BER para BPSK em AWGN com e sem codificação Hamming (7,4).
PYTHON
import numpy as npfrom scipy.special importerfcdefber_without_fec(EbN0_db,N_bits=100000):"""BER for BPSK without FEC."""EbN0_lin=10**(EbN0_db/10)sigma=1/np.sqrt(2*EbN0_lin)bits=np.random.randint(0,2,N_bits)symbols=2*bits-1noise=sigma*np.random.randn(N_bits)received=symbols+noisedecisions=(received>0).astype(int)errors=np.sum(bits!=decisions)returnerrors/N_bitsdefber_with_hamming74(EbN0_db,N_blocks=10000):"""BER for BPSK with Hamming (7,4) FEC."""EbN0_lin=10**(EbN0_db/10)# Energy per coded bitEbN0_coded=EbN0_lin*(4/7)# Rate 4/7sigma=1/np.sqrt(2*EbN0_coded)blocks_errors=0for_inrange(N_blocks):# Generate 4 data bitsdata=np.random.randint(0,2,4)codeword=hamming74_encode(data)# BPSK modulationsymbols=2*codeword-1noise=sigma*np.random.randn(7)received_analog=symbols+noise# Hard decisionreceived_bits=(received_analog>0).astype(int)# Decodedecoded_data,pos=hamming74_decode(received_bits)# Check for block errorifnotnp.array_equal(data,decoded_data):blocks_errors+=1returnblocks_errors/N_blocks# Simulate BER curvesEbN0_dbs=np.linspace(0,10,11)ber_no_fec=[ber_without_fec(db,N_bits=50000)fordbinEbN0_dbs]ber_with_fec=[ber_with_hamming74(db,N_blocks=5000)fordbinEbN0_dbs]print("BER Comparison (BPSK vs BPSK+Hamming(7,4)):")fordb,b_no,b_fecinzip(EbN0_dbs,ber_no_fec,ber_with_fec):print(f"EbN0={db:2.0f} dB: BER sem FEC={b_no:.2e}, BER com FEC={b_fec:.2e}")print("✓ BER comparison simulation complete.")
Output:
BER Comparison (BPSK vs BPSK+Hamming(7,4)):
EbN0= 0 dB: BER sem FEC=8.10e-02, BER com FEC=2.69e-01
EbN0= 1 dB: BER sem FEC=5.57e-02, BER com FEC=1.93e-01
EbN0= 2 dB: BER sem FEC=3.73e-02, BER com FEC=1.15e-01
EbN0= 3 dB: BER sem FEC=2.30e-02, BER com FEC=7.26e-02
EbN0= 4 dB: BER sem FEC=1.29e-02, BER com FEC=3.60e-02
EbN0= 5 dB: BER sem FEC=5.94e-03, BER com FEC=1.58e-02
EbN0= 6 dB: BER sem FEC=2.46e-03, BER com FEC=7.60e-03
EbN0= 7 dB: BER sem FEC=7.60e-04, BER com FEC=1.00e-03
EbN0= 8 dB: BER sem FEC=1.40e-04, BER com FEC=0.00e+00
EbN0= 9 dB: BER sem FEC=2.00e-05, BER com FEC=0.00e+00
EbN0=10 dB: BER sem FEC=0.00e+00, BER com FEC=0.00e+00
✓ BER comparison simulation complete.
10.10 Lista de Exercícios Propostos
E1. Um código $(15,11)$ possui qual taxa $R_c$? Qual a redundância em porcentagem?
E2. Um código tem $d_{min}=5$. Quantos erros ele corrige e quantos detecta? E se $d_{min}=6$?
E3. Codifique a palavra $\mathbf u=(1,0,1,1)$ pelo Hamming $(7,4)$ usado neste capítulo. Verifique que a palavra codificada satisfaz $H\mathbf c^T=\mathbf0$.
E4. A palavra Hamming recebida é $(0,1,1,0,0,1,1)$. Calcule a síndrome e corrija, se necessário. E se a palavra for $(0,0,1,0,0,1,1)$?
E5. Explique por que CRC e Hamming têm finalidades diferentes em uma cadeia de comunicação. Dê um exemplo de sistema que usa ambos.
E6. Para $B=200\,\mathrm{kHz}$ e $S/N=15\,\mathrm{dB}$, calcule a capacidade de Shannon aproximada. Se a taxa de informação é $1\,\mathrm{Mbit/s}$, é possível comunicação confiável?
E7. Um enlace transmite bits codificados a $12\,\mathrm{Mbit/s}$ com um código de taxa $2/3$. Qual é a taxa de informação? Se a capacidade do canal é $9\,\mathrm{Mbit/s}$, o teorema de Shannon impede comunicação confiável nessa taxa? Justifique.
E8. Para o código $C=\{00000,11100,00111,11011\}$, verifique que ele é linear, encontre $d_{min}$ e determine quantos erros podem ser corrigidos.
E9. No Hamming $(7,4)$ deste capítulo, receba $\mathbf r=(0,0,1,0,0,1,1)$. Calcule $s_1$, $s_2$ e $s_4$, corrija a palavra e recupere os quatro dados.
E10. Explique por que um decodificador Viterbi de decisão suave não deve primeiro transformar cada amostra em 0 ou 1. Qual o ganho típico em dB sobre decisão dura para AWGN?
E11. Implemente um codificador CRC com polinômio $g(x)=x^4+x+1$ e verifique a detecção de uma rajada de 4 bits de erro.
E12. Para um código SECDED $(8,4)$, receba $\mathbf r=(1,1,0,1,0,1,1,0)$ (último bit é paridade global). Calcule a síndrome local e a paridade global, e determine se há 0, 1 ou 2 erros.
E2. Para $d_{min}=5$: $t=\lfloor(5-1)/2\rfloor=\boxed{2}$ erros corrigíveis; detecta até $\boxed{4}$ erros. Para $d_{min}=6$: $t=\lfloor(6-1)/2\rfloor=\boxed{2}$ erros corrigíveis; detecta até $\boxed{5}$ erros.
E3. $p_1=0$, $p_2=1$ e $p_4=0$, portanto $\boxed{(0,1,1,0,0,1,1)}$. A síndrome $H\mathbf c^T=\mathbf0$ é verificada calculando $s_1=0$, $s_2=0$, $s_4=0$.
E4. Para $(0,1,1,0,0,1,1)$: $s_1=0$, $s_2=0$, $s_4=0$. Síndrome zero: palavra válida, não requer correção. Para $(0,0,1,0,0,1,1)$: $s_1=1$, $s_2=0$, $s_4=0$, síndrome $001_2=1$. Corrigindo posição 1: $(1,0,1,0,0,1,1)$, dados: $\boxed{(1,0,1,1)}$.
E5. Hamming é FEC e corrige um erro por palavra; CRC detecta erros, sobretudo rajadas, e costuma acionar retransmissão ou complementar outro código. Exemplo: Ethernet usa CRC-32 para detecção; Wi-Fi usa CRC-32 + codificação convolucional/Turbo.
E6. $S/N=10^{1{,}5}\approx31{,}62$; $C=200\times10^3\log_2(32{,}62)\approx\boxed{1{,}01\,\mathrm{Mbit/s}}$. Sim, $1\,\mathrm{Mbit/s} < 1{,}01\,\mathrm{Mbit/s}$, portanto comunicação confiável é teoricamente possível com código adequado.
E7. $R_{\mathrm{info}}=(2/3)12=\boxed{8\,\mathrm{Mbit/s}}$. Como $8<9\,\mathrm{Mbit/s}$, Shannon não impede comunicação confiável; afirma apenas que códigos adequados podem existir. Não garante que o código escolhido atinja a BER desejada.
E8. O XOR de quaisquer duas palavras listadas também pertence a $C$, e $00000$ está no conjunto; portanto, o código é linear. Os pesos não nulos são 3, 3 e 4, logo $d_{min}=3$ e $t=\lfloor(3-1)/2\rfloor=\boxed{1}$.
E9. $s_1=0$, $s_2=1$ e $s_4=0$, portanto $s_4s_2s_1=010_2=2$. Corrigindo a posição 2, obtém-se $(0,1,1,0,0,1,1)$ e os dados das posições 3, 5, 6 e 7 são $\boxed{(1,0,1,1)}$.
E10. A decisão binária antecipada descarta a magnitude da amostra, isto é, a confiança da observação. O Viterbi suave compara diretamente as distâncias entre amostras e níveis esperados e pode distinguir evidência fraca de evidência forte. Ganho típico: $\boxed{\approx 2\,\mathrm{dB}}$.
E11. Polinômio $g(x)=x^4+x+1$ (binário $10011$). Rajada de 4 bits $1111$ na posição correta não é múltipla de $g(x)$, portanto detectada. CRC de grau 4 detecta todas as rajadas de comprimento $\leq 4$.
E12. Dados: posições 3,5,6,7 são $0,1,1,0$. Paridades locais: $p_1=0\oplus1\oplus0=1$, $p_2=0\oplus1\oplus0=1$, $p_4=1\oplus1\oplus0=0$. Síndrome local: $s_4s_2s_1=011_2=3$. Paridade global: soma de todos os bits = $1+1+0+1+0+1+1+0=4$ (par). Paridade global OK, mas síndrome não zero → erro único na posição 3. Correção: inverter posição 3.
10.12 Síntese e roteiro de decisão
Ao analisar um esquema de proteção de canal, siga esta ordem:
Identifique a finalidade: detectar, corrigir sem retransmissão, ou solicitar retransmissão?
Calcule o custo: determine $n$, $k$, $R_c=k/n$ e a taxa útil.
Modele o erro: erros independentes, rajadas, apagamentos ou amostras suaves?
Associe a ferramenta: distância e síndrome para códigos de bloco; divisão polinomial para CRC; trellis e métricas para códigos convolucionais.
Cheque o limite físico: compare a taxa de informação com a capacidade usando unidades e largura de banda consistentes.
Valide: injete padrões de erro controlados antes de medir BER em um canal aleatório.
Erros comuns a evitar:
interpretar $R_c$ como taxa em bit/s, embora seja uma razão adimensional;
afirmar que $d_{min}=3$ corrige três erros;
somar matrizes binárias sem reduzir módulo 2;
tratar síndrome zero como prova de ausência de qualquer erro;
dizer que CRC corrige automaticamente o pacote;
comparar taxa codificada, em vez de taxa de informação, com a capacidade;
comparar BER codificada e não codificada em condições diferentes de energia por bit útil.
Teste de domínio: sem consultar o texto, explique por que uma síndrome não nula localiza um erro único no Hamming $(7,4)$ e por que a mesma regra pode falhar diante de dois erros. Se a explicação não mencionar as colunas de $H$ e $d_{min}$, revise as Seções 2–4.