Apostila de curso · 80 horas

Sistemas de Comunicações

Uma jornada progressiva da teoria aos experimentos computacionais.

IFSC · Prof. Laio Oriel Seman

Sistemas de Comunicações

Sumário

  1. 1. Sinais, Transformada de Fourier, Processos Aleatórios e Ruído
  2. 2. Introdução a Sistemas de Comunicações
  3. 3. Modulação em Amplitude — Teoria Completa
  4. 4. Modulação em Frequência (FM)
  5. 5. Transmissão em Banda Base e Critério de Nyquist
  6. 6. Transmissão Digital em Banda Passante: ASK, PSK e FSK
  7. 7. Modulação QAM — Transmissão Digital em Banda Base
  8. 8. Equalização — Compensação da Dispersão do Canal
  9. 9. Sincronismo
  10. 10. Códigos Corretores de Erros

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:

$$ E_x \equiv \int_{-\infty}^{\infty}|x(t)|^2\,dt $$

e de potência se $0<P_x<\infty$ (tipicamente sinais periódicos ou aleatórios estacionários, que têm energia infinita):

$$ P_x \equiv \lim_{T\to\infty}\frac{1}{T}\int_{-T/2}^{T/2}|x(t)|^2\,dt $$

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:

$$ \int_{T_0}e^{j2\pi nf_0t}e^{-j2\pi mf_0t}\,dt = \int_{T_0}e^{j2\pi(n-m)f_0t}\,dt = \begin{cases}T_0 & n=m\\0 & n\neq m\end{cases} $$

(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:

$$ \boxed{c_n = \frac{1}{T_0}\int_{T_0}x(t)\,e^{-j2\pi nf_0t}\,dt} $$

1.3.2 Espectro de linhas e simetria hermitiana

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

$$ P_x = \frac{1}{T_0}\int_{T_0}|x(t)|^2\,dt = \sum_{n=-\infty}^{\infty}|c_n|^2 $$

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):

$$ \boxed{X(f) \equiv \int_{-\infty}^{\infty}x(t)\,e^{-j2\pi ft}\,dt}\ ,\qquad \boxed{x(t) = \int_{-\infty}^{\infty}X(f)\,e^{j2\pi ft}\,df} $$

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)$.

1.4.2 Propriedades fundamentais (com dedução breve)

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$.

$$ \boxed{x(t)\cos(2\pi f_ct) \leftrightarrow \frac{1}{2}\left[X(f-f_c)+X(f+f_c)\right]} $$

(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}$.

1.4.4 Dedução do par retangular ↔ sinc

$$ X(f) = \int_{-T/2}^{T/2}e^{-j2\pi ft}\,dt = \left[\frac{e^{-j2\pi ft}}{-j2\pi f}\right]_{-T/2}^{T/2} = \frac{e^{-j\pi fT}-e^{j\pi fT}}{-j2\pi f} = \frac{2\sin(\pi fT)}{2\pi f} = T\,\frac{\sin(\pi fT)}{\pi fT} = T\,\text{sinc}(fT) $$

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:

$$ \boxed{x(t)=\sum_nc_ne^{j2\pi nf_0t} \quad\longleftrightarrow\quad X(f)=\sum_nc_n\,\delta(f-nf_0)} $$

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).


1.5 Convolução, Filtragem e o Teorema de Parseval

1.5.1 Convolução no tempo ↔ Produto em frequência

$$ y(t) = x(t)*h(t) \equiv \int_{-\infty}^{\infty}x(\tau)h(t-\tau)\,d\tau \quad\longleftrightarrow\quad Y(f)=X(f)H(f) $$

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:

$$ Y(f) = \int\!\!\int x(\tau)h(t-\tau)e^{-j2\pi ft}\,d\tau\,dt = \int x(\tau)\left[\int h(t-\tau)e^{-j2\pi ft}\,dt\right]d\tau = \int x(\tau)H(f)e^{-j2\pi f\tau}\,d\tau = X(f)H(f) $$

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)

$$ \boxed{E_x = \int_{-\infty}^{\infty}|x(t)|^2\,dt = \int_{-\infty}^{\infty}|X(f)|^2\,df} $$

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:

$$ E_x = \int X^*(f)\left[\int x(t)e^{-j2\pi ft}\,dt\right]df = \int X^*(f)X(f)\,df = \int|X(f)|^2\,df $$

$|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:

$$ s(t) = A(t)\cos\big(2\pi f_ct+\phi(t)\big) = \text{Re}\left\{\underbrace{A(t)e^{j\phi(t)}}_{\tilde{s}(t)}\,e^{j2\pi f_ct}\right\} = \text{Re}\{\tilde{s}(t)e^{j2\pi f_ct}\} $$

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)$:

$$ \boxed{s(t) = s_I(t)\cos(2\pi f_ct) - s_Q(t)\sin(2\pi f_ct)} $$

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^*)$):

$$ S(f) = \frac{1}{2}\left[\tilde S(f-f_c) + \tilde S^*(-f-f_c)\right] $$

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:

  1. A média é constante no tempo: $E[X(t)]=\mu_X$ (não depende de $t$).
  2. 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):


1.8 Densidade Espectral de Potência de Processos Aleatórios

1.8.1 Teorema de Wiener-Khinchin

$$ \boxed{S_X(f) \equiv \int_{-\infty}^{\infty}R_X(\tau)\,e^{-j2\pi f\tau}\,d\tau} $$

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

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$):

$$ S_N(f) = \frac{k_BT}{2}\qquad\text{(W/Hz, bilateral)} $$

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:

  1. 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.
  2. 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).
  3. 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:

$$ \boxed{P_N = \int_{-B}^{B}\frac{N_0}{2}\,df = N_0B} $$

(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.

1.9.4 Densidade de probabilidade Gaussiana

$$ f_N(n) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{n^2}{2\sigma^2}\right),\qquad \sigma^2 = P_N = N_0B $$

$\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)$:

$$ \boxed{Q(x) \equiv \int_x^\infty \frac{1}{\sqrt{2\pi}}e^{-u^2/2}\,du = P(Z>x),\quad Z\sim\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$:

$$ P(\text{erro}\,|\,s=-A) = P(n>A) = \int_A^\infty\frac{1}{\sqrt{2\pi}\sigma}e^{-n^2/(2\sigma^2)}\,dn $$

Substituindo $u=n/\sigma$ ($du=dn/\sigma$), os limites tornam-se $A/\sigma$ a $\infty$:

$$ P(\text{erro}\,|\,s=-A) = \int_{A/\sigma}^\infty\frac{1}{\sqrt{2\pi}}e^{-u^2/2}\,du = Q\!\left(\frac{A}{\sigma}\right) $$

Por simetria (mesmo argumento para $s=+A$, erro se $n<-A$), a probabilidade de erro é a mesma condicionada a cada símbolo, logo:

$$ \boxed{P_e = Q\!\left(\frac{A}{\sigma}\right)} $$

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):

$$ \frac{A}{\sigma} = \sqrt{\frac{2E_b}{N_0}} \quad\Rightarrow\quad \boxed{P_e = Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right)} $$

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 np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.special import erfc

# === Série de Fourier de uma onda quadrada ===
def coef_fourier_onda_quadrada(n, A=1.0):
    """Coeficientes c_n de uma onda quadrada ímpar de amplitude A (só harmônicos ímpares)."""
    if n == 0:
        return 0.0
    if n % 2 == 0:
        return 0.0
    return (2*A)/(1j*np.pi*n)

N_harm = 15
ns = np.arange(-N_harm, N_harm+1)
cs = np.array([coef_fourier_onda_quadrada(n) for n in ns])
t = np.linspace(-1, 1, 2000)
f0 = 1.0
x_reconstruida = np.real(sum(cs[i]*np.exp(1j*2*np.pi*ns[i]*f0*t) for i in range(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 ===
def pulso_retangular(t, T):
    return np.where(np.abs(t) <= T/2, 1.0, 0.0)

Fs = 1000
t_vec = np.arange(-5, 5, 1/Fs)
T_pulso = 1.0
x = pulso_retangular(t_vec, T_pulso)
X = np.fft.fftshift(np.fft.fft(x)) / Fs
f_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) / Fs
E_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 ===
def gerar_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)
    return np.random.normal(0, sigma, N)

N0_2 = 1e-3
Fs_ruido = 10000
n_amostras = 100000
ruido = 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 ===
def Q(x):
    return 0.5*erfc(x/np.sqrt(2))

A, sigma_ruido = 1.0, 0.3
Pe = 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 Carlo
n_bits = 200000
bits = 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
Figura

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$:

$$ \boxed{c_n = \frac{(5)(0{,}2\times10^{-3})}{10^{-3}}\,\text{sinc}(0{,}2n) = 1{,}0\cdot\text{sinc}(0{,}2n)\,\text{V},\qquad c_0=1{,}0\,\text{V}} $$

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$:

$$ \boxed{X(f) = \frac{1}{4W}\left[\text{rect}\!\left(\frac{f-f_c}{2W}\right)+\text{rect}\!\left(\frac{f+f_c}{2W}\right)\right]} $$

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.

E6. $P_N = k_BTB = (1{,}380649\times10^{-23})(290)(10\times10^6)$:

$$ \boxed{P_N \approx 4{,}00\times10^{-14}\,\text{W} = 40{,}0\,\text{fW}} $$

(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{Q(0)=0{,}5;\ Q(1)\approx0{,}1587;\ Q(2)\approx0{,}0228;\ Q(3)\approx0{,}00135;\ Q(-1)\approx0{,}8413} $$

E8. $P_e = Q(A/\sigma) = Q(2/0{,}5) = Q(4) \approx 3{,}17\times10^{-5}$. Dobrando $A$: $P_e' = Q(4/0{,}5)=Q(8)\approx6{,}22\times10^{-16}$.

$$ \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:

$$ A = \sqrt{s_I^2+s_Q^2} = \sqrt{9+16}=5,\qquad \phi = \arctan\!\left(\frac{s_Q}{s_I}\right) = \arctan(4/3)\approx53{,}13° $$
$$ \boxed{s(t) = 5\cos(2\pi f_ct+53{,}13°)} $$

Verificação: $5\cos(53{,}13°)\approx3{,}0=s_I$ ✓, $5\sin(53{,}13°)\approx4{,}0=s_Q$ ✓.

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:

$$ R_X(\tau) = \left(1-\frac{|\tau|}{T_b}\right)A^2 + \frac{|\tau|}{T_b}\cdot0 = A^2\left(1-\frac{|\tau|}{T_b}\right),\qquad |\tau|<T_b $$

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$):

$$ \boxed{S_X(f) = A^2T_b\,\text{sinc}^2(fT_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 é

$$ F_{s,\rm RF}\ge2f_{\max}=2{,}001\ \text{GHz}. $$

O envelope complexo ocupa $[-B/2,B/2]$; como suas amostras são complexas, a taxa mínima é

$$ F_{s,\rm bb}\ge B=1\ \text{MHz}. $$
$$ \boxed{\text{Razão}=\frac{2(f_c+B/2)}{B}=2001.} $$

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°$:

$$ s_I = 5\cos(60°) = 5(0{,}5) = 2{,}5,\qquad s_Q = 5\sin(60°) = 5(0{,}8660) \approx4{,}33 $$
$$ \boxed{s_I=2{,}5,\quad s_Q\approx4{,}33} $$

Verificação: $\sqrt{s_I^2+s_Q^2}=\sqrt{6{,}25+18{,}75}=\sqrt{25}=5=A$ ✓.


2. Introdução a Sistemas de Comunicações

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:

$$ \begin{aligned} &\underbrace{\text{Fonte}}_{\text{mensagem}} \to \underbrace{\text{Codif. fonte}}_{\text{compressão}} \to \underbrace{\text{Codif. canal}}_{\text{correção de erros}} \to \underbrace{\text{Modulador}}_{\text{adapta ao canal}} \\ &\qquad\longrightarrow \boxed{\text{Canal} + \text{ruído} + \text{interferência}} \longrightarrow \underbrace{\text{Demodulador}} \to \underbrace{\text{Decodif. canal}} \to \underbrace{\text{Decodif. fonte}} \to \underbrace{\text{Destino}} \end{aligned} $$

2.2.1 Entropia de Shannon

A entropia mede a incerteza de uma fonte:

$$ \boxed{H(X) = -\sum_{i=1}^{M} p_i\log_2 p_i} $$

Propriedades: $H \ge 0$; $H_{\max} = \log_2 M$ (distribuição uniforme); $H$ contínua em $p_i$.

$$ 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.

2.2.2 Codificação de fonte

PCM (Pulse Code Modulation): Amostragem $\to$ Quantização $\to$ Codificação binária. Para $n$ bits: $R_b = f_s \cdot n$.

DPCM (Differential PCM): Codifica a diferença entre amostra real e prevista — menor variância = menos bits.

Huffman: $\bar{L} = \sum p_i \ell_i \ge H(X)$, com $\bar{L} < H(X)+1$.

2.2.3 Codificação de canal

Código bloqueio $(n,k)$: Mapeia $k$ bits $\to$ $n$ bits. Taxa $R = k/n$.

Distância mínima e capacidade de correção:

$$ \boxed{t_{\text{corr}} = \left\lfloor\frac{d_{\min}-1}{2}\right\rfloor} $$
$$ 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} $$

Síndrome: $\vec{s} = H\vec{c}^T$.

2.2.4 Modulador e demodulador

$$ s(t) = I(t)\cos(2\pi f_c t) - Q(t)\sin(2\pi f_c t) $$

2.2.5 Canal físico

AWGN: $h(t) = a\,\delta(t-\tau)$, ruído gaussiano branco PSD $N_0/2$.

$$ \boxed{r(t) = s(t)*h(t) + n(t) + i(t)} $$

Modelos: AWGN, fading (Rayleigh, Rician, Nakagami), interferência.

PYTHON
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
fs, T, fc, snr_dB = 1000, 1.0, 50, 10
t = np.linspace(0, T, int(fs*T), endpoint=False)
s = np.cos(2*np.pi*fc*t)
Ps = np.mean(s**2)
sigma = np.sqrt(Ps / 10**(snr_dB/10))
n = np.random.normal(0, sigma, len(t))
r = s + n

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(t, s, alpha=0.7, label='$s(t)$', color='#2563eb')
ax.plot(t, r, alpha=0.5, label='$r(t)$', color='#dc2626')
ax.set_xlabel('Tempo (s)'); ax.set_ylabel('Amplitude')
ax.set_title(f'Canal AWGN (SNR = {snr_dB} dB, $\\sigma={sigma:.4f}$)')
ax.legend(); ax.grid(alpha=0.3)
plt.tight_layout()
print(f"Ps={Ps:.4f}, Pn={Ps/10**(snr_dB/10):.6f}, sigma={sigma:.4f}")
Output:
Ps=0.5000, Pn=0.050000, sigma=0.2236
Figura

2.3 Recursos e Métricas Fundamentais

2.3.1 Taxa de símbolo e bits

$$ R_s = \frac{1}{T_s},\qquad \boxed{R_b = k R_s,\quad k = \log_2 M} $$
Mod. $M$ $k$ $R_b/R_s$
BPSK 2 1 1
QPSK 4 2 2
16-QAM 16 4 4
64-QAM 64 6 6

2.3.2 Eficiência espectral

$$ \boxed{\eta = \frac{R_b}{B}\ \text{bit/s/Hz}} $$

Com raised-cosine $\alpha$: $B = (1+\alpha)R_s \Rightarrow \eta_{\max} = \dfrac{\log_2 M}{1+\alpha}$.

2.3.3 $E_b/N_0$ universal

$$ P_s = E_b R_b,\quad P_n = N_0 B \Rightarrow \boxed{\frac{E_b}{N_0} = \frac{\text{SNR}}{\eta} = \text{SNR}\cdot\frac{B}{R_b}} $$

2.3.4 Teorema de Nyquist-Shannon

$$ \boxed{f_s \ge 2B} $$

Reconstrução por interpolador sinc: $x(t) = \sum x(nT_s)\operatorname{sinc}\!\left(\frac{t-nT_s}{T_s}\right)$.

2.3.5 SNR de quantização PCM

$$ \Delta = \frac{V_{pp}}{2^n},\quad P_q = \frac{\Delta^2}{12},\quad P_s = \frac{V_{pp}^2}{8} $$
$$ \boxed{\text{SNR}_q \approx 6{,}02n + 1{,}76\;\text{dB}} $$

Cada bit $\approx$ 6 dB.

PYTHON
import numpy as np
import matplotlib.pyplot as plt

n_vals = np.arange(1, 17)
snr_dB = 6.02*n_vals + 1.76

fig, 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)")
for n in [8, 12, 14, 16]:
    print(f"{n} | {6.02*n+1.76:.2f}")
Output:
n | SNR_q (dB)
8 | 49.92
12 | 74.00
14 | 86.04
16 | 98.08
Figura

2.4 Decibéis e Orçamento de Enlace — Deduções Completas

2.4.1 Conversão dB, dBm, dBW

$$ G_{\text{dB}} = 10\log_{10}\!\left(\frac{P_2}{P_1}\right),\quad G_{\text{dB}} = 20\log_{10}\!\left(\frac{A_2}{A_1}\right)\ \text{(amplitude)} $$
$$ P_{\text{dBm}} = 10\log_{10}\!\left(\frac{P}{1\,\text{mW}}\right),\quad \boxed{P_{\text{dBm}} = P_{\text{dBW}} + 30} $$

Exemplos: $2\,\text{W} = 33{,}01\,\text{dBm}$; $43\,\text{dBm} = 19{,}95\,\text{W}$; $-85\,\text{dBm} = 3{,}162\,\text{pW}$.

2.4.2 Friis — Dedução completa

Passo 1: Densidade de potência isotrópica: $S = P_t/(4\pi d^2)$.

Passo 2: Com ganho: $S = P_t G_t/(4\pi d^2)$.

Passo 3: Potência recebida: $P_r = S\cdot A_{e,r}$.

Passo 4: Relação ganho-área:

$$ \boxed{G = \frac{4\pi}{\lambda^2}A_e} $$

Passo 5: Friis:

$$ \boxed{P_r = P_t G_t G_r\left(\frac{\lambda}{4\pi d}\right)^2} $$

Forma em dB:

$$ P_r[\text{dBm}] = P_t[\text{dBm}] + G_t + G_r - L_{fs} $$
$$ L_{fs} = 32{,}45 + 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{MHz}}) $$

2.4.3 Orçamento de enlace geral

$$ \boxed{P_r[\text{dBm}]=\text{EIRP}+G_r-L_{fs}-L_{\text{outros}}} $$
$$ \boxed{M_{\text{disp}}=P_r-P_{\text{sens}},\qquad M_{\text{res}}=M_{\text{disp}}-M_{\text{req}}} $$

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|$.

2.4.4 Exemplo numérico

$f=2{,}4\,\text{GHz}$, $d=10\,\text{km}$, $P_t=20\,\text{dBm}$, $G_t=G_r=15\,\text{dBi}$, perdas totais $3\,\text{dB}$ e margem requerida $10\,\text{dB}$. Suponha $P_{\text{sens}}=-100\,\text{dBm}$.

$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 np
import matplotlib.pyplot as plt

c, f = 3e8, 2.4e9
wavelength = c/f
Pt, Gt, Gr, Lc, margin, Psens = 20, 15, 15, 3, 10, -100

dist_km = np.logspace(-1, 3, 500)
dist_m = dist_km * 1e3
Lfs = 20*np.log10(4*np.pi*dist_m/wavelength)
Pr = Pt + Gt + Gr - Lfs - Lc
margin_available = Pr - Psens
margin_residual = margin_available - margin

fig, 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
Figura

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):

$$ S_V(f) = 4k_BTR \Rightarrow \boxed{V_n^2 = 4k_BTRB} $$

Potência disponível: $P_{\text{disponível}} = \dfrac{V_n^2}{4R} = k_BTB$ (não depende de $R$).

$$ \boxed{N_0 = k_B T} $$

A $T_0 = 290\,\text{K}$: $N_0 = 4{,}004\times10^{-21}\,\text{W/Hz}$, $N_0[\text{dBm/Hz}] = -174\,\text{dBm/Hz}$.

$$ \boxed{N_0|_{290\text{K}} = -174\;\text{dBm/Hz}} $$

2.5.2 Figura de ruído

$$ \boxed{F = \frac{\text{SNR}_{\text{in}}}{\text{SNR}_{\text{out}}}} \ge 1,\quad \boxed{NF = 10\log_{10}F} $$

Temperatura equivalente: $\boxed{T_e = T_0(F-1)}$. LNA com $NF=1\,\text{dB} \Rightarrow T_e = 75{,}1\,\text{K}$.

2.5.3 Cascata — Dedução Friis para ruído

Passo 1: $N_{\text{in}} = k_B T_0 B$. Passo 2: $\text{SNR}_{\text{in}} = S_{\text{in}}/(k_B T_0 B)$.

Passo 3: Ruído próprio estágio 1: $N_{a1} = k_B T_0 B(F_1-1)$.

Passo 4: Saída estágio 1: $N_1 = k_B T_0 B\,G_1 F_1$.

Passo 5: Estágio 2: $N_2 = G_2 N_1 + k_B T_0 B(F_2-1)$.

Passo 6–7: Generalizando:

$$ \boxed{F_{\text{tot}} = F_1 + \frac{F_2-1}{G_1} + \frac{F_3-1}{G_1G_2} + \cdots + \frac{F_n-1}{G_1G_2\cdots G_{n-1}}} $$

2.5.4 Sensibilidade do receptor

$$ \boxed{P_{\text{sens}}[\text{dBm}] = -174 + 10\log_{10}B + NF + \text{SNR}_{\text{req}}[\text{dB}]} $$

Exemplo: $B=1\,\text{MHz}$, $NF=5\,\text{dB}$, $\text{SNR}_{\text{req}}=10\,\text{dB} \Rightarrow P_{\text{sens}} = -99\,\text{dBm}$.

2.5.5 SNR em modulações analógicas

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,

$$ \boxed{\text{SNR}_{\text{out}}=\frac32\beta^2(C/N)_W},\qquad B_{\text{FM}}\approx2W(1+\beta). $$

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 np
import matplotlib.pyplot as plt

# Cascata de ruído
fig, 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]
for i in range(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.6
ax.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)
for i, nf in enumerate(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)")
for i in range(5):
    print(f"{stages[i]:7s} | {NF_dB[i]:6.1f} | {G_dB[i]:6.1f} | {NF_cum[i]:11.1f}")
Output:
Estágio | NF(dB) | G(dB) | NF_acum(dB)
LNA     |    1.0 |   12.0 |         1.0
Mixer   |    7.0 |   -3.0 |         1.8
RF Amp  |    8.0 |    5.0 |         3.4
IF Amp  |    5.0 |   10.0 |         3.6
Demod.  |   10.0 |    0.0 |         3.6
Figura

2.6 Capacidade de Shannon — Derivação Detalhada

2.6.1 Teorema de Shannon-Hartley

$$ \boxed{C = B\log_2\!\left(1+\frac{P}{N_0B}\right) = B\log_2(1+\text{SNR})\ \text{bit/s}} $$

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) $$

2.6.2 Relação com $E_b/N_0$

Substituindo $\text{SNR} = \frac{E_b}{N_0}\cdot\frac{R_b}{B} = \eta\frac{E_b}{N_0}$:

$$ \boxed{\eta < \log_2\!\left(1+\eta\frac{E_b}{N_0}\right)},\quad \boxed{\frac{E_b}{N_0} > \frac{2^{\eta}-1}{\eta}} $$

2.6.3 Limite fundamental: $E_b/N_0 \ge \ln 2 = -1{,}59\,\text{dB}$

L'Hôpital: $\lim_{\eta\to0}\dfrac{2^{\eta}-1}{\eta} = \ln 2 \approx 0{,}6931$.

Via $B\to\infty$: $C \to \dfrac{P}{N_0\ln 2} \Rightarrow E_b \to N_0\ln 2$.

$$ \boxed{\left(\frac{E_b}{N_0}\right)_{\min} = \ln 2 = -1{,}59\,\text{dB}} $$

2.6.4 Trade-off banda/energia

$$ \boxed{\left(\frac{E_b}{N_0}\right)_{\text{Shannon}} = \frac{2^{\eta}-1}{\eta}} $$

$\eta=1\to0\,\text{dB}$, $\eta=3\to3{,}68\,\text{dB}$, $\eta=6\to10{,}21\,\text{dB}$.

2.6.5 Códigos de correção de erro

Código Gap (dB) Ano
Hamming (7,4) $\approx7$ 1950
Convolucional $\approx2$ 1967
Turbo $\approx0{,}5$ 1993
LDPC $\approx0{,}01$ 2000s

2.6.6 Gráfico $E_b/N_0$ vs $\eta$

PYTHON
import numpy as np
import matplotlib.pyplot as plt

eta = 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()
Figura

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

2.7.1 AM

$$ s_{\text{AM}}(t) = A_c[1+\mu\,m(t)]\cos(2\pi f_c t),\quad P_T = P_c\!\left(1+\frac{\mu^2}{2}\right),\quad B_{\text{AM}} = 2f_m $$

$P_c$ não carrega informação (desperdício). $\text{SNR}_{\text{out}} \le \text{SNR}_{\text{in}}$. Sem ganho de processamento.

2.7.2 FM

$$ s_{\text{FM}}(t) = A_c\cos\!\left(2\pi f_c t + 2\pi k_f\!\int_0^t m(\tau)\,d\tau\right) $$
$$ B_{\text{FM}}\approx2f_m(1+\beta),\quad \boxed{\text{SNR}_{\text{out}}^{\text{FM}}=\frac32\beta^2(C/N)_{f_m}} $$

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

  1. Regeneração — sem acúmulo de ruído
  2. Criptografia — dados nativamente cifráveis
  3. Multiplexação — TDM natural
  4. Correção de erros — BER arbitrariamente baixo
  5. Flexibilidade — mesma infraestrutura para voz/dados/vídeo

2.7.5 Desvantagens digitais

  1. Banda — geralmente maior
  2. Complexidade — A/D, codificação, sincronismo
  3. Latência — codificação/decodificação
  4. 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 np
import matplotlib.pyplot as plt

c, f = 3e8, 5.8e9
wavelength = c/f
EIRP = 30 + 12 - 1  # Pt=30 dBm, Gt=12 dBi, Lcable=1 dB
Gr, Lcr, NF = 20, 1, 3
Psens = -174 + 10*np.log10(1e6) + NF + 10  # B=1 MHz, SNR_req=10 dB

dist_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']
for i, mf in enumerate(margins):
    Pr = EIRP + Gr - Lfs - Lcr - mf
    ax = 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)")
for mf in margins:
    Pr_tmp = EIRP + Gr - Lfs - Lcr - mf
    mask = Pr_tmp > Psens
    print(f"  {mf:2d} dB   |  {dist_km[mask][-1]:7.1f} km" if np.any(mask) else f"  {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
Figura

2.8.3 Exercício 2: SNR de quantização PCM — Teórico vs. Simulado

PYTHON
import numpy as np
import matplotlib.pyplot as plt

n_theo = np.arange(2, 17)
snr_theo = 6.02*n_theo + 1.76

np.random.seed(42)
n_sim = [4, 6, 8, 10, 12, 14]
snr_sim = []
for nb in n_sim:
    sig = np.random.uniform(-0.5, 0.5, 10**6)
    step = 1.0 / (2**nb)
    quant = np.round(sig / step) * step
    err = sig - quant
    snr_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)
for ni, si in zip(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()
Figura

2.8.4 Exercício 3: Cascata de ruído — LNA/mixer/RF amp

PYTHON
import numpy as np
import matplotlib.pyplot as plt

stages = ['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 dB
G = np.array([15.85, 0.5, 3.162, 10.0, 1.0])         # 12,-3,5,10,0 dB

F_cum = np.zeros(5)
F_cum[0] = F[0]
for i in range(1, 5):
    F_cum[i] = F_cum[i-1] + (F[i]-1)/np.prod(G[:i])

NF_cum = 10*np.log10(F_cum)
B = 1e6
Psens = -174 + 10*np.log10(B) + NF_cum[-1] + 10

fig, 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()
for i, nf in enumerate(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
Figura

2.8.5 Exercício 4: Capacidade de Shannon vs. Eb/N0

PYTHON
import numpy as np
import matplotlib.pyplot as plt

eta = np.linspace(0.01, 10, 500)
EbN0_Shannon = (2**eta - 1) / eta
EbN0_Shannon_dB = 10*np.log10(EbN0_Shannon)

# BER para BPSK, QPSK, 16-QAM (aproximações)
from scipy.stats import norm
EbN0_linear_BPSK = np.linspace(0.01, 20, 500)
EbN0_dB_BPSK = 10*np.log10(EbN0_linear_BPSK)
from scipy.special import erf
BER_BPSK = 0.5 * (1 - erf(np.sqrt(EbN0_linear_BPSK)))

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Esquerda: Eb/N0 vs eta
axes[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 BPSK
axes[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 BPSK
idx_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
Figura

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}$.

E2. $f=6\,\text{GHz}$, $d=40\,\text{km}$:

$$ L_{fs} = 32{,}45 + 20\log_{10}(40) + 20\log_{10}(6000) = 32{,}45 + 32{,}04 + 75{,}56 = 140{,}05\,\text{dB} $$

$\text{EIRP} = 23 + 32 - 2{,}5 = 52{,}5\,\text{dBm}$.

$$ P_r=52{,}5+32-140{,}05-2{,}5=-58{,}05\,\text{dBm}. $$

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$.

E4. Dados: $d_1=1,d_2=0,d_3=1,d_4=1$. Paridades (Hamming (7,4)):

$p_1 = d_1\oplus d_2\oplus d_4 = 1\oplus0\oplus1 = 0$
$p_2 = d_1\oplus d_3\oplus d_4 = 1\oplus1\oplus1 = 1$
$p_3 = d_2\oplus d_3\oplus d_4 = 0\oplus1\oplus1 = 0$

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$.

$$ F_{\text{tot}} = 1{,}413 + \frac{6{,}310-1}{100} + \frac{2{,}512-1}{100\cdot0{,}316} = 1{,}413 + 0{,}0531 + 0{,}0795 = 1{,}546 $$

$NF_{\text{tot}} = 10\log_{10}(1{,}546) = 1{,}89\,\text{dB}$.

$T_e = 290(1{,}546-1) = 158{,}3\,\text{K}$.

E6. Via L'Hôpital: $\lim_{\eta\to0}\dfrac{2^{\eta}-1}{\eta} = \ln 2$. Via $B\to\infty$: $C = B\ln\!\left(1+\frac{P}{N_0B}\right) \approx B\cdot\dfrac{P}{N_0B}\cdot\dfrac{1}{\ln 2} \to \dfrac{P}{N_0\ln 2}$. Logo $E_b = P/C \to N_0\ln 2$, $E_b/N_0 \to \ln 2$.

E7. $\beta = 50/5 = 10$. $B_{\text{FM}} = 2\cdot5(1+10) = 110\,\text{kHz}$.

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.

E9. $C = 10^7\log_2(1+1000) = 10^7\log_2(1001) \approx 99{,}7\,\text{Mbit/s}$.

$\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.

E11. $6{,}02n+1{,}76 \ge 42 \Rightarrow n \ge 6{,}69 \Rightarrow n=7$ bits. $R_b = 8000\times7 = 56\,\text{kbit/s}$. $B_{\min} = 28\,\text{kHz}$ (Nyquist).

E12. Huffman: $\{0{,}40\to0,\; 0{,}25\to10,\; 0{,}15\to110,\; 0{,}10\to1110,\; 0{,}05\to1111\}$.

$\bar{L} = 0{,}40(1)+0{,}25(2)+0{,}15(3)+0{,}10(4)+0{,}05(4) = 0{,}40+0{,}50+0{,}45+0{,}40+0{,}20 = 1{,}95$ bits/símbolo.

$H = -\sum p_i\log_2 p_i = 0{,}40(1{,}322)+0{,}25(2)+0{,}15(2{,}737)+0{,}10(3{,}322)+0{,}05(4{,}322) = 0{,}529+0{,}500+0{,}411+0{,}332+0{,}216 = 1{,}988$ bits/símbolo.

$\bar{L} = 1{,}95 < 1{,}988+1 = 2{,}988$. Verificado.

3. Modulação em Amplitude — Teoria Completa

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:

  1. 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.

  2. 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.

  3. 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):

$$ \boxed{\tilde{s}_L(t) = \tilde{s}(t)\,e^{-j2\pi f_c t}} $$

Recupera-se $s(t)$ por:

$$ \boxed{s(t) = \Re\{\tilde{s}_L(t)\,e^{j2\pi f_c t}\}} $$

3.2.3 Representação quadratura (I/Q)

Escrevendo $\tilde{s}_L(t) = I(t) + j\,Q(t)$:

$$ \boxed{s(t) = I(t)\cos(2\pi f_c t) - Q(t)\sin(2\pi f_c t)} $$

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:

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:

$$ \boxed{s_{\text{DSB-SC}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)} $$

onde:

3.3.2 Dedução completa do espectro

Aplicamos a transformada de Fourier a $s_{\text{DSB-SC}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)$. Usamos a propriedade da multiplicação:

$$ \mathcal{F}\{x(t)\,y(t)\} = X(f) * Y(f) $$

Sabemos que $\cos(2\pi f_c t) \;\xrightarrow{\mathcal{F}}\; \dfrac{1}{2}\bigl[\delta(f-f_c)+\delta(f+f_c)\bigr]$. Logo:

$$ S_{\text{DSB-SC}}(f) = A_c\,M(f) * \frac{1}{2}\bigl[\delta(f-f_c)+\delta(f+f_c)\bigr] $$
$$ \boxed{S_{\text{DSB-SC}}(f) = \frac{A_c}{2}\Bigl[M(f-f_c) + M(f+f_c)\Bigr]} $$

Largura de banda: a banda ocupada em cada lado é $W$, mas a banda total (do mínimo ao máximo frequência positiva) é:

$$ \boxed{B_{\text{DSB-SC}} = 2W} $$

3.3.3 Potência do sinal DSB-SC

A potência média de um sinal real $s(t)$ com carga de referência $1\,\Omega$ é:

$$ P_s = \lim_{T\to\infty}\frac{1}{T}\int_{-T/2}^{T/2}|s(t)|^2\,dt = \langle s^2(t)\rangle $$

Para $s_{\text{DSB-SC}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)$:

$$ s^2(t) = A_c^2\,m^2(t)\,\cos^2(2\pi f_c t) = A_c^2\,m^2(t)\cdot\frac{1+\cos(4\pi f_c t)}{2} $$
$$ P_s = \frac{A_c^2}{2}\,\langle m^2(t)\rangle + \frac{A_c^2}{2}\,\bigl\langle m^2(t)\,\cos(4\pi f_c t)\bigr\rangle $$

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)$:

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$:

Invertendo:

$$ \boxed{\hat{s}_{\text{DSB-SC}}(t) = A_c\,m(t)\,\sin(2\pi f_c t)} $$

Sinal analítico: $\tilde{s}(t) = A_c\,m(t)\,e^{j2\pi f_c t}$, envelope complexo $\tilde{s}_L(t) = A_c\,m(t)$ — confirmando Seção “Representação no plano I/Q”.

3.3.6 Exemplo numérico

$$ s_{\text{DSB-SC}}(t) = \cos(2\pi\cdot 10^3\,t)\,\cos(2\pi\cdot 10^5\,t) $$

Usando a identidade trigonométrica $\cos A\cos B = \tfrac{1}{2}[\cos(A-B)+\cos(A+B)]$:

$$ s_{\text{DSB-SC}}(t) = \frac{1}{2}\cos(2\pi\cdot 99\,000\,t) + \frac{1}{2}\cos(2\pi\cdot 101\,000\,t) $$

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:

$$ \boxed{r(t) = 2\,s_{\text{DSB-SC}}(t)\,\cos(2\pi f_c t)} $$

O fator $2$ é introduzido para simplificar a recuperação (compensar o fator $1/2$ da multiplicação trigonométrica).

3.4.2 Dedução completa da recuperação

Desenvolvendo:

$$ r(t) = 2\,A_c\,m(t)\,\cos(2\pi f_c t)\,\cos(2\pi f_c t) = 2\,A_c\,m(t)\,\cos^2(2\pi f_c t) $$

Usando $\cos^2\theta = \frac{1}{2}\bigl[1+\cos(2\theta)\bigr]$:

$$ r(t) = 2\,A_c\,m(t)\cdot\frac{1+\cos(4\pi f_c t)}{2} = A_c\,m(t) + A_c\,m(t)\,\cos(4\pi f_c t) $$

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) $$

Usando $2\cos A\cos B = \cos(A-B) + \cos(A+B)$:

$$ r_\phi(t) = A_c\,m(t)\bigl[\cos(-\phi) + \cos(4\pi f_c t + \phi)\bigr] $$
$$ r_\phi(t) = A_c\,m(t)\,\cos\phi + A_c\,m(t)\,\cos(4\pi f_c t + \phi) $$

Após o filtro passa-baixas:

$$ \boxed{y_\phi(t) = A_c\,m(t)\,\cos\phi} $$

Análise de perda:

A perda de potência devido ao erro de fase é:

$$ \boxed{P_{\text{loss}} = 1 - \cos^2\phi = \sin^2\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$:

$$ r_{\Delta f}(t) = 2\,A_c\,m(t)\,\cos(2\pi f_c t)\,\cos\bigl(2\pi(f_c+\Delta f)t\bigr) $$
$$ = A_c\,m(t)\Bigl[\cos\bigl(2\pi\Delta f\,t\bigr) + \cos\bigl(2\pi(2f_c+\Delta f)t\bigr)\Bigr] $$

Após o filtro passa-baixas:

$$ \boxed{y_{\Delta f}(t) = A_c\,m(t)\,\cos(2\pi\Delta f\,t)} $$

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.

3.4.5 Prova da perda de potência por erro de fase

$$ P_y = \langle y_\phi^2(t)\rangle = \langle A_c^2\,m^2(t)\,\cos^2\phi\rangle = A_c^2\,\cos^2\phi\,\langle m^2(t)\rangle = A_c^2\,\cos^2\phi\,P_m $$

Sem erro de fase ($\phi = 0$):

$$ P_{y,0} = A_c^2\,P_m $$

A fração de potência mantida é:

$$ \frac{P_y}{P_{y,0}} = \cos^2\phi $$

A fração de potência perdida é:

$$ \boxed{P_{\text{loss}} = 1 - \cos^2\phi = \sin^2\phi} $$

$\blacksquare$

3.5 Geração de Portadora Sincronizada

3.5.1 O problema fundamental

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:

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:

$$ \boxed{s_{\text{pilot}}(t) = A_c\,m(t)\,\cos(2\pi f_c t) + A_p\,\cos(2\pi f_c t + \theta_p)} $$

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 é:

$$ \frac{P_p}{P_s} = \frac{A_p^2}{A_c^2 P_m} $$

Para $A_p = 0{,}05\,A_c$ e $P_m = 1/2$:

$$ \frac{P_p}{P_s} = \frac{0{,}0025\,A_c^2}{0{,}5\,A_c^2} = 0{,}5\% $$

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:

Desvantagens:

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:

        e(t) ──► [Filtro LP] ──► v_ctrl(t) ──► [VCO] ──► φ(t)
         ▲                                              │
         │                                              │
         └────────────── [Detector de Fase] ◄───────────┘
  1. Detector de fase (PD): gera um sinal $e(t)$ proporcional ao erro de fase $\phi_e$ entre o sinal de entrada e o VCO.
  2. Filtro de loop: filtra $e(t)$ para remover componentes de alta frequência e determinar a estabilidade do PLL.
  3. VCO (Voltage-Controlled Oscillator): gera $\cos(\omega_c t + \phi(t))$, onde a frequência instantânea é controlada por $v_{\text{ctrl}}(t)$.

3.5.3.2 Modelagem matemática

Seja $\theta_{\text{in}}(t)$ a fase do sinal de entrada e $\theta_{\text{VCO}}(t)$ a fase do VCO. O erro de fase é:

$$ \boxed{\phi_e(t) = \theta_{\text{in}}(t) - \theta_{\text{VCO}}(t)} $$

O detector de fase (multiplicador) produz:

$$ \boxed{e(t) = K_d \cdot \sin\bigl(\phi_e(t)\bigr)} $$

onde $K_d$ é o ganho do detector de fase (V/rad).

O VCO tem a seguinte relação entre controle e fase:

$$ \boxed{\frac{d\theta_{\text{VCO}}(t)}{dt} = \omega_c + K_o \cdot v_{\text{ctrl}}(t)} $$

onde $K_o$ é o ganho do VCO (rad/s/V).

O filtro de loop $F(s)$ no domínio $s$ (Laplace) relaciona $V_{\text{ctrl}}(s)$ com $E(s)$:

$$ \boxed{V_{\text{ctrl}}(s) = F(s) \cdot E(s)} $$

3.5.3.3 Função de transferência de malha fechada

No domínio $s$, a equação do PLL é:

$$ \Phi_e(s) = \Theta_{\text{in}}(s) - \Theta_{\text{VCO}}(s) = \Theta_{\text{in}}(s) - \frac{K_o V_{\text{ctrl}}(s)}{s} $$

Substituindo $V_{\text{ctrl}}(s) = F(s)\,K_d\,\Phi_e(s)$:

$$ \Phi_e(s) = \Theta_{\text{in}}(s) - \frac{K_o K_d F(s)}{s}\,\Phi_e(s) $$
$$ \boxed{\Phi_e(s) = \frac{\Theta_{\text{in}}(s)}{1 + \dfrac{K_o K_d F(s)}{s}}} $$

A função de transferência de malha fechada para o erro de fase é:

$$ \boxed{H_e(s) = \frac{\Phi_e(s)}{\Theta_{\text{in}}(s)} = \frac{s}{s + K_o K_d F(s)}} $$

A função de transferência de rastreamento (saída → entrada) é:

$$ \boxed{H(s) = 1 - H_e(s) = \frac{K_o K_d F(s)}{s + K_o K_d F(s)}} $$

3.5.3.4 PLL de primeira ordem

Para um PLL com filtro direto ($F(s) = 1$, ganho de malha $K = K_o K_d$):

$$ \boxed{H(s) = \frac{K}{s + K}, \qquad H_e(s) = \frac{s}{s + K}} $$

A constante de tempo de rastreamento é $\tau = 1/K$. A largura de banda de malha é:

$$ \boxed{B_L = \frac{K}{4}\;\text{Hz} = \frac{K_o K_d}{4}\;\text{Hz}} $$

3.5.3.5 PLL de segunda ordem (filtro proporcional-integral)

O filtro mais comum é o proporcional-integral (PI), também chamado de filtro de propagação lenta (proportional-plus-integral):

$$ F(s) = \frac{1 + s\tau_2}{s\tau_1} $$

Com $\tau_1$ e $\tau_2$ selecionados para obter um amortecimento desejado. A função de transferência se torna:

$$ \boxed{H(s) = \frac{K(1+s\tau_2)/s\tau_1}{s + K(1+s\tau_2)/s\tau_1} = \frac{sK\tau_2 + K}{s^2\tau_1 + sK\tau_2 + K}} $$

Definindo a frequência natural de malha e o coeficiente de amortecimento:

$$ \boxed{\omega_n = \sqrt{\frac{K}{\tau_1}}, \qquad \zeta = \frac{\tau_2}{2}\sqrt{\frac{K}{\tau_1}} = \frac{\tau_2\,\omega_n}{2}} $$

A função de transferência assume a forma padrão de segundo ordem:

$$ \boxed{H(s) = \frac{2\zeta\omega_n\,s + \omega_n^2}{s^2 + 2\zeta\omega_n\,s + \omega_n^2}} $$

Para $\zeta = 1/\sqrt{2} \approx 0{,}707$ (resposta de Butterworth, sem overshoot excessivo):

$$ \boxed{\tau_2 = \sqrt{2}\,\frac{1}{\omega_n}, \qquad \tau_1 = \frac{2}{\omega_n^2}} $$

3.5.3.6 Condições de lock, capture e tracking

Para PLL de segunda ordem, a largura de banda de capture é aproximadamente:

$$ \boxed{B_{\text{capture}} \approx \frac{\omega_n}{2\pi}\,\sqrt{2\zeta}} $$

3.5.4 Método 3 — Costas Loop

3.5.4.1 Topologia do Costas Loop

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:

                s_in(t) ──►┬──► [×2] ──► [LPF] ──► y_I(t)
                           │        ↑
                           │     VCO: cos(ωct + φ)
                           │
                           ├─► [×2] ──► [LPF] ──► y_Q(t)
                           │        ↑
                           │     VCO: -sin(ωct + φ)
                           │
                     [×2]  │
                       ↑   │
                    y_I·y_Q ──► [Filtro de Loop] ──► v_ctrl ──► VCO

O Costas Loop possui quatro multiplicadores (ou dois, se reutilizar o VCO):

  1. Multiplicador I: $s_{\text{in}}(t) \times 2\cos(\omega_c t + \hat{\phi})$
  2. Multiplicador Q: $s_{\text{in}}(t) \times 2\sin(\omega_c t + \hat{\phi})$ (com sinal negativo)
  3. Multiplicador de erro: $y_I(t) \times y_Q(t)$ → sinal de erro $v_e(t)$

3.5.4.2 Dedução do sinal de erro

Seja o sinal recebido:

$$ s_{\text{in}}(t) = A_c\,m(t)\,\cos(2\pi f_c t) $$

O VCO gera $\cos(2\pi f_c t + \hat{\phi})$ e $-\sin(2\pi f_c t + \hat{\phi})$. A ramificação I após o LPF:

$$ y_I(t) = A_c\,m(t)\,\cos(\phi_e(t)) $$

onde $\phi_e(t) = \phi - \hat{\phi}$ é o erro de fase (assumindo $f_c$ sincronizado).

A ramificação Q após o LPF:

$$ y_Q(t) = -A_c\,m(t)\,\sin(\phi_e(t)) $$

O sinal de erro do Costas Loop é o produto:

$$ \boxed{v_e(t) = y_I(t) \cdot y_Q(t) = -A_c^2\,m^2(t)\,\cos(\phi_e(t))\,\sin(\phi_e(t))} $$

Usando $\sin(2x) = 2\sin x\cos x$:

$$ \boxed{v_e(t) = -\frac{A_c^2}{2}\,m^2(t)\,\sin\bigl(2\phi_e(t)\bigr)} $$

Em média, sobre as variações de $m(t)$ (assumindo $\langle m^2(t) \rangle = P_m$):

$$ \boxed{\langle v_e \rangle = -\frac{A_c^2 P_m}{2}\,\sin(2\phi_e)} $$

3.5.4.3 Análise do potencial de fase (phase potential)

O sinal de erro $\langle v_e \rangle(\phi_e)$ tem a forma de $-\sin(2\phi_e)$, que pode ser derivada de um potencial de fase:

$$ \Psi(\phi_e) = \frac{A_c^2 P_m}{4}\,\cos(2\phi_e) $$
$$ \langle v_e \rangle = -\frac{d\Psi}{d\phi_e} $$

Os pontos de equilíbrio ocorrem quando $\langle v_e \rangle = 0$, isto é:

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:

$$ K_{d,\text{Costas}} = A_c^2 P_m \cdot \cos(2\phi_e) \approx A_c^2 P_m \quad\text{(para $\phi_e$ pequeno)} $$

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:

$$ \boxed{\sigma_\phi^2 \approx \frac{B_L}{2\,\text{SNR}_{\text{in}}}} $$

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:

3.5.4.6 Cycle 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 é:

$$ \boxed{P_{\text{slip}} \approx \frac{2B_L}{\sqrt{3\,\text{SNR}_{\text{in}}}}\,\exp\!\left(-\frac{3\,\text{SNR}_{\text{in}}}{4}\right)} $$

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

  1. 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°.
  2. Limiar de ruído: abaixo de ~7 dB, o Costas Loop perde lock. O squaring loop (Método 4) opera em ~3 dB.
  3. 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.

3.5.5 Método 4 — Squaring Loop (Fourth-Power Extractor)

3.5.5.1 Princípio

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:

$$ s_{\text{in}}^2(t) = A_c^2\,m^2(t)\,\cos^2(2\pi f_c t) = A_c^2\,m^2(t)\cdot\frac{1+\cos(4\pi f_c t)}{2} $$
$$ s_{\text{in}}^2(t) = \frac{A_c^2 m^2(t)}{2} + \frac{A_c^2 m^2(t)}{2}\,\cos(4\pi f_c t) $$

Um filtro passa-banda estreito centrado em $2f_c$ extrai o termo em $2f_c$:

$$ \boxed{v_{2f_c}(t) = \frac{A_c^2}{2}\,m^2(t)\,\cos(4\pi f_c t)} $$

Se $m(t)$ tiver uma componente DC (como em sinais digitais PSK, onde $m(t) = \pm 1$), então $m^2(t) = 1$ e:

$$ \boxed{v_{2f_c}(t) = \frac{A_c^2}{2}\,\cos(4\pi f_c t)} $$

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:

  1. Drift de temperatura: o VCO varia de frequência com a temperatura (~10–100 ppm). Requer recalibração periódica ou reference de cristal.
  2. Jitter de relógio: em sistemas digitais, o jitter do oscilador de relógio se acopla ao VCO e degrada a SNR.
  3. 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.
  4. 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.

Usando $\sin(2x) = 2\sin x\cos x$:

$$ \boxed{v_e(t) = -\frac{A_c^2}{2}\,m^2(t)\,\sin\bigl(2\phi_e(t)\bigr)} $$

Em média, sobre as variações de $m(t)$ (assumindo $\langle m^2(t) \rangle = P_m$):

$$ \boxed{\langle v_e \rangle = -\frac{A_c^2 P_m}{2}\,\sin(2\phi_e)} $$

3.5.7.1 Análise do potencial de fase (phase potential)

O sinal de erro $\langle v_e \rangle(\phi_e)$ tem a forma de $-\sin(2\phi_e)$, que pode ser derivada de um potencial de fase:

$$ \Psi(\phi_e) = \frac{A_c^2 P_m}{4}\,\cos(2\phi_e) $$
$$ \langle v_e \rangle = -\frac{d\Psi}{d\phi_e} $$

Os pontos de equilíbrio ocorrem quando $\langle v_e \rangle = 0$, isto é:

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:

$$ K_{d,\text{Costas}} = A_c^2 P_m \cdot \cos(2\phi_e) \approx A_c^2 P_m \quad\text{(para $\phi_e$ pequeno)} $$

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:

$$ \boxed{\sigma_\phi^2 \approx \frac{B_L}{2\,\text{SNR}_{\text{in}}}} $$

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:

3.5.7.4 Cycle 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:

$$ \boxed{s_{\text{AM}}(t) = A_c\bigl[1 + \mu\,m_n(t)\bigr]\,\cos(2\pi f_c t)} $$

onde:

O termo $1 + \mu\,m_n(t)$ deve ser sempre não-negativo para que o envelope seja não-negativo. Isso implica:

$$ \boxed{0 \leq \mu \leq 1 \qquad\text{(condição de modulação sem sobremodulação)}} $$

Quando $\mu > 1$, ocorre sobremodulação: $1 + \mu\,m_n(t)$ cruza zero, o envelope se inverte e o detector de envelope produz distorção severa.

3.6.2 Espectro da AM

Expandindo $s_{\text{AM}}(t)$:

$$ s_{\text{AM}}(t) = A_c\,\cos(2\pi f_c t) + \mu\,A_c\,m_n(t)\,\cos(2\pi f_c t) $$

O primeiro termo é a portadora pura; o segundo termo é um sinal DSB-SC modulando a portadora com amplitude $\mu A_c$.

Aplicando a transformada de Fourier:

$$ \boxed{S_{\text{AM}}(f) = \frac{A_c}{2}\bigl[\delta(f-f_c) + \delta(f+f_c)\bigr] + \frac{\mu A_c}{2}\bigl[M_n(f-f_c) + M_n(f+f_c)\bigr]} $$

O espectro AM contém três componentes:

  1. Portadora: duas deltas em $\pm f_c$, cada uma com peso $A_c/2$.
  2. BSL superior (USB): $M_n(f)$ copiada para $+f_c$, com peso $\mu A_c/2$.
  3. BSL inferior (LSB): $M_n(f)$ copiada para $-f_c$, com peso $\mu A_c/2$.

A banda total ocupada é $B_{\text{AM}} = 2W$ (mesma do DSB-SC).

3.6.3 Análise de potências

Considere carga de $1\,\Omega$. A potência de cada componente:

Portadora:

$$ P_c = \biggl\langle\bigl[A_c\,\cos(2\pi f_c t)\bigr]^2\biggr\rangle = \frac{A_c^2}{2} $$

Bandas laterais (DSB-SC com amplitude $\mu A_c$):

$$ P_{\text{SB}} = \frac{(\mu A_c)^2}{2}\,P_{m_n} = \frac{\mu^2 A_c^2}{2}\,P_{m_n} $$

onde $P_{m_n} = \langle m_n^2(t)\rangle$ é a potência do sinal normalizado. Para $m_n(t) = \cos(2\pi f_m t)$, $P_{m_n} = 1/2$.

Potência total:

$$ \boxed{P_T = P_c + P_{\text{SB}} = \frac{A_c^2}{2}\Bigl(1 + \mu^2\,P_{m_n}\Bigr)} $$

3.6.4 Eficiência de potência

A eficiência de potência é a fração da potência total que está nas bandas laterais (portando informação):

$$ \boxed{\eta_P = \frac{P_{\text{SB}}}{P_T} = \frac{\mu^2\,P_{m_n}}{1 + \mu^2\,P_{m_n}}} $$

Para o caso de tom único ($m_n(t) = \cos(2\pi f_m t)$), $P_{m_n} = 1/2$:

$$ \eta_P = \frac{\mu^2/2}{1+\mu^2/2} = \frac{\mu^2}{2+\mu^2} $$
$$ \boxed{\eta_{\max} = \frac{1^2}{2+1^2} = \frac{1}{3} \approx 33{,}3\%} $$

3.6.5 Análise de potências por componente (tom único)

Para $m_n(t) = \cos(2\pi f_m t)$, $\mu = 1$:

$$ s_{\text{AM}}(t) = A_c\bigl[1+\cos(2\pi f_m t)\bigr]\,\cos(2\pi f_c t) $$

Usando $\cos A\cos B = \tfrac{1}{2}[\cos(A-B)+\cos(A+B)]$:

$$ s_{\text{AM}}(t) = A_c\cos(2\pi f_c t) + \frac{A_c}{2}\cos\bigl(2\pi(f_c-f_m)t\bigr) + \frac{A_c}{2}\cos\bigl(2\pi(f_c+f_m)t\bigr) $$

Potências (carga $1\,\Omega$):

Total: $P_T = \dfrac{A_c^2}{2} + \dfrac{A_c^2}{8} + \dfrac{A_c^2}{8} = \dfrac{3A_c^2}{4}$

Eficiência: $\eta_P = \dfrac{A_c^2/4}{3A_c^2/4} = \dfrac{1}{3}$ — confirmado.

3.6.6 Sobremodulação: distorção e problemas

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:

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:

  1. Um diodo (retificador de meia onda ou onda completa);
  2. 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.

Condição combinada:

$$ \boxed{\frac{1}{2\pi f_c} \ll RC \ll \frac{1}{2\pi W}} $$

Esta janela de projeto é mais ampla quanto maior for a relação $f_c/W$ (quanto mais alta for a portadora em relação à largura de banda da mensagem).

3.7.3 Teorema da condição anti-diagonal clipping

$$ \boxed{RC \leq \frac{\sqrt{1-\mu^2}}{\mu\,\omega_m}} $$

onde $\omega_m = 2\pi f_m$.

$$ \frac{E}{|dE/dt|} = \frac{A_c(1-\mu^2)}{A_c\,\mu\,\omega_m\,\sqrt{1-\mu^2}} = \frac{\sqrt{1-\mu^2}}{\mu\,\omega_m} \quad\Rightarrow\quad RC \leq \frac{\sqrt{1-\mu^2}}{\mu\,\omega_m} $$

$\blacksquare$

3.7.4 Distorção por negative peak clipping

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:

$$ \boxed{\text{SNR}_{\text{out}} \approx \frac{\mu^2\,P_{m_n}}{1+\mu^2\,P_{m_n}}\cdot\text{SNR}_{\text{in}}} $$

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

Condição de RC:

$$ \frac{1}{2\pi\cdot 10^6} \ll RC \ll \frac{1}{2\pi\cdot 5\times 10^3} $$
$$ 1{,}59\times 10^{-7}\,\text{s} \ll RC \ll 3{,}18\times 10^{-5}\,\text{s} $$
$$ \boxed{0{,}16\,\mu\text{s} \ll RC \ll 31{,}8\,\mu\text{s}} $$

Condição anti-diagonal clipping ($\mu = 0{,}8$, $f_m = 5\,\text{kHz}$):

$$ RC \leq \frac{\sqrt{1-0{,}8^2}}{0{,}8\cdot 2\pi\cdot 5000} = \frac{0{,}6}{25133} \approx 23{,}9\,\mu\text{s} $$

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:

$$ \boxed{\hat{m}(t) = m(t) * \frac{1}{\pi t} = \frac{1}{\pi}\,\text{PV}\!\int_{-\infty}^{\infty}\frac{m(\tau)}{t-\tau}\,d\tau} $$

No domínio da frequência:

$$ \boxed{\hat{M}(f) = -j\,\text{sgn}(f)\,M(f) = \begin{cases}-j\,M(f), & f > 0\\ +j\,M(f), & f < 0\\ 0, & f = 0\\ \end{cases}} $$

O filtro da transformada de Hilbert tem resposta em frequência:

$$ \boxed{H_{\text{Hilbert}}(f) = -j\,\text{sgn}(f) = \begin{cases}-j, & f > 0\\ +j, & f < 0\\ \end{cases}} $$

Este filtro desloca todas as componentes de frequência positiva por $-90°$ e todas as de frequência negativa por $+90°$.

Propriedades importantes da transformada de Hilbert:

3.8.3 Dedução do sinal SSB

A partir do sinal analítico $\tilde{m}(t) = m(t) + j\,\hat{m}(t)$ (espectro nulo para $f < 0$):

$$ \Re\{\tilde{m}(t)\,e^{j2\pi f_c t}\} = m(t)\,\cos(2\pi f_c t) - \hat{m}(t)\,\sin(2\pi f_c t) $$

Este sinal tem espectro concentrado apenas em $f > f_c$ — banda lateral superior (USB).

De modo análogo (parte imaginária):

$$ \Im\{\tilde{m}(t)\,e^{j2\pi f_c t}\} = m(t)\,\sin(2\pi f_c t) + \hat{m}(t)\,\cos(2\pi f_c t) $$

contém apenas banda lateral inferior (LSB).

Portanto:

$$ \boxed{s_{\text{SSB}}(t) = \frac{A_c}{2}\Bigl[m(t)\,\cos(2\pi f_c t) \mp \hat{m}(t)\,\sin(2\pi f_c t)\Bigr]} $$

Sinal menos = USB, mais = LSB. USB = "transmitir frequências acima de $f_c$".

3.8.4 Espectro SSB

Para USB:

$$ S_{\text{USB}}(f) = \frac{A_c}{2}\,M(f-f_c)\,U(f-f_c) + \frac{A_c}{2}\,M^*(f+f_c)\,U(-f-f_c) $$

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)$):

$$ P_{\text{SSB}} = \frac{A_c^2}{4}\,\bigl[\langle m^2(t)\rangle + \langle\hat{m}^2(t)\rangle\bigr] = \frac{A_c^2}{4}\,(P_m + P_m) = \frac{A_c^2}{2}\,P_m $$

Comparando com DSB-SC: $P_{\text{DSB}} = \dfrac{A_c^2}{2}\,P_m$. Logo:

$$ \boxed{P_{\text{SSB}} = \frac{1}{2}\,P_{\text{DSB}}} $$

A SSB usa metade da potência do DSB-SC (transmite apenas uma banda lateral).

$$ \boxed{\eta_{\text{SSB}} = 100\%} $$

Esta é a máxima eficiência possível em modulação em amplitude.

3.8.6 Método do filtro (projeto do filtro passa-banda)

O método mais direto de gerar SSB é:

  1. Gerar DSB-SC: $s_{\text{DSB}}(t) = A_c\,m(t)\,\cos(2\pi f_c t)$.
  2. Filtrar por um filtro passa-banda seletivo que rejeita uma das bandas laterais.

O filtro deve ter resposta ideal:

$$ H_{\text{SSB}}(f) = \begin{cases}1, & f_c \leq |f| \leq f_c+W \quad\text{(USB)}\\ 0, & caso contrário\\ \end{cases} $$

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$):

$$ s_2(t) = s_1(t)\,\cos(2\pi f_2 t) = m(t)\,\cos(2\pi f_1 t)\,\cos(2\pi f_2 t) $$

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 é:

$$ s_{\text{VSB}}(t) = A_c\,m(t)\,\cos(2\pi f_c t) * h(t) $$

onde $h(t)$ é a resposta ao impulso do filtro. No domínio da frequência:

$$ S_{\text{VSB}}(f) = \frac{A_c}{2}\,M(f)*\bigl[H(f-f_c)+H(f+f_c)\bigr] $$

Para recuperação sem distorção (detecção coerente), a soma das respostas do filtro nas frequências simétricas em torno de $f_c$ deve ser constante:

$$ \boxed{H(f-f_c) + H(f+f_c) = \text{constante}, \qquad |f| \leq W} $$

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):

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:

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:

$$ \boxed{G_n(f) = \frac{N_0}{2}, \qquad -\infty < f < \infty} $$

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:

$$ \boxed{\text{SNR}_{\text{in}} = \frac{P_R}{N_0\,B}} $$

3.10.3 DSB-SC: SNR de saída

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”).

$$ \boxed{\text{SNR}_{\text{out}}^{\text{DSB}} = \frac{A_c^2 P_m}{N_0\,W} = 2\cdot\frac{A_c^2 P_m}{2N_0 W} = 2\,\text{SNR}_{\text{in}}} $$

3.10.4 AM: SNR de saída

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}$.

$$ \boxed{\text{SNR}_{\text{out}}^{\text{AM}} = \frac{\mu^2 P_{m_n}}{1+\mu^2 P_{m_n}}\cdot\text{SNR}_{\text{in}}} $$

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).

$$ \boxed{\text{SNR}_{\text{out}}^{\text{SSB}} = \text{SNR}_{\text{out}}^{\text{DSB}} = 2\,\text{SNR}_{\text{in}}} $$

A SSB obtém a mesma qualidade em ruído com metade da banda do DSB-SC — a razão pela qual é preferida em enlaces de longa distância HF.

3.10.6 FM: Ganho de processamento e limiar

A modulação FM troca largura de banda por SNR. O ganho de processamento:

$$ \boxed{\frac{\text{SNR}_{\text{out}}^{\text{FM}}}{\text{SNR}_{\text{in}}} = 3\,\beta^2(\beta+1) \qquad\text{para }\beta \gg 1} $$

onde $\beta = \Delta f/W$ é o índice de modulação FM.

Para $\beta = 5$: ganho $= 450$ ($26{,}5\,\text{dB}$).

Limiar FM (degradação abrupta abaixo de):

$$ \boxed{\text{SNR}_{\text{in}} \approx 10\,\text{dB}} $$

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 np
import matplotlib.pyplot as plt

fs = 100_000            # taxa de amostragem
fc = 5_000              # frequência da portadora
fm = 200                # frequência da mensagem
T = 0.02                # duração total
t = 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)

for ax, phi in zip(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 amostras
    h_lp = np.ones(200) / 200
    y = 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)
for phi in phis:
    amp = np.cos(phi)
    pwr = amp**2
    loss_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
Figura
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 np
import matplotlib.pyplot as plt

fs = 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.0

mu_vals = [0.3, 0.7, 1.0, 1.3]
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
for ax, mu in zip(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)
    if mu > 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ência
for mu in [0.3, 0.7, 1.0]:
    Pc = Ac**2/2; Psb = mu**2*Pc*0.5; Pt = Pc+Psb; eta = Psb/Pt
    print(f"$\\mu$={mu:.1f}: $P_c$={Pc:.3f}, $P_{{SB}}$={Psb:.3f}, $P_T$={Pt:.3f}, $\\eta$={eta:.1%}")
Output:
$\mu$=0.3: $P_c$=0.500, $P_{SB}$=0.022, $P_T$=0.522, $\eta$=4.3%
$\mu$=0.7: $P_c$=0.500, $P_{SB}$=0.122, $P_T$=0.622, $\eta$=19.7%
$\mu$=1.0: $P_c$=0.500, $P_{SB}$=0.250, $P_T$=0.750, $\eta$=33.3%
Figura

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 np
import matplotlib.pyplot as plt

fs = 100_000; fc = 5_000; fm = 300; N = 4096
t = np.arange(N) / fs
m = 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 ideal
H_usb = np.zeros(N)
for i in range(N):
    fi = f_full[i]
    if fi > 0 and fi >= fc: H_usb[i] = 1
    elif fi < 0 and fi <= -fc: H_usb[i] = 1

S_usb = S_dsb * H_usb
s_usb = np.fft.ifft(S_usb).real

f_shift = np.fft.fftshift(np.fft.fftfreq(N, 1/fs)) / 1000
fig, 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%
Figura

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 np
import matplotlib.pyplot as plt

# Parâmetros
mu_vals = np.linspace(0.1, 1.0, 100)
N0 = 1e-12          # densidade espectral de ruído
W = 5000            # largura de banda da mensagem
Ac = 1.0
P_mn = 0.5          # tom único
B_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_AM
SNR_in = P_T / N_in

# SNR de saída (apenas bandas laterais)
P_sb = (mu_vals**2 * Ac**2 / 2) * P_mn
N_out = N0 * W     # ruído na banda W após detecção coerente (ideal)
SNR_out = P_sb / N_out
ratio = SNR_out / SNR_in

# DSB-SC como referência
P_dsb = Ac**2 * P_mn / 2
SNR_in_dsb = P_dsb / N_in
SNR_out_dsb = P_dsb / N_out
ratio_dsb = SNR_out_dsb / SNR_in_dsb

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4.5))

# Esquerda: SNR de saída
SNR_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ência
eta = (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):")
for mu in [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)")
Output:
SNR comparison (linear scale):
  $\mu$=0.3: SNR_out/SNR_in = 0.0861 (-10.65 dB)
  $\mu$=0.6: SNR_out/SNR_in = 0.3051 (-5.16 dB)
  $\mu$=0.8: SNR_out/SNR_in = 0.4848 (-3.14 dB)
  $\mu$=1.0: SNR_out/SNR_in = 0.6667 (-1.76 dB)
Figura

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 np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

fs = 10_000
T = 1.0
t = 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 scipy
m_hilbert = np.imag(hilbert(m))

# Sinal analítico
s_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 = 50
carrier_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_sin

fig, axes = plt.subplots(3, 1, figsize=(12, 8))

# Mensagem e Hilbert
axes[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 USB
axes[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)) else None
ax.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.
Figura
Figura

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 np
import matplotlib.pyplot as plt

# ============================================================
# Parâmetros
# ============================================================
fs   = 100_000          # taxa de amostragem
fc   = 5_000            # frequência da portadora
fm   = 300              # frequência da mensagem
T    = 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))   # normalizado
Ac = 1.0

# DSB-SC
s_dsb = Ac * m * np.cos(2*np.pi*fc*t)

# ============================================================
# Costas Loop de segunda ordem (discretizado)
# ============================================================
# Parâmetros do loop
omega_n = 2*np.pi*200      # frequência natural: 200 Hz
zeta    = 0.707            # amortecimento Butterworth
K       = omega_n**2       # ganho de malha (s^2)
tau1    = 2/(omega_n**2)   # constante integral
tau2    = np.sqrt(2)/omega_n # constante proporcional

# Ganho do detector de fase e do VCO
Kd = 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ção
phi_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)
for n in range(N):
    # Multiplicador I
    y_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.001
    y_I = (1-alpha)*y_I + alpha*y_I_raw if n > 0 else y_I_raw
    y_Q = (1-alpha)*y_Q + alpha*y_Q_raw if n > 0 else y_Q_raw

    # Sinal de erro do Costas Loop
    v_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] if v_err_hist else 0)) / (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))

    # Registrar
    phi_err_hist.append(phi_hat - 0)   # erro relativo à fase ideal = 0
    y_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 recuperada
t_short = t[t < 0.005]  # zoom nos primeiros 5 ms
s_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 fase
axes[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 erro
axes[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 recuperada
axes[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
Figura
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.

3.13 Gabarito

3.13.1 E1

Espectro DSB-SC para $m(t) = \cos(2\pi f_1 t) + 0{,}5\cos(2\pi f_2 t)$:

$$ S_{\text{DSB-SC}}(f) = \frac{A_c}{2}\Bigl[M(f-f_c) + M(f+f_c)\Bigr] $$

Com $A_c = 1$:

$$ M(f) = \tfrac{1}{2}\bigl[\delta(f-f_1)+\delta(f+f_1)\bigr] + \tfrac{0{,}5}{2}\bigl[\delta(f-f_2)+\delta(f+f_2)\bigr] $$

Deslocando para $\pm f_c$:

$$ S(f) = \frac{1}{2}\cdot\frac{1}{2}\bigl[\delta(f-f_c-f_1)+\delta(f-f_c+f_1)+\delta(f+f_c-f_1)+\delta(f+f_c+f_1)\bigr] $$
$$ +\;\frac{1}{2}\cdot\frac{0{,}5}{2}\bigl[\delta(f-f_c-f_2)+\delta(f-f_c+f_2)+\delta(f+f_c-f_2)+\delta(f+f_c+f_2)\bigr] $$

Com $f_1 = 1\,\text{kHz}$, $f_2 = 2{,}5\,\text{kHz}$, $f_c = 10\,\text{kHz}$:

Frequência (kHz) Amplitude
$10-1 = 9$ $1/4 = 0{,}25$
$10+1 = 11$ $1/4 = 0{,}25$
$10-2{,}5 = 7{,}5$ $1/8 = 0{,}125$
$10+2{,}5 = 12{,}5$ $1/8 = 0{,}125$
e as simétricas negativas mesmas

Total: 8 linhas espectrais (4 positivas, 4 negativas).

3.13.2 E2

Dados: $\mu = 0{,}6$, $P_c = 50\,\text{W}$, tom único.

(a) $P_{\text{SB}} = \dfrac{\mu^2 A_c^2}{2} P_{m_n}$. Como $P_c = A_c^2/2 = 50\,\text{W}$, então $A_c^2/2 = 50$:

$$ P_{\text{SB}} = \mu^2 P_c \cdot P_{m_n} = 0{,}36 \cdot 50 \cdot 0{,}5 = \boxed{9\,\text{W}} $$

(b) $P_T = P_c + P_{\text{SB}} = 50 + 9 = \boxed{59\,\text{W}}$

(c) $\eta_P = \dfrac{P_{\text{SB}}}{P_T} = \dfrac{9}{59} \approx 0{,}1525 = \boxed{15{,}25\%}$

3.13.3 E3

(a) $y_\phi(t) = A_c m(t)\cos\phi$. Para $\phi = 30°$:

$$ \cos 30° = \frac{\sqrt{3}}{2} \approx 0{,}866 $$

A amplitude recuperada é $0{,}866\,A_c$, ou seja, 86,6% da amplitude ideal.

(b) Perda de potência: $P_{\text{loss}} = \sin^2 30° = (1/2)^2 = 1/4 = 25\%$.
Em dB: $-10\log_{10}(0{,}75) \approx \boxed{1{,}25\,\text{dB}}$.

(c) Para perda de 3 dB: $\sin^2\phi = 0{,}5$, logo $\sin\phi = 1/\sqrt{2}$, $\phi = \boxed{45° = \pi/4\,\text{rad}}$.

3.13.4 E4

Condição geral de RC:

$$ \frac{1}{2\pi\cdot 10^6} \ll RC \ll \frac{1}{2\pi\cdot 5000} $$
$$ 1{,}59\times 10^{-7}\,\text{s} \ll RC \ll 3{,}18\times 10^{-5}\,\text{s} $$
$$ \boxed{0{,}16\,\mu\text{s} \ll RC \ll 31{,}8\,\mu\text{s}} $$

Condição anti-diagonal clipping ($\mu = 0{,}8$, $f_m = 5\,\text{kHz}$):

$$ RC \leq \frac{\sqrt{1-0{,}8^2}}{0{,}8\cdot 2\pi\cdot 5000} = \frac{0{,}6}{25133} \approx 23{,}9\,\mu\text{s} $$

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)$:

$$ \mathcal{F}\{\cos(2\pi f_0 t)\} = \tfrac{1}{2}\bigl[\delta(f-f_0) + \delta(f+f_0)\bigr] $$

Para $f_0 > 0$:

Invertendo:

$$ \hat{m}(t) = -j\cdot\frac{1}{2}e^{j2\pi f_0 t} + j\cdot\frac{1}{2}e^{-j2\pi f_0 t} = \frac{e^{-j2\pi f_0 t} - e^{j2\pi f_0 t}}{2j} = -\sin(2\pi f_0 t) $$

$\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}$:

Componente Frequência Amplitude
Portadora $1{,}000\,\text{kHz}$ $A_c$
LSB $0{,}997\,\text{kHz}$ $\mu A_c/2 = 0{,}45 A_c$
USB $1{,}003\,\text{kHz}$ $\mu A_c/2 = 0{,}45 A_c$

(b) Razão portadora/laterais:

$$ \frac{P_c}{P_{\text{SB}}} = \frac{A_c^2/2}{\mu^2 A_c^2/4} = \frac{2}{\mu^2} = \frac{2}{0{,}81} \approx \boxed{2{,}47} $$

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:

$$ \boxed{\text{SNR}_{\text{out}}^{\text{SSB}} = \text{SNR}_{\text{out}}^{\text{DSB}} = \frac{A_c^2 P_m}{N_0 W}} $$

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:

  1. Cruzamento de zero: envelope passa por $0$, invertendo fase em $180°$.
  2. Inversão de fase: sinal modulado inverte fase onde $1+\mu\,m_n(t) < 0$.
  3. Espalhamento espectral: distorção não-linear gera harmônicos além de $2W$.
PYTHON
import numpy as np
import matplotlib.pyplot as plt

fs = 100_000; fc = 5_000; fm = 200; mu = 1.2; T = 0.01
m = 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.
Figura

3.13.11 E11

Sinal SSB-USB:

$$ s_{\text{USB}}(t) = \frac{A_c}{2}\Bigl[m(t)\,\cos(2\pi f_c t) - \hat{m}(t)\,\sin(2\pi f_c t)\Bigr] $$

Transformada usando $\hat{M}(f) = -j\,\text{sgn}(f)\,M(f)$:

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$:

$$ B_{\text{FM}} \approx 2\Delta f(1 + 1/\beta) \approx 2\Delta f \quad\text{(para }\beta \gg 1\text{)} $$

Comparação de eficiência espectral ($\eta_f = \text{informação} / \text{banda}$):

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$.

3.13.13 E13

Dados: $B_L = 100\,\text{Hz}$, $\text{SNR}_{\text{in}} = 20\,\text{dB}$.

(a) Variância do erro de fase em lock:

$$ \sigma_\phi^2 \approx \frac{B_L}{2\,\text{SNR}_{\text{in}}} $$

Converter SNR para escala linear: $\text{SNR}_{\text{in}} = 10^{20/10} = 100$.

$$ \sigma_\phi^2 = \frac{100}{2 \cdot 100} = 0{,}5 \quad\Rightarrow\quad \sigma_\phi = \sqrt{0{,}5} \approx 0{,}707\,\text{rad} $$

(b) Erro de fase RMS em graus:

$$ \sigma_\phi = 0{,}707\,\text{rad} = 0{,}707 \cdot \frac{180}{\pi} \approx \boxed{40{,}5°} $$

(c) Perda de potência equivalente em dB:

A potência do sinal recuperado é proporcional a $\cos^2\phi$. Com erro de fase RMS de 0,707 rad (≈40,5°):

$$ \cos^2(0{,}707) \approx \cos^2(40{,}5°) \approx 0{,}569 $$

Perda em dB:

$$ \boxed{P_{\text{loss}} = -10\log_{10}(0{,}569) \approx 2{,}45\,\text{dB}} $$

3.13.14 E14

Seja $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)$.

O VCO gera $\cos(\omega_c t + \hat{\phi})$ e $-\sin(\omega_c t + \hat{\phi})$.

Ramo I (após multiplicador e LPF):

$$ y_I(t) = \bigl[A_c m(t) + n_I(t)\bigr]\cos\phi_e(t) + n_Q(t)\sin\phi_e(t) $$

onde $\phi_e = \phi - \hat{\phi}$ é o erro de fase.

Ramo Q (após multiplicador e LPF):

$$ y_Q(t) = -\bigl[A_c m(t) + n_I(t)\bigr]\sin\phi_e(t) + n_Q(t)\cos\phi_e(t) $$

O sinal de erro é $v_e(t) = y_I(t) \cdot y_Q(t)$:

$$ v_e(t) = \bigl[A_c m + n_I\bigr]\cos\phi_e + n_Q\sin\phi_e\;\times\; -\bigl[A_c m + n_I\bigr]\sin\phi_e + n_Q\cos\phi_e $$

Expandindo:

$$ v_e(t) = -\bigl[A_c m(t) + n_I(t)\bigr]^2\sin\phi_e\cos\phi_e + n_Q^2(t)\sin\phi_e\cos\phi_e + \bigl[A_c m(t)n_Q(t) - n_I(t)n_Q(t)\bigr](\cos^2\phi_e - \sin^2\phi_e) $$

Usando identidades trigonométricas:

$$ \boxed{v_e(t) = -\frac{\bigl[A_c m(t) + n_I(t)\bigr]^2 - n_Q^2(t)}{2}\,\sin(2\phi_e) + \bigl[A_c m(t)n_Q(t) - n_I^2(t)\bigr]\,\cos(2\phi_e)} $$

Identificando os componentes:

  1. Termo sinal-sinal: $-\dfrac{A_c^2 m^2(t)}{2}\sin(2\phi_e)$ — o termo de controle do Costas Loop.
  2. Termos sinal-ruído: $-A_c m(t)\dfrac{2n_I(t)}{2}\sin(2\phi_e)$ — acoplamento entre mensagem e ruído.
  3. Termos ruído-ruído: $\dfrac{n_Q^2(t) - n_I^2(t)}{2}\sin(2\phi_e)$ — jitter de fase induzido pelo ruído.
  4. Termo misto: $[A_c m(t)n_Q(t) - n_I(t)n_Q(t)]\cos(2\phi_e)$ — acoplamento cruzado.

Para $\phi_e \approx 0$: $\sin(2\phi_e) \approx 2\phi_e$ e $\cos(2\phi_e) \approx 1$. O termo dominante de erro é:

$$ \boxed{v_e \approx -A_c^2 m^2(t)\,\phi_e + n_Q^2(t)} $$

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

$$ \boxed{f_i(t) = \frac{1}{2\pi}\frac{d\theta_i(t)}{dt}} $$

e a frequência instantânea angular é $\omega_i(t) = d\theta_i(t)/dt$.

Se $f_c$ é a frequência da portadora não modulada, escrevemos a fase como uma soma:

$$ \theta_i(t) = 2\pi f_c t + \phi(t), $$

onde $\phi(t)$ é o termo de fase adicional que carrega a informação. A frequência instantânea torna-se

$$ f_i(t) = f_c + \frac{1}{2\pi}\frac{d\phi(t)}{dt}. $$

A modulação angular consiste em fazer $\phi(t)$ variar de acordo com o sinal mensagem $m(t)$. Existem duas convenções:

4.2.1 Modulação de Fase (PM)

Na PM, o deslocamento de fase é diretamente proporcional a $m(t)$:

$$ \phi_{\text{PM}}(t) = k_p\,m(t), $$

onde $k_p$ é a sensibilidade de fase (rad/V). O sinal PM é

$$ s_{\text{PM}}(t) = A_c\cos\left(2\pi f_c t + k_p\,m(t)\right). $$

A frequência instantânea é

$$ f_{i,\text{PM}}(t) = f_c + \frac{k_p}{2\pi}\frac{dm(t)}{dt}. $$

4.2.2 Modulação de Frequência (FM)

Na FM, o desvio de frequência instantânea é proporcional a $m(t)$:

$$ f_i(t) - f_c = k_f\,m(t), $$

onde $k_f$ é a sensibilidade de frequência (Hz/V). Como $f_i(t) - f_c = \frac{1}{2\pi}\frac{d\phi(t)}{dt}$, temos

$$ \frac{d\phi(t)}{dt} = 2\pi k_f\,m(t) \quad\Rightarrow\quad \phi(t) = 2\pi k_f\int_{-\infty}^{t} m(\tau)\,d\tau. $$

Assumindo o sistema em repouso antes de $t=0$ (integral de $-\infty$), o sinal FM é

$$ \boxed{s_{\text{FM}}(t) = A_c\cos\left(2\pi f_c t + 2\pi k_f\int_{0}^{t} m(\tau)\,d\tau\right)} $$

4.2.3 Relação entre FM e PM

Como o termo de fase na FM é a integral da mensagem, e a derivada da mensagem gera deflexão de frequência na PM, existe equivalência formal:

$$ s_{\text{PM}}(t) = A_c\cos(2\pi f_c t + k_p\,m(t)) \equiv \text{FM de } m'(t) \text{ com } k_f = k_p/(2\pi). $$

Reciprocamente, o FM pode ser obtido integrando $m(t)$ e aplicando modulação de fase:

$$ s_{\text{FM}}(t) = \text{PM}\bigl[\int m(\tau)d\tau\bigr] \quad\text{com } k_p = 2\pi k_f. $$

4.2.4 Amplitude constante e suas consequências

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:

  1. 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.
  2. 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.
  3. 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 é

$$ \phi(t) = 2\pi k_f\int_{0}^{t} A_m\cos(2\pi f_m \tau)\,d\tau = \frac{k_f A_m}{f_m}\sin(2\pi f_m t). $$

Definimos a deflexão (desvio) de frequência de pico como

$$ \boxed{\Delta f = k_f\cdot\max|m(t)| = k_f A_m} $$

e o sinal FM torna-se

$$ s_{\text{FM}}(t) = A_c\cos\left(2\pi f_c t + \frac{\Delta f}{f_m}\sin(2\pi f_m t)\right). $$

4.3.2 Índice de modulação FM

Definimos o índice de modulação $\beta$ como

$$ \boxed{\beta = \frac{\Delta f}{f_m} = \frac{k_f A_m}{f_m}} $$

$\beta$ é adimensional e mede quantas vezes o desvio de frequência excede a frequência do tom modulante. O sinal FM completo é

$$ \boxed{s_{\text{FM}}(t) = A_c\cos\Bigl(2\pi f_c t + \beta\sin(2\pi f_m t)\Bigr)} $$

4.3.3 Frequência instantânea — verificação

Derivando a fase total $\theta_i(t) = 2\pi f_c t + \beta\sin(2\pi f_m t)$:

$$ \frac{d\theta_i(t)}{dt} = 2\pi f_c + 2\pi f_m\beta\cos(2\pi f_m t) = 2\pi\bigl(f_c + \Delta f\cos(2\pi f_m t)\bigr), $$

logo

$$ f_i(t) = f_c + \Delta f\cos(2\pi f_m t). $$

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$

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.

4.4.1 Expansão em séries de Bessel — dedução

Começamos com o sinal FM tonal:

$$ s_{\text{FM}}(t) = A_c\cos\Bigl(2\pi f_c t + \beta\sin(2\pi f_m t)\Bigr). $$

Usando a identidade trigonométrica $\cos(\alpha + \gamma) = \cos\alpha\cos\gamma - \sin\alpha\sin\gamma$:

$$ s_{\text{FM}}(t) = A_c\cos(2\pi f_c t)\cos\bigl(\beta\sin(2\pi f_m t)\bigr) - A_c\sin(2\pi f_c t)\sin\bigl(\beta\sin(2\pi f_m t)\bigr). $$

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:

$$ \boxed{\cos(\beta\sin\theta) = J_0(\beta) + 2\sum_{n=1}^{\infty}J_{2n}(\beta)\cos(2n\theta)} $$
$$ \boxed{\sin(\beta\sin\theta) = 2\sum_{n=0}^{\infty}J_{2n+1}(\beta)\sin\bigl((2n+1)\theta\bigr)} $$

Substituindo $\theta = 2\pi f_m t$ e inserindo nas duas equações acima:

$$ \begin{aligned} s_{\text{FM}}(t) = A_c\cos(2\pi f_c t)\Bigl[J_0(\beta) &+ 2J_2(\beta)\cos(4\pi f_m t) + 2J_4(\beta)\cos(8\pi f_m t) + \cdots\Bigr] \\ - A_c\sin(2\pi f_c t)\Bigl[&2J_1(\beta)\sin(2\pi f_m t) + 2J_3(\beta)\sin(6\pi f_m t) + \cdots\Bigr] \end{aligned} $$

Agora, usamos os produtos notáveis:

$$ \cos(A)\cos(B) = \tfrac{1}{2}[\cos(A-B) + \cos(A+B)] $$
$$ \sin(A)\sin(B) = \tfrac{1}{2}[\cos(A-B) - \cos(A+B)] $$

Aplicando:

$$ \begin{aligned} A_c J_0(\beta)\cos(2\pi f_c t) &\quad\text{(componente em }f_c\text{)} \\ A_c J_1(\beta)\cos[2\pi(f_c - f_m)t] &\quad\text{(lateral inferior }n=-1\text{)} \\ A_c J_1(\beta)\cos[2\pi(f_c + f_m)t] &\quad\text{(lateral superior }n=+1\text{)} \\ -A_c J_2(\beta)\cos[2\pi(f_c - 2f_m)t] &\quad\text{(lateral inferior }n=-2\text{)} \\ +A_c J_2(\beta)\cos[2\pi(f_c + 2f_m)t] &\quad\text{(lateral superior }n=+2\text{)} \\ -A_c J_3(\beta)\cos[2\pi(f_c - 3f_m)t] &\quad\text{(lateral inferior }n=-3\text{)} \\ +A_c J_3(\beta)\cos[2\pi(f_c + 3f_m)t] &\quad\text{(lateral superior }n=+3\text{)} \\ &\vdots \end{aligned} $$

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)$:

$$ \boxed{s_{\text{FM}}(t) = A_c\sum_{n=-\infty}^{\infty} J_n(\beta)\cos\Bigl(2\pi(f_c + nf_m)t\Bigr)} $$

Esta é a expansão de Jacobi–Anger para o sinal FM tonal.

4.4.2 Funções de Bessel de primeira espécie — definição e propriedades

$$ \boxed{J_n(\beta) = \frac{1}{2\pi}\int_{-\pi}^{\pi} \cos(n\tau - \beta\sin\tau)\,d\tau} $$

Esta integral existe para todo $n\in\mathbb{Z}$ e $\beta\in\mathbb{R}$. Para $n$ inteiro, $J_n$ é real.

Série de potências (para $n \ge 0$):

$$ J_n(\beta) = \sum_{k=0}^{\infty} \frac{(-1)^k}{k!\,(n+k)!}\left(\frac{\beta}{2}\right)^{2k+n} $$

Relações de recorrência:

$$ \boxed{J_{n-1}(\beta) + J_{n+1}(\beta) = \frac{2n}{\beta}\,J_n(\beta)} $$
$$ \boxed{J_{n-1}(\beta) - J_{n+1}(\beta) = 2\,J_n'(\beta)} $$

Propriedades de simetria:

$$ \boxed{J_{-n}(\beta) = (-1)^n\,J_n(\beta) \quad\text{(para $n$ inteiro)}} $$
$$ J_n(-\beta) = (-1)^n\,J_n(\beta) $$

Para $n$ par: $J_{-n} = J_n$ (par em $n$). Para $n$ ímpar: $J_{-n} = -J_n$ (ímpar em $n$).

Identidade de ortogonalidade (completação da base):

$$ \boxed{\sum_{n=-\infty}^{\infty} J_n^2(\beta) = 1} $$

Esta identidade é fundamental: ela garante que a potência total do sinal FM é conservada.

4.4.3 Comportamento assintótico de $J_n(\beta)$

Para $\beta \ll 1$ (argumento pequeno), os primeiros termos da série dão:

$$ J_0(\beta) \approx 1 - \frac{\beta^2}{4}, \quad J_1(\beta) \approx \frac{\beta}{2}, \quad J_2(\beta) \approx \frac{\beta^2}{8}, \quad J_n(\beta) \approx \frac{\beta^n}{2^n n!} \text{ para } n \ge 1. $$

Isso confirma que para $\beta \to 0$, apenas $J_0 \approx 1$ é significativo — o espectro se reduz à portadora pura.

Para $\beta \gg 1$ (argumento grande), o comportamento assintótico é oscilatório:

$$ J_n(\beta) \approx \sqrt{\frac{2}{\pi\beta}}\cos\left(\beta - \frac{n\pi}{2} - \frac{\pi}{4}\right) \quad\text{para } \beta \gg n. $$

As amplitudes decrescem lentamente (como $1/\sqrt{\beta}$) até $n \approx \beta$, onde há um pico, e decaem rapidamente para $n \gg \beta$.

4.4.4 Zeros das funções de Bessel e anulação da portadora

Os zeros de $J_0(\beta)$ ocorrem quando a componente da portadora se anula. Os primeiros zeros de $J_0$ são:

$$ \beta_0 \approx 2{,}4048, \quad \beta_1 \approx 5{,}5201, \quad \beta_2 \approx 8{,}6537, \quad \beta_3 \approx 11{,}7915, \quad \ldots $$

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 é:

$$ P = \frac{A_c^2}{2}\sum_{n=-\infty}^{\infty} J_n^2(\beta) = \frac{A_c^2}{2}\cdot 1 = \frac{A_c^2}{2}. $$

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:

$$ J_0(\beta) \approx 1, \quad J_{\pm 1}(\beta) \approx \pm\frac{\beta}{2}, \quad J_n(\beta) \approx 0 \text{ para } |n| \ge 2. $$

O sinal FM fica:

$$ \begin{aligned} s_{\text{FM}}(t) &\approx A_c\Bigl[J_0(\beta)\cos(2\pi f_c t) + J_1(\beta)\cos(2\pi(f_c - f_m)t) + J_{-1}(\beta)\cos(2\pi(f_c + f_m)t)\Bigr] \\ &\approx A_c\cos(2\pi f_c t) + \frac{A_c\beta}{2}\cos(2\pi(f_c - f_m)t) - \frac{A_c\beta}{2}\cos(2\pi(f_c + f_m)t) \end{aligned} $$

(usando $J_1 = \beta/2$ e $J_{-1} = -J_1 = -\beta/2$).

Usando $\cos(A-B) - \cos(A+B) = 2\sin A\sin B$:

$$ \boxed{s_{\text{NBFM}}(t) \approx A_c\cos(2\pi f_c t) - A_c\beta\sin(2\pi f_c t)\sin(2\pi f_m t)} $$

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 é:

Regra de Carson:

$$ \boxed{B_C = 2(\Delta f + f_m) = 2f_m(\beta + 1)} $$

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:

$$ f_{\max} = f_c + (\beta + 1)f_m = f_c + \Delta f + f_m $$
$$ f_{\min} = f_c - (\beta + 1)f_m = f_c - \Delta f - f_m $$

A largura de banda é:

$$ B_C = f_{\max} - f_{\min} = 2(\Delta f + f_m) = 2f_m(\beta + 1) \quad\blacksquare $$

4.5.4 Comparação NBFM vs WBFM

Propriedade NBFM ($\beta < 0{,}2$) WBFM ($\beta > 1$)
Largura de banda $\approx 2f_m$ $\approx 2(\Delta f + f_m)$
Número de bandas laterais 1 par (≈ 3 componentes) Múltiplos pares
SNR de saída Similar a AM Ganho referido a $(C/N)_W$: $\tfrac32\beta^2$
Complexidade de demodulação Simples Discriminador ou PLL
Imunidade a ruído Limitada Alta (troca banda por SNR)
Potência $A_c^2/2$, independente de $m(t)$ $A_c^2/2$, independente de $m(t)$

4.5.5 FM Broadcast — exemplo prático

No padrão de radiodifusão FM (FCC/Europeu):

4.6 Geração de Sinais FM

4.6.1 Modulação FM direta (VCO)

O método mais direto: um oscilador controlado por voltagem (VCO) cuja frequência natural varia linearmente com a tensão de entrada.

Um VCO com constante $k_{\text{VCO}}$ (Hz/V) produz:

$$ f_i(t) = f_0 + k_{\text{VCO}}\,m(t) $$

onde $f_0$ é a frequência livre (sem entrada). Integrando, a fase é

$$ \phi(t) = 2\pi k_{\text{VCO}}\int_0^t m(\tau)\,d\tau. $$

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:

  1. Gera-se NBFM com baixa deflexão (usando um modulador de fase com alta $k_p$ e sinal $m(t)$ atenuado).
  2. 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:

$$ s_{\text{FM}}(t) = A_c\cos\Bigl(2\pi f_c t + 2\pi k_f\int m(\tau)d\tau\Bigr) $$

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:

  1. Converter variações de frequência do sinal FM em variações de amplitude.
  2. 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):

$$ V_{\text{out}}(f) = K_d\cdot(f - f_c), \quad |f - f_c| \leq \Delta f_{\text{linear}} $$

onde $K_d$ é o ganho do discriminador (V/Hz).

$$ \boxed{K_d = \frac{dV_{\text{out}}}{df}\Big|_{f=f_c} \quad \text{(V/Hz)}} $$

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:

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:

  1. Sinal FM entra no comparador de fase.
  2. O PLL se trava (lock) e segue as variações de frequência do sinal.
  3. 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:

  1. Misturar o sinal RF para baseband (I/Q demodulation): obter $z(t) = I(t) + jQ(t)$.
  2. Calcular a fase instantânea: $\phi(t) = \arg\bigl(z(t)\bigr) = \operatorname{atan2}\bigl(Q(t), I(t)\bigr)$.
  3. Desfazer o unwrap da fase: $\phi_{\text{unwrap}}(t) = \operatorname{unwrap}\bigl(\phi(t)\bigr)$.
  4. Diferenciar: $m(t) \propto \frac{d\phi_{\text{unwrap}}(t)}{dt}$.

Em discreto:

$$ m[n] = \frac{1}{2\pi K_d}\bigl(\phi_{\text{unwrap}}[n] - \phi_{\text{unwrap}}[n-1]\bigr)\cdot f_s $$

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 é

$$ T_n = \frac{\pi}{\omega_i(t)} = \frac{1}{2f_i(t)}. $$

Logo, a frequência instantânea pode ser estimada pelo inverso do período entre cruzamentos.

4.8.2 Limitador + diferenciador + detector de envelope

Uma implementação clássica:

  1. Limitador: remove variações de amplitude, produzindo um quadrado (ou pulso) de amplitude constante.
  2. Diferenciador: o circuito diferenciador tem resposta $H(f) \propto j\omega$. Aplicado a $s(t)$:
$$ \frac{d}{dt}\Bigl[A_c\cos\theta(t)\Bigr] = -A_c\dot{\theta}(t)\sin\theta(t) $$

onde $\dot{\theta}(t) = 2\pi f_i(t) = 2\pi(f_c + k_f m(t))$.

  1. Detector de envelope: extrai $|A_c\dot{\theta}(t)| = A_c\cdot 2\pi(f_c + k_f m(t))$.
  2. Bloqueio DC: remove a componente $2\pi f_c$, restando $2\pi k_f m(t)$.

DEDUÇÃO detalhada:

Seja $s(t) = A_c\cos\theta(t)$. Derivando:

$$ \frac{ds(t)}{dt} = -A_c\frac{d\theta(t)}{dt}\sin\theta(t) = -A_c\omega_i(t)\sin\theta(t) $$

O envelope absoluto deste sinal é:

$$ \left|\frac{ds(t)}{dt}\right| = A_c\omega_i(t) = A_c\cdot 2\pi\bigl(f_c + k_f m(t)\bigr) $$

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).

Se o sinal recebido é:

$$ r(t) = s(t) + n(t) = A_c\cos\theta(t) + n_c(t)\cos(2\pi f_c t) - n_s(t)\sin(2\pi f_c t) $$

com $n(t)$ sendo ruído aditivo de banda estreita, o envelope de $r(t)$ é:

$$ R(t) = \sqrt{\bigl(A_c\cos\phi(t) + n_c(t)\bigr)^2 + \bigl(A_c\sin\phi(t) + n_s(t)\bigr)^2} $$

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.

4.9.1 Ruído aditivo no receptor FM

No receptor, o sinal recebido é:

$$ r(t) = s_{\text{FM}}(t) + n(t) = A_c\cos\theta_i(t) + n(t) $$

onde $n(t)$ é ruído branco gaussiano com densidade espectral $N_0/2$ (W/Hz).

Representamos $n(t)$ em componentes em fase e quadratura em torno de $f_c$:

$$ n(t) = n_c(t)\cos(2\pi f_c t) - n_s(t)\sin(2\pi f_c t) $$

onde $n_c(t)$ e $n_s(t)$ são processos de baixa passagem, independentes, com mesma densidade espectral:

$$ S_{n_c}(f) = S_{n_s}(f) = \begin{cases} N_0, & |f| \leq B \\ 0, & |f| > B \end{cases} $$

e potência $\sigma_n^2 = \int_{-B}^{B} N_0\,df = 2N_0 B$.

4.9.2 Decomposição do sinal mais ruído em polar

Escrevendo $r(t)$ em forma polar:

$$ r(t) = R(t)\cos\bigl(\theta_i(t) + \phi(t)\bigr) $$

onde

$$ R(t) = \sqrt{\bigl(A_c\cos\theta_i(t) + n_c(t)\bigr)^2 + \bigl(A_c\sin\theta_i(t) + n_s(t)\bigr)^2} $$
$$ \theta_i(t) + \phi(t) = \operatorname{atan2}\Bigl(A_c\sin\theta_i(t) + n_s(t),\, A_c\cos\theta_i(t) + n_c(t)\Bigr) $$

$\phi(t)$ é o ruído de fase induzido pelo ruído aditivo.

4.9.3 Aproximação para SNR alto

Para $\text{SNR}_{\text{in}} = A_c^2/(2\sigma_n^2) \gg 1$ (grande sinal, pouco ruído):

$$ \phi(t) \approx \frac{n_s(t)}{A_c} $$

A aproximação vem da expansão em série de Taylor do $\operatorname{atan2}$ para $n_c, n_s \ll A_c$.

O ruído de frequência (deslocamento instantâneo por ruído) é:

$$ \boxed{\Delta f_n(t) = \frac{1}{2\pi}\frac{d\phi(t)}{dt} = \frac{1}{2\pi A_c}\frac{dn_s(t)}{dt}} $$

4.9.4 Densidade espectral do ruído de saída

O discriminador FM produz uma saída proporcional a $\frac{d\phi(t)}{dt}$. O ruído de saída após o discriminador tem densidade espectral:

$$ S_{n_{\text{out}}}(f) = K_d^2\cdot (2\pi f)^2\cdot S_{\phi}(f) = K_d^2\cdot (2\pi f)^2\cdot \frac{N_0}{A_c^2} $$

para $|f| \leq W$ (onde $W$ é a banda da mensagem).

4.9.5 Potência de ruído de saída

A potência de ruído na saída do discriminador é:

$$ P_{n_{\text{out}}} = \int_{-W}^{W} K_d^2(2\pi f)^2\frac{N_0}{A_c^2}\,df = \frac{K_d^2 4\pi^2 N_0}{A_c^2}\int_{-W}^{W} f^2\,df = \frac{K_d^2 4\pi^2 N_0}{A_c^2}\cdot\frac{2W^3}{3} $$
$$ \boxed{P_{n_{\text{out}}} = \frac{8\pi^2 K_d^2 N_0 W^3}{3A_c^2}} $$

4.9.6 Potência do sinal de saída

Para $m(t) = A_m\cos(2\pi f_m t)$ com $f_m \leq W$, a saída do discriminador é:

$$ y(t) = K_d\cdot 2\pi k_f m(t) = 2\pi K_d k_f A_m\cos(2\pi f_m t) $$

A potência média é:

$$ \boxed{P_{\text{sinal, out}} = \frac{1}{2}(2\pi K_d k_f A_m)^2 = 2\pi^2 K_d^2 k_f^2 A_m^2} $$

4.9.7 SNR de saída FM

$$ \text{SNR}_{\text{out}} = \frac{P_{\text{sinal, out}}}{P_{n_{\text{out}}}} = \frac{2\pi^2 K_d^2 k_f^2 A_m^2}{\dfrac{8\pi^2 K_d^2 N_0 W^3}{3A_c^2}} = \frac{3 k_f^2 A_m^2 A_c^2}{4 N_0 W^3} $$

Para comparar a saída com uma referência sem ambiguidade, definimos primeiro a razão portadora-ruído referida à largura da mensagem $W$:

$$ \left(\frac CN\right)_W=\frac{A_c^2/2}{N_0W}. $$

Para a senoide de maior frequência $f_m=W$, $\beta=k_fA_m/W$. Dividindo a SNR de saída por essa referência:

$$ \boxed{\text{SNR}_{\text{out}}=\frac32\beta^2\left(\frac CN\right)_W.} $$

Se, em vez disso, a “SNR de entrada” for medida na largura RF real do receptor $B_r$, então

$$ \text{SNR}_{\text{in},B_r}=\frac{A_c^2/2}{N_0B_r}, $$

e a conversão correta é

$$ \boxed{\text{SNR}_{\text{out}}=\frac32\beta^2\frac{B_r}{W}\,\text{SNR}_{\text{in},B_r}.} $$

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.

4.9.8 Ganho de processamento FM

O ganho de processamento FM é definido como:

$$ \boxed{G_{\text{FM},W}=\frac{\text{SNR}_{\text{out}}}{(C/N)_W}=\frac32\beta^2} $$

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.

$$ P_{\text{limiar}} \approx P_{\text{ruído}} \times 10 \quad\text{(SNR}_{\text{in}} \approx 10\text{ dB)} $$

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:

  1. 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 é:
$$ \boxed{H_{\text{pre}}(f) = 1 + j\frac{f}{f_0}} $$

Esta é um filtro passa-altas de primeira ordem que aumenta a amplitude proporcionalmente a $f$ para $f \gg f_0$.

  1. No receptor (de-ênfase): após a demodulação FM, aplicar um filtro que é a inversa da pré-ênfase:
$$ \boxed{H_{\text{de}}(f) = \frac{1}{H_{\text{pre}}(f)} = \frac{1}{1 + j\frac{f}{f_0}}} $$

Este é um filtro passa-baixas de primeira ordem.

  1. 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:

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)} $$

4.10.4 Constante de tempo e padrões

A constante de tempo do filtro RC de de-ênfase é:

$$ \boxed{\tau = RC = \frac{1}{2\pi f_0}} $$

Padrões:

4.11 FM Stereo e Aplicações

4.11.1 Sistema FM Stereo — multiplexação

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:

  1. Canal principal (L + R): soma dos canais esquerdo e direito. Ocupa 0–15 kHz. Receptores mono reproduzem apenas este canal.
  2. 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.
  3. Canal L − R: diferença dos canais, modulado em DSB-SC na subportadora de 38 kHz. Ocupa 23–53 kHz.
  4. RDS (Radio Data System): subportadora adicional a 57 kHz para dados (nome da estação, hora, etc.). Ocupa ~57 ± 1{,}5 kHz.

O sinal completo de modulação é:

$$ \boxed{M(t) = (L(t)+R(t)) + (L(t)-R(t))\cos(2\pi\cdot 38\text{ kHz}\cdot t) + P_{\text{pilot}}\cos(2\pi\cdot 19\text{ kHz}\cdot t) + \text{RDS}(t)} $$

com limitação de frequência máxima a 53 kHz para respeitar o desvio máximo de 75 kHz.

4.11.2 Compatibilidade mono

Para receptor mono:

$$ s_{\text{mono}}(t) \propto L(t) + R(t) $$

o canal (L + R) é diretamente acessível. Os componentes stereo (L − R, pilot, RDS) são rejeitados por filtro passa-baixas simples.

Para receptor stereo:

$$ L(t) = \frac{(L+R) + (L-R)}{2}, \quad R(t) = \frac{(L+R) - (L-R)}{2} $$

O receptor reconstrói $L-R$ demodulando o DSB-SC em 38 kHz (usando o pilot de 19 kHz dobrado para gerar 38 kHz local).

4.11.3 Espectro do FM Stereo

O espectro de frequências do sinal de modulação FM stereo (0–75 kHz):

  0 Hz       |--- 15 kHz ---|   19 kHz   |--- 23 kHz ---|--- 53 kHz ---| 57 kHz
  L+R       |    Áudio L+R   | Pilot 19kHz | DSB-SC L-R  |  Banda L-R   | RDS (57 kHz)

4.11.4 FM RDS (Radio Data System)

O RDS transmite dados digitais na subportadora de 57 kHz:

4.11.5 Aplicações da FM

4.12 Comparação FM vs AM vs DSB-SC

4.12.1 Tabela comparativa completa

Propriedade AM (DSB com portadora) DSB-SC FM ($\beta \gg 1$)
Largura de banda $2W$ $2W$ $2(\Delta f + W) = 2W(\beta+1)$
Potência total $\dfrac{A_c^2}{2}\!\left(1+\dfrac{\mu^2}{2}\right)$ $\dfrac{A_c^2}{2}$ $\dfrac{A_c^2}{2}$ (constante)
Eficiência de potência $\mu^2/(2+\mu^2) \leq 33\%$ 100% (na mensagem) 100% (independente de $m(t)$)
SNR de saída $\text{SNR}_{\text{out}} = \dfrac{\mu^2}{2+\mu^2}\text{SNR}_{\text{in}}$ $\text{SNR}_{\text{out}} = \text{SNR}_{\text{in}}$ $\text{SNR}_{\text{out}} = \tfrac32\beta^2(C/N)_W$
Complexidade do TX Simples Moderada Moderada (VCO ou Armstrong)
Complexidade do RX Detector de envelope Coerente (carrier recovery) Discriminador ou PLL
Imunidade a ruído de amplitude Nenhuma Nenhuma Alta (limitador)
Imunidade a fading Baixa Baixa Boa (se SNR > limiar)

4.12.2 Quando escolher cada modulação

AM (DSB com portadora):

DSB-SC:

FM (WBFM):

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 np
import matplotlib.pyplot as plt
from scipy.special import jv

# Parâmetros
fc, fm, df = 100e6, 5e3, 25e3
beta = df / fm  # índice de modulação
print(f"Índice de modulação: β = {beta}")

# Calcular coeficientes de Bessel
n_max = 15
n = 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 modulada
threshold = 0.05
significant = np.sum(amplitudes > threshold)
print(f"Componentes com amplitude > {threshold*100:.0f}% da portadora não modulada: {significant}")

# Regra de Carson
B_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 Carson
n_carson = int(np.ceil(B_carson / (2 * fm)))
print(f"Bandas laterais por lado (Carson): n_max ≈ {n_carson}")

# Plot do espectro de amplitudes
fig, ax = plt.subplots(figsize=(10, 5))
frequencies = fc + n * fm  # posições em Hz
ax.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 valores
print("\nTabela de coeficientes de Bessel J_n(β):")
print(f"{'n':>3}  {'J_n(β)':>10}  {'Amplitude %':>12}  {'Potência %':>12}")
for i in range(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ência
P_total = np.sum(Jn**2)
print(f"\nConservação de potência: Σ J_n²(β) = {P_total:.10f} (deve ser 1.0)")
Output:
Índice de modulação: β = 5.0
Componentes com amplitude > 5% da portadora não modulada: 13
Banda de Carson: B_C = 60.0 kHz
Bandas laterais por lado (Carson): n_max ≈ 6

Tabela de coeficientes de Bessel J_n(β):
  n      J_n(β)   Amplitude %    Potência %
-15   -0.000000         0.00%         0.00%
-14    0.000003         0.00%         0.00%
-13   -0.000015         0.00%         0.00%
-12    0.000076         0.01%         0.00%
-11   -0.000351         0.04%         0.00%
-10    0.001468         0.15%         0.00%
 -9   -0.005520         0.55%         0.00%
 -8    0.018405         1.84%         0.03%
 -7   -0.053376         5.34%         0.28%
 -6    0.131049        13.10%         1.72%
 -5   -0.261141        26.11%         6.82%
 -4    0.391232        39.12%        15.31%
 -3   -0.364831        36.48%        13.31%
 -2    0.046565         4.66%         0.22%
 -1    0.327579        32.76%        10.73%
  0   -0.177597        17.76%         3.15%
  1   -0.327579        32.76%        10.73%
  2    0.046565         4.66%         0.22%
  3    0.364831        36.48%        13.31%
  4    0.391232        39.12%        15.31%
  5    0.261141        26.11%         6.82%
  6    0.131049        13.10%         1.72%
  7    0.053376         5.34%         0.28%
  8    0.018405         1.84%         0.03%
  9    0.005520         0.55%         0.00%
 10    0.001468         0.15%         0.00%
 11    0.000351         0.04%         0.00%
 12    0.000076         0.01%         0.00%
 13    0.000015         0.00%         0.00%
 14    0.000003         0.00%         0.00%
 15    0.000000         0.00%         0.00%

Conservação de potência: Σ J_n²(β) = 1.0000000000 (deve ser 1.0)
Figura

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 np
import matplotlib.pyplot as plt
from scipy.special import jv

betas = [0.1, 0.5, 1.0, 2.0, 5.0, 10.0]
n_max_search = 50

fig, ax = plt.subplots(figsize=(10, 5))

results = []
for beta in betas:
    n_vals = np.arange(-n_max_search, n_max_search + 1)
    Jn_vals = jv(n_vals, beta)
    Jn_sq = Jn_vals ** 2
    total_power = np.sum(Jn_sq)

    # Somar do centro para as laterais até 99%
    cumulative = Jn_sq[n_max_search]  # portadora n=0
    k_found = 0
    for k in range(1, n_max_search + 1):
        cumulative += Jn_sq[n_max_search + k] + Jn_sq[n_max_search - k]
        if cumulative / total_power >= 0.99:
            k_found = k
            break

    n_components = 2 * k_found + 1  # portadora + k pares
    B_carson_kHz = 2 * (beta + 1)
    B_99_kHz = 2 * k_found

    results.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()

for beta, nc, bc, b99 in results:
    print(f"β = {beta:.1f}: {nc} componentes para 99%, Carson ≈ {bc:.1f} (99% ≈ {b99:.1f})")
Output:
β = 0.1: 3 componentes para 99%, Carson ≈ 2.2 (99% ≈ 2.0)
β = 0.5: 3 componentes para 99%, Carson ≈ 3.0 (99% ≈ 2.0)
β = 1.0: 5 componentes para 99%, Carson ≈ 4.0 (99% ≈ 4.0)
β = 2.0: 7 componentes para 99%, Carson ≈ 6.0 (99% ≈ 6.0)
β = 5.0: 13 componentes para 99%, Carson ≈ 12.0 (99% ≈ 12.0)
β = 10.0: 25 componentes para 99%, Carson ≈ 22.0 (99% ≈ 24.0)
Figura

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 np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

# Parâmetros
fs = 500e3        # taxa de amostragem
fc = 10e3         # frequência portadora (simulação em baseband)
fm = 1e3          # frequência da mensagem
df = 5e3          # desvio de frequência
beta = df / fm
tau = 75e-6       # constante de tempo de de-ênfase
f0 = 1 / (2 * np.pi * tau)  # frequência de corte de pré-ênfase

# Tempo
T = 0.02
t = 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.3
m = m_tone + noise

# Pré-ênfase: filtro passa-altas de 1ª ordem
alpha = np.exp(-1.0 / (fs * tau))
m_pre = np.zeros_like(m)
m_pre[0] = m[0]
for i in range(1, len(m)):
    m_pre[i] = (m[i] - m[i-1]) + alpha * m_pre[i-1]

# Gerar sinal FM
phase = 2 * np.pi * fc * t + 2 * np.pi * df * np.cumsum(m_pre) / fs
s_fm = np.cos(phase)

# Adicionar ruído ao canal
snr_db = 20
snr_linear = 10 ** (snr_db / 10)
signal_power = np.mean(s_fm ** 2)
noise_power = signal_power / snr_linear
n_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ª ordem
m_de = np.zeros_like(m_demod)
m_de[0] = m_demod[0] * (1 - alpha)
for i in range(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_clean
snr_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 comparativo
fig, 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
Figura

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 np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

# Parâmetros
fs = 200e3
fm = 1e3
t = 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))

for beta in betas_plot:
    df = beta * fm
    fc = 10 * fm  # fc >> fm para evitar aliasing

    m = np.cos(2 * np.pi * fm * t)
    phase = 2 * np.pi * fc * t + 2 * np.pi * df * np.cumsum(m) / fs
    s_fm = np.cos(phase)

    snr_out_list = []
    for snr_db in snr_range_db:
        snr_lin = 10 ** (snr_db / 10)
        sig_power = np.mean(s_fm ** 2)
        noise_power = sig_power / snr_lin
        r = s_fm + np.random.randn(len(t)) * np.sqrt(noise_power)

        # Demodulação I/Q
        z = 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_db
    ax.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 β).
Figura

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!

E2. 5ª lateral superior: $f_c + 5f_m = 100\text{ MHz} + 5f_m$. 5ª lateral inferior: $f_c - 5f_m = 100\text{ MHz} - 5f_m$. Amplitude relativa: $A_c|J_5(3)|$. Numericamente, $J_5(3) \approx 0{,}0862$ e $J_{-5}(3) = (-1)^5 J_5(3) = -0{,}0862$. Ambas têm amplitude $0{,}0862\,A_c$ (8{,}62% da portadora não modulada).

E3. Para $\beta \to 0$: $J_0(\beta) \to 1$, $J_{\pm 1}(\beta) \to \pm\beta/2$, $J_n(\beta) \to 0$ para $|n|\geq 2$. Substituindo na expansão $s_{\text{FM}}(t) = A_c\sum J_n(\beta)\cos[2\pi(f_c+nf_m)t]$:

$$ s_{\text{FM}}(t) \to A_c\cos(2\pi f_c t) + \frac{A_c\beta}{2}\cos[2\pi(f_c-f_m)t] - \frac{A_c\beta}{2}\cos[2\pi(f_c+f_m)t]. $$

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.

E4. Para $n=1$: $J_0(\beta) + J_2(\beta) = \dfrac{2}{\beta}J_1(\beta)$. Rearranjando: $\boxed{J_2(\beta) = \dfrac{2}{\beta}J_1(\beta) - J_0(\beta)}$.

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.

E8. $\beta' = 64 \times 0{,}2 = 12{,}8$. $f_c' = 64 \times 200\text{ kHz} = 12{,}8\text{ MHz}$. $B_C' = 2(\beta'+1)f_m = 2(13{,}8)(3) = 82{,}8\text{ kHz}$.

E9. $\phi \approx n_s/A_c$. O discriminador diferencia: $d\phi/dt = \dfrac{1}{A_c} \dfrac{dn_s}{dt}$. No domínio da frequência: $\mathcal{F}\{d\phi/dt\} = j2\pi f\,\Phi(f) = j2\pi f\,\dfrac{N_s(f)}{A_c}$. $S_{n_{\text{out}}}(f) = |K_d|^2\cdot (2\pi f)^2 \cdot \dfrac{N_0}{A_c^2}$. $\blacksquare$

E10. $\displaystyle\int_{-W}^{W} f^2\,df = \left[\dfrac{f^3}{3}\right]_{-W}^{W} = \dfrac{W^3 - (-W^3)}{3} = \dfrac{2W^3}{3}$. $P_{n_{\text{out}}} = \displaystyle\int_{-W}^{W} K_d^2(2\pi f)^2\dfrac{N_0}{A_c^2}\,df = \dfrac{K_d^2 4\pi^2 N_0}{A_c^2}\cdot \dfrac{2W^3}{3} = \dfrac{8\pi^2 K_d^2 N_0 W^3}{3A_c^2}$. $\blacksquare$

E11. $f_0 = \dfrac{1}{2\pi\cdot 75\times 10^{-6}} \approx 2122\text{ Hz}$. Atenuação: $|H_{\text{de}}(f)| = \dfrac{1}{\sqrt{1+(f/f_0)^2}}$. Para $f = 10\text{ kHz}$: $|H| = \dfrac{1}{\sqrt{1+(10000/2122)^2}} = \dfrac{1}{\sqrt{23{,}22}} \approx 0{,}2075 = -13{,}7\text{ dB}$. Para $f = 15\text{ kHz}$: $|H| = \dfrac{1}{\sqrt{1+(15000/2122)^2}} = \dfrac{1}{\sqrt{50{,}13}} \approx 0{,}1413 = -17{,}0\text{ dB}$. Razão de atenuação entre 15 kHz e 10 kHz: $3{,}3\text{ dB}$ adicional.

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:

$$ \frac{1}{2\pi}\int_{-\pi}^{\pi} |e^{j\beta\sin\theta}|^2\,d\theta = \sum_{n=-\infty}^{\infty} |J_n(\beta)|^2. $$

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:

$$ s(t) = \sum_{k=-\infty}^{\infty} a_k\, p(t - kT_s). \tag{1.1} $$

5.2.2 Representação Vetorial

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}]$:

$$ P=\frac1{T_s}\sum_{m=-\infty}^{\infty}R_{aa}[m]r_p(mT_s),\qquad r_p(\tau)=\int p(t)p^*(t-\tau)dt. \tag{1.2} $$

A média temporal sobre uma fase completa de símbolo é necessária porque a forma de onda PAM aleatória é, em geral, cicloestacionária.

5.2.3 M-PAM e Constelações

A constelação M-PAM centrada na origem pode ser escrita, para $M$ par ou ímpar, como

$$ \mathcal A_M=\{(2i-M+1)A:\ i=0,\ldots,M-1\}. $$

Os pontos adjacentes estão separados por $d_{\min}=2A$. Como

$$ \frac1M\sum_{i=0}^{M-1}(2i-M+1)^2=\frac{M^2-1}{3}, $$

temos $E_s=A^2(M^2-1)/3$. Para $E_s=1$,

$$ \boxed{A=\sqrt{\frac{3}{M^2-1}},\qquad d_{\min}=\sqrt{\frac{12}{M^2-1}}.} \tag{1.3} $$

5.3 Espectro de Sequências PAM Aleatórias

5.3.1 Espectro de Sequência Periódica

Se $a_k$ é periódica com período $N$, então $s(t)$ é quase-periódica com período $NT_s$. Expandindo $a_k$ em série de Fourier discreta:

$$ a_k = \sum_{n=-\infty}^{\infty} c_n\, e^{j2\pi n k/N}, $$

onde $c_n = \frac{1}{N}\sum_{k=0}^{N-1} a_k\, e^{-j2\pi nk/N}$. Substituindo em (1.1):

$$ s(t) = \sum_{n} c_n \sum_{k} e^{j2\pi n k/N} p(t - kT_s). $$

O espectro é discreto:

$$ \boxed{S(f)=\frac{1}{T_s}P(f)\sum_{k=-\infty}^{\infty}c_{k\bmod N}\, \delta\!\left(f-\frac{k}{NT_s}\right).} \tag{2.1} $$

Os coeficientes $c_n$ são periódicos em $n$ com período $N$; por isso aparece $c_{k\bmod N}$, e não um coeficiente com índice fracionário.

Para sequência periódica com média $\bar{a}$, o termo DC é:

$$ S(0) = \frac{\bar{a}}{T_s}P(0). $$

5.3.2 Densidade Espectral de Potência — Sequência Aleatória

Defina $C_{aa}[m]=\mathbb E[(a_k-\mu_a)(a_{k-m}-\mu_a)]$ e sua DTFT

$$ S_a(e^{j\Omega})=\sum_{m=-\infty}^{\infty}C_{aa}[m]e^{-j\Omega m}. $$

Então

$$ \boxed{S_s(f)=\frac{|P(f)|^2}{T_s}S_a(e^{j2\pi fT_s}) +\frac{\mu_a^2}{T_s^2}|P(f)|^2\sum_{\ell=-\infty}^{\infty} \delta\!\left(f-\frac{\ell}{T_s}\right).} \tag{2.2} $$

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$:

$$ \boxed{S_s(f) = \frac{\sigma_a^2}{T_s}\,|P(f)|^2.} \tag{2.3} $$
$$ S_s(f) = \sigma_a^2 T_s \operatorname{sinc}^2(fT_s). $$

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)$:

$$ y(t) = s(t) * h_c(t) * h_r(t) + n(t) = \sum_k a_k g(t - kT_s) + n(t), $$

onde $g(t) = (p * h_c * h_r)(t)$ e $n(t)$ é o ruído aditivo.

Amostrando em $t = nT_s$:

$$ y[n] = y(nT_s) = \underbrace{a_n g(0)}_{\text{símbolo desejado}} + \underbrace{\sum_{k \ne n} a_k g((n-k)T_s)}_{\text{ISI}} + n[n]. \tag{3.1} $$

5.4.2 Condição de Ausência de ISI

Para eliminar ISI, exigimos:

$$ \boxed{g(nT_s) = \begin{cases} 1, & n = 0, \\ 0, & n \ne 0. \end{cases}} \tag{3.2} $$

Com essa condição, $y[n] = a_n + n[n]$, e a decisão é direta.

5.4.3 Exemplo Numérico de ISI

$$ y[n] = \sum_k a_k \operatorname{sinc}((n-k)) = a_0 \operatorname{sinc}(n) + a_1 \operatorname{sinc}(n-1). $$

Para $n = 0$: $y[0] = a_0\operatorname{sinc}(0) + a_1\operatorname{sinc}(-1) = 1 + 0 = 1$. ✓
Para $n = 1$: $y[1] = a_0\operatorname{sinc}(1) + a_1\operatorname{sinc}(0) = 0 + 1 = 1$. ✓
Para $n = 2$: $y[2] = a_0\operatorname{sinc}(2) + a_1\operatorname{sinc}(1) = 0$. ✓

O pulso sinc satisfaz perfeitamente a condição de Nyquist.

5.5 Critério de Nyquist para Ausência de ISI

5.5.1 Enunciado do Primeiro Critério de Nyquist

$$ \boxed{\frac{1}{T_s}\sum_{\ell=-\infty}^{\infty}G\!\left(f-\frac{\ell}{T_s}\right)=1.} \tag{4.1} $$

Se $g(0)=A$ em outra normalização, o lado direito passa a ser $A$.

5.5.2 Prova no Domínio da Frequência

$$ g_s(t)=g(t)\sum_n\delta(t-nT_s)=\sum_ng(nT_s)\delta(t-nT_s). $$

Se $g(nT_s)=\delta[n]$, então $g_s(t)=\delta(t)$ e sua transformada é 1. Multiplicação no tempo corresponde a convolução na frequência:

$$ G_s(f)=G(f)*\frac1{T_s}\sum_\ell\delta\!\left(f-\frac{\ell}{T_s}\right) =\frac1{T_s}\sum_\ell G\!\left(f-\frac{\ell}{T_s}\right). $$

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

$$ \boxed{R_s^{\max} = 2B \quad \text{símbolos/s}.} \tag{4.4} $$

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$

5.5.5 Condição de Simetria Hilbert

$$ G\!\left(\frac{1}{2T_s} + \nu\right) + G\!\left(\frac{1}{2T_s} - \nu\right) = T_s, \quad |\nu| \le \frac{1}{2T_s}. \tag{4.5} $$

Esta é a condição de "complementar simetria" ou "Hilbert-symmetry" em relação à frequência de Nyquist $f_N = 1/(2T_s)$.

5.6 Pulso Sinc — Banda Mínima

5.6.1 Pulso de Banda Mínima

O pulso que alcança a taxa máxima de Nyquist com a menor largura de banda possível é o pulso sinc:

$$ \boxed{p(t) = \operatorname{sinc}\!\left(\frac{t}{T_s}\right) = \frac{\sin(\pi t/T_s)}{\pi t/T_s}.} \tag{5.1} $$

Seu espectro é o retânguo:

$$ \boxed{P(f) = T_s \operatorname{rect}(fT_s) = \begin{cases} T_s, & |f| \le \frac{1}{2T_s}, \\ 0, & \text{caso contrário}. \end{cases}} \tag{5.2} $$

5.6.2 Verificação da Condição de Nyquist

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$

5.6.3 Propriedades do Pulso Sinc

  1. É infinito no tempo → requer truncamento com perda.
  2. Decaimento lento $1/t$ → sensível a erros de temporização.
  3. Qualquer offset de amostragem $\epsilon$ causa ISI: $p(\epsilon + kT_s) \ne 0$ para $k \ne 0$.

5.6.4 Sensibilidade a Erro de Temporização

$$ p(nT_s + \epsilon) = \operatorname{sinc}\!\left(n + \frac{\epsilon}{T_s}\right). $$

Para $n = 1$: interferência do símbolo vizinho é $\operatorname{sinc}(1 + \epsilon/T_s) = \frac{\sin(\pi(1 + \epsilon/T_s))}{\pi(1 + \epsilon/T_s)} = \frac{-\sin(\pi\epsilon/T_s)}{\pi(1 + \epsilon/T_s)}$.

Para $\epsilon/T_s = 0{,}01$: interferência $\approx -0{,}0318$, ou seja, ~3% do símbolo desejado. Isso é significativo em sistemas de alta ordem.

5.7 Dedução do Pulso Raised Cosine

5.7.1 Motivação

O pulso sinc é impraticável por decrescer lentamente ($1/t$). O pulso raised cosine (RC) oferece:

  1. Zeros exatos em $t = kT_s$ ($k \ne 0$).
  2. Decaimento rápido ($1/t^3$), tornando-o robusto a erros de temporização.
  3. Banda controlada pelo parâmetro $\alpha \in [0, 1]$.

5.7.2 Definição do Espectro RC

$$ P_{\text{RC}}(f) = \begin{cases} T_s, & 0 \le |f| \le \dfrac{1-\alpha}{2T_s}, \\[8pt] \dfrac{T_s}{2}\left[1 + \cos\left(\dfrac{\pi T_s}{\alpha}\left(|f| - \dfrac{1-\alpha}{2T_s}\right)\right)\right], & \dfrac{1-\alpha}{2T_s} < |f| \le \dfrac{1+\alpha}{2T_s}, \\[8pt] 0, & |f| > \dfrac{1+\alpha}{2T_s}. \end{cases} \tag{6.1} $$

A banda unilateral é:

$$ \boxed{B_{\text{RC}} = \frac{1+\alpha}{2T_s}.} \tag{6.2} $$

5.7.3 Verificação da Simetria de Nyquist

Devemos verificar $P_{\text{RC}}(f_N + \nu) + P_{\text{RC}}(f_N - \nu) = T_s$ para $f_N = 1/(2T_s)$ e $|\nu| \le 1/(2T_s)$.

Para $\nu \in [-\frac{\alpha}{2T_s}, \frac{\alpha}{2T_s}]$ (zona do rolloff):

$$ P_{\text{RC}}\!\left(\frac{1}{2T_s} + \nu\right) = \frac{T_s}{2}\left[1 + \cos\left(\frac{\pi T_s}{\alpha}\left(\frac{1}{2T_s} + \nu - \frac{1-\alpha}{2T_s}\right)\right)\right] = \frac{T_s}{2}\left[1 + \cos\left(\frac{\pi}{2} + \frac{\pi T_s \nu}{\alpha}\right)\right] $$
$$ = \frac{T_s}{2}\left[1 - \sin\left(\frac{\pi T_s \nu}{\alpha}\right)\right]. $$

Da mesma forma:

$$ P_{\text{RC}}\!\left(\frac{1}{2T_s} - \nu\right) = \frac{T_s}{2}\left[1 + \sin\left(\frac{\pi T_s \nu}{\alpha}\right)\right]. $$

Somando: $\frac{T_s}{2}[1 - \sin] + \frac{T_s}{2}[1 + \sin] = T_s$. ✓

Para $\nu$ fora da zona de rolloff, um dos termos é $T_s$ e outro é $0$, somando $T_s$. ✓

Para $\nu$ fora do suporte ($|\nu| > (1+\alpha)/(2T_s)$), ambos são zero e a condição não se aplica. $\blacksquare$

5.7.4 DEDUÇÃO do Formato no Tempo

A resposta temporal é obtida pela inversa de Fourier:

$$ p_{\text{RC}}(t) = \int_{-\infty}^{\infty} P_{\text{RC}}(f)\, e^{j2\pi f t}\, df = 2\int_{0}^{\infty} P_{\text{RC}}(f)\cos(2\pi f t)\, df. \tag{6.3} $$

Substituindo (6.1):

$$ p_{\text{RC}}(t) = \frac{2}{T_s}\int_0^{\frac{1-\alpha}{2T_s}} T_s\cos(2\pi f t)\, df + \frac{2}{T_s}\int_{\frac{1-\alpha}{2T_s}}^{\frac{1+\alpha}{2T_s}} \frac{T_s}{2}\left[1 + \cos\!\left(\frac{\pi T_s}{\alpha}\left(f - \frac{1-\alpha}{2T_s}\right)\right)\right]\cos(2\pi f t)\, df. \tag{6.4} $$

Primeira integral (região plana):

$$ I_1 = 2\int_0^{\frac{1-\alpha}{2T_s}} \cos(2\pi f t)\, df = 2\left[\frac{\sin(2\pi f t)}{2\pi t}\right]_0^{\frac{1-\alpha}{2T_s}} = \frac{\sin(\pi t(1-\alpha)/T_s)}{\pi t}. $$

Segunda integral (região de rolloff): Fazendo $u = f - \frac{1-\alpha}{2T_s}$, de $0$ a $\alpha/T_s$:

$$ I_2 = \int_0^{\frac{\alpha}{T_s}} \left[1 + \cos\left(\frac{\pi T_s}{\alpha}u\right)\right]\cos\!\left(2\pi t\left(u + \frac{1-\alpha}{2T_s}\right)\right)\, du. \tag{6.5} $$

Expandindo $\cos(2\pi t(u + \frac{1-\alpha}{2T_s})) = \cos(2\pi tu)\cos\!\left(\frac{\pi t(1-\alpha)}{T_s}\right) - \sin(2\pi tu)\sin\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)$.

O termo constante 1 multiplicado pelo cosseno:

$$ \cos\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)\int_0^{\alpha/T_s}\!\!\cos(2\pi tu)\, du - \sin\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)\int_0^{\alpha/T_s}\!\!\sin(2\pi tu)\, du $$
$$ = \cos\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)\frac{\sin(\pi\alpha t/T_s)}{\pi t} - \sin\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)\frac{1-\cos(\pi\alpha t/T_s)}{\pi t}. $$

O termo com $\cos(\frac{\pi T_s}{\alpha}u)\cos(2\pi tu)$: usando $\cos A\cos B = \frac{1}{2}[\cos(A-B)+\cos(A+B)]$:

$$ \frac{1}{2}\int_0^{\alpha/T_s}\left[\cos\!\left((2\pi t + \frac{\pi T_s}{\alpha})u\right) + \cos\!\left((2\pi t - \frac{\pi T_s}{\alpha})u\right)\right]\cos\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)du $$
$$ -\frac{1}{2}\int_0^{\alpha/T_s}\left[\sin\!\left((2\pi t + \frac{\pi T_s}{\alpha})u\right) + \sin\!\left((2\pi t - \frac{\pi T_s}{\alpha})u\right)\right]\sin\!\left(\frac{\pi t(1-\alpha)}{T_s}\right)du. $$

Essas integrais produzem termos proporcionais a $\frac{\sin(\frac{\pi\alpha t}{2T_s}\pm\pi t)}{\dots}$. Após simplificações trigonométricas extensas (detalhadas abaixo):

$$ p_{\text{RC}}(t) = \operatorname{sinc}\!\left(\frac{t}{T_s}\right)\cdot \frac{\cos(\alpha\pi t/T_s)}{1 - (2\alpha t/T_s)^2}. \tag{6.6} $$

5.7.5 Dedução Detalhada do Resultado Final

Vamos consolidar os cálculos. Para $t \neq 0$:

$$ p_{\text{RC}}(t) = \frac{\sin(\pi t/T_s)}{\pi t/T_s} \cdot \frac{\cos(\alpha\pi t/T_s)}{1 - (2\alpha t/T_s)^2}. \tag{6.7} $$

Verificação para $\alpha = 0$:

$$ p_{\text{RC}}(t)|_{\alpha=0} = \operatorname{sinc}(t/T_s) \cdot \frac{1}{1 - 0} = \operatorname{sinc}(t/T_s). \quad \blacksquare $$

Verificação para $\alpha = 1$:

$$ p_{\text{RC}}(t)|_{\alpha=1} = \operatorname{sinc}(t/T_s) \cdot \frac{\cos(\pi t/T_s)}{1 - (2t/T_s)^2} = \frac{\sin(\pi t/T_s)\cos(\pi t/T_s)}{\pi t/T_s(1-4t^2/T_s^2)} = \frac{\frac{1}{2}\sin(2\pi t/T_s)}{\pi t/T_s(1-4t^2/T_s^2)}. $$

5.7.6 Valores nas Singularidades

A expressão (6.6) é indeterminada para $t = 0$ e para $t = \pm T_s/(2\alpha)$ (quando $\alpha > 0$).

Para $t = 0$:

$$ \lim_{t\to 0} p_{\text{RC}}(t) = \lim_{t\to 0}\frac{\sin(\pi t/T_s)}{\pi t/T_s} \cdot \lim_{t\to 0}\frac{\cos(\alpha\pi t/T_s)}{1 - (2\alpha t/T_s)^2} = 1 \cdot 1 = 1. \quad \blacksquare $$

Para $t = \pm T_s/(2\alpha)$: (quando $\alpha > 0$)

Usando L'Hôpital ou expansão de Taylor:

$$ \lim_{t\to \pm T_s/(2\alpha)} p_{\text{RC}}(t) = \frac{\pi}{4}\operatorname{sinc}\!\left(\frac{1}{2\alpha}\right)(1 \pm \frac{4\alpha}{\pi}). \tag{6.8} $$

5.8 Propriedades do Pulso Raised Cosine

5.8.1 Zeros em $t = kT_s$, $k \ne 0$

De (6.6), $p_{\text{RC}}(kT_s) = \operatorname{sinc}(k) \cdot \frac{\cos(\alpha\pi k)}{1 - (2\alpha k)^2} = 0 \cdot (\dots) = 0$, pois $\operatorname{sinc}(k) = 0$ para inteiro não-nulo. $\blacksquare$

5.8.2 Decaimento

Para $\alpha = 0$, o decaimento é $O(1/t)$ (pulso sinc puro).

5.8.3 Largura de Banda vs. Fator $\alpha$

A banda unilateral é $B = \frac{1+\alpha}{2T_s}$:

$\alpha$ Banda $B$ Eficiência espectral $\eta = \log_2 M / B$
0 $1/(2T_s)$ Máxima (banda mínima)
0,25 $1,25/(2T_s)$ 80% da máxima
0,5 $1,5/(2T_s)$ 67% da máxima
1 $1/T_s$ 50% da máxima

5.8.4 Visualização dos Pulsos

5.9 Root-Raised Cosine e Filtros Casados

5.9.1 Filtro Casado

$$ \boxed{h_{\text{MF}}(t) = K\, p^*(T_0 - t),} \tag{8.1} $$

onde $K$ é uma constante e $T_0$ é o tempo de amostragem.

$$ \text{SNR}_{\max} = \frac{2E_p}{N_0}, \quad E_p = \int_{-\infty}^{\infty} |p(t)|^2 dt. $$

A saída do filtro em $t = T_0$ é:

$$ y(T_0) = \int_{-\infty}^{\infty} p(\tau)h(T_0 - \tau)\, d\tau = \int p(\tau)h^*(T_0-\tau)\, d\tau \quad (\text{para } p \text{ real}). $$

Pela desigualdade de Cauchy-Schwarz:

$$ |y(T_0)|^2 = \left|\int p(\tau)h^*(T_0-\tau)\, d\tau\right|^2 \le \int |p(\tau)|^2 d\tau \int |h(T_0-\tau)|^2 d\tau = E_p \cdot E_h. $$

A potência do ruído na saída é:

$$ P_n = \frac{N_0}{2}\int_{-\infty}^{\infty} |H(f)|^2 df = \frac{N_0}{2}\int_{-\infty}^{\infty} |h(t)|^2 dt = \frac{N_0}{2}E_h. $$

Logo, $\text{SNR} = \frac{|y(T_0)|^2}{P_n} \le \frac{E_p E_h}{(N_0/2)E_h} = \frac{2E_p}{N_0}$.

A igualdade ocorre quando $h(T_0 - \tau) \propto p^*(\tau)$, ou seja, $h(t) \propto p^*(T_0 - t)$. $\blacksquare$

5.9.2 Root-Raised Cosine (RRC)

$$ P_{\text{RRC}}(f) = \sqrt{P_{\text{RC}}(f)} = \begin{cases} \sqrt{T_s}, & 0 \le |f| \le \dfrac{1-\alpha}{2T_s}, \\[8pt] \sqrt{\dfrac{T_s}{2}\left[1 + \cos\left(\dfrac{\pi T_s}{\alpha}\left(|f| - \dfrac{1-\alpha}{2T_s}\right)\right)\right]}, & \dfrac{1-\alpha}{2T_s} < |f| \le \dfrac{1+\alpha}{2T_s}, \\[8pt] 0, & \text{caso contrário}. \end{cases} \tag{8.2} $$

5.9.3 Split RC: Transmissor e Receptor

$$ \boxed{H_T(f) \cdot H_R(f) = P_{\text{RC}}(f).} \tag{8.3} $$

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)$:

$$ p_{\text{RRC}}(t)=\frac1{\sqrt{T_s}}\, \frac{\sin\!\bigl(\pi(1-\alpha)t/T_s\bigr)+4\alpha(t/T_s)\cos\!\bigl(\pi(1+\alpha)t/T_s\bigr)} {\pi(t/T_s)\left[1-(4\alpha t/T_s)^2\right]}. \tag{8.4} $$

Para $t = 0$:

$$ p_{\text{RRC}}(0)=\frac1{\sqrt{T_s}}\left[1+\alpha\left(\frac4\pi-1\right)\right]. \tag{8.5} $$

Para $t = \pm T_s/(4\alpha)$:

$$ p_{\text{RRC}}\!\left(\pm \frac{T_s}{4\alpha}\right) = \frac{\alpha}{\sqrt{2T_s}}\left[\left(1 + \frac{2}{\pi}\right)\sin\!\left(\frac{\pi}{4\alpha}\right) + \left(1 - \frac{2}{\pi}\right)\cos\!\left(\frac{\pi}{4\alpha}\right)\right]. \tag{8.6} $$

5.9.5 Exemplo: Sistema Completo RRC

  1. Transmissor: símbolos $a_k$ → pulso $p_{\text{RRC}}(t-kT_s)$.
  2. Canal: AWGN.
  3. Receptor: filtro RRC, amostra em $t = nT_s$.
  4. Saída: $y[n] = a_n(p_{\text{RRC}} * p_{\text{RRC}})(0) + \text{ISI} + n[n] = a_n + n[n]$.

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.

5.10 Representação Complexa e I/Q

5.10.1 Sinal Banda Base Complexo

$$ \boxed{\tilde{s}(t) = I(t) + jQ(t),} \tag{9.1} $$

onde $I(t)$ é o componente em fase (in-phase) e $Q(t)$ é o componente quadratura (quadrature).

5.10.2 Relação com Banda Passante

O sinal banda passante correspondente é:

$$ s_{\text{BP}}(t) = \operatorname{Re}\left\{\tilde{s}(t)\,e^{j2\pi f_c t}\right\} = I(t)\cos(2\pi f_c t) - Q(t)\sin(2\pi f_c t). \tag{9.2} $$

5.10.3 Representação de Envelope e Fase

$$ \boxed{\gamma(t) = \sqrt{I^2(t) + Q^2(t)}, \qquad \phi(t) = \arg(I(t) + jQ(t)).} \tag{9.3} $$

O sinal banda passante pode ser escrito:

$$ 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):

RZ (Return-to-Zero):

Manchester:

AMI (Alternate Mark Inversion):

HDB3 (High-Density Bipolar 3):

5.11.2 Códigos com Balanceamento DC

5.11.3 Eye Diagram (Diagrama de Olho)

O eye diagram revela:

  1. ISI: "Fechamento" dos olhos. Quanto mais aberto, menor ISI.
  2. Jitter: Espessura horizontal dos cruzamentos.
  3. Ruído: Espessura vertical nas aberturas.
  4. 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$ é

$$ V_{\text{open}}(t)=\min_{y\in\mathcal Y_1(t)}y-\max_{y\in\mathcal Y_0(t)}y, $$

e escolhe-se o instante de maior abertura:

$$ \boxed{V_{\text{open}}=\max_tV_{\text{open}}(t).} \tag{10.1} $$

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.

PYTHON
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch

np.random.seed(42)
T_s = 1.0
sps = 16          # samples per symbol
N_sym = 4096

# Sequência aleatória 4-PAM
a = np.random.choice(np.array([-3, -1, 1, 3]), size=N_sym)

# Pulso retangular
rect = np.ones(sps)

# Pulso RC (alpha=0.35)
def rc_pulse(t, T_s, alpha):
    scalar_input = np.ndim(t) == 0
    t = np.atleast_1d(t)
    if alpha == 0:
        y = np.sinc(t / T_s)
        return y.item() if scalar_input else y
    den = 1 - (2 * alpha * t / T_s) ** 2
    with np.errstate(divide='ignore', invalid='ignore'):
        y = np.sinc(t / T_s) * np.cos(np.pi * alpha * t / T_s) / den
    # tratar singularidades
    mask = np.isclose(np.abs(2 * alpha * t / T_s), 1, atol=1e-6)
    y[mask] = np.pi / 4 * np.sinc(1 / (2 * alpha))
    y[np.isclose(t / T_s, 0, atol=1e-6)] = 1.0
    return y.item() if scalar_input else y

alpha = 0.35
rc = rc_pulse(np.arange(-5*sps, 5*sps+1) / sps, T_s, alpha)
rc = rc / np.sqrt(np.mean(rc**2))  # normalizar

# Transmitir
u_rect = np.zeros(len(a) * sps)
u_rect[::sps] = a
u_rc = np.convolve(a, rc, mode='full')

# PSD via Welch
fs = sps / T_s
f_rect, P_rect = welch(u_rect, fs=fs, nperseg=min(2**14, len(u_rect)))
f_rc, P_rc = welch(u_rc, fs=fs, nperseg=min(2**14, len(u_rc)))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].plot(f_rect, 10*np.log10(P_rect), label='4-PAM, pulso retangular')
ax[0].set(xlabel='f (symb⁻¹)', ylabel='PSD (dB)', title='PSD: Pulso Retangular')
ax[0].grid(True)
ax[0].legend()
ax[1].plot(f_rc, 10*np.log10(P_rc), label=f'4-PAM, pulso RC (α={alpha})')
ax[1].set(xlabel='f (symb⁻¹)', ylabel='PSD (dB)', title=f'PSD: Pulso RC (α={alpha})')
ax[1].grid(True)
ax[1].legend()
plt.tight_layout()
plt.show()
Figura

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 np
import matplotlib.pyplot as plt

def rc_time(t, T_s, alpha):
    if alpha == 0:
        return np.sinc(t / T_s)
    den = 1 - (2 * alpha * t / T_s) ** 2
    with np.errstate(divide='ignore', invalid='ignore'):
        y = np.sinc(t / T_s) * np.cos(np.pi * alpha * t / T_s) / den
    singular = 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.0
    return y

def rc_spec(f, T_s, alpha):
    if alpha == 0:
        return T_s * (np.abs(f) <= 1 / (2 * T_s))
    B = (1 + alpha) / (2 * T_s)
    G = np.zeros_like(f)
    # região plana
    flat = np.abs(f) <= (1 - alpha) / (2 * T_s)
    G[flat] = T_s
    # região de rolloff
    rolloff = (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))
    return G

T_s = 1.0
t = 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]
for alpha in alphas:
    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)

for alpha in alphas:
    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()
Figura

5.12.4 Exercício 3: Eye Diagram para Diferentes Fatores $\alpha$

PYTHON
import numpy as np
import matplotlib.pyplot as plt

def rrc_pulse(t, T_s, alpha):
    if alpha == 0:
        return np.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)
    with np.errstate(divide='ignore', invalid='ignore'):
        h = num / den
    # t = 0
    mask0 = 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)
    if np.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)))
    return h

T_s = 1.0
sps = 8
N_sym = 500
np.random.seed(0)
a = 2 * np.random.randint(0, 2, N_sym) - 1  # BPSK

alphas = [0, 0.25, 0.5, 0.75, 1.0]
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
axes = axes.ravel()

for idx, alpha in enumerate(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

    # transmit
    u = np.zeros(len(a) * sps)
    u[::sps] = a
    tx = np.convolve(u, h, mode='full')

    # eye diagram
    eye_len = 2 * sps
    start = N_sym * sps // 2
    for k in range(start // sps, start // sps + 200):
        segment = tx[k*sps: min(k*sps+eye_len, len(tx))]
        if len(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)
    if idx == 0:
        axes[idx].set_ylabel('amplitude')

# último subplot vazio ou com info
axes[-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')
for ax in axes[:-1]:
    ax.axhline(0, color='k', linewidth=0.5)

plt.tight_layout()
plt.show()
Figura

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 np
import matplotlib.pyplot as plt

def rc_pulse(t, T_s, alpha):
    scalar_input = np.ndim(t) == 0
    t = np.atleast_1d(t)
    if alpha == 0:
        y = np.sinc(t / T_s)
        return y.item() if scalar_input else y
    den = 1 - (2 * alpha * t / T_s) ** 2
    with np.errstate(divide='ignore', invalid='ignore'):
        y = np.sinc(t / T_s) * np.cos(np.pi * alpha * t / T_s) / den
    singular = 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.0
    return y.item() if scalar_input else y

T_s = 1.0
t = np.linspace(-5, 5, 2001)

# Sequência: símbolo principal em k=0, interferentes em k=-2..-1, 1..2
a = {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_s

fig, axes = plt.subplots(2, 2, figsize=(14, 10))
for idx, eps in enumerate(errors):
    ax = axes[idx // 2, idx % 2]
    for alpha in alphas:
        g = np.array([rc_pulse((n + eps) * T_s, T_s, alpha) * a.get(n, 0)
                       for n in range(-2, 3)])
        ISI = sum(g[n] for n in range(-2, 3) if n != 0)
        desired = g[0]
        ax.plot(alpha, abs(ISI) / abs(desired) if abs(desired) > 1e-12 else 0,
                '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érica
print("ISI relativa para diferentes α e ε:")
print(f"{'α':>6} | {'ε=0':>10} | {'ε=0.05':>10} | {'ε=0.1':>10} | {'ε=0.15':>10}")
print("-" * 60)
for alpha in alphas:
    vals = []
    for eps in errors:
        g = np.array([rc_pulse((n + eps) * T_s, T_s, alpha) * a.get(n, 0)
                       for n in range(-2, 3)])
        ISI = sum(g[n] for n in range(-2, 3) if n != 0)
        desired = g[0]
        vals.append(f"{abs(ISI)/abs(desired):.6f}" if abs(desired) > 1e-12 else "N/A")
    print(f"{alpha:>6.2f} | {vals[0]:>10} | {vals[1]:>10} | {vals[2]:>10} | {vals[3]:>10}")
Output:
ISI relativa para diferentes α e ε:
     α |        ε=0 |     ε=0.05 |      ε=0.1 |     ε=0.15
------------------------------------------------------------
  0.00 |        N/A | 376.458830 | 176.839827 | 110.481374
  0.25 |        N/A | 473.978945 | 220.196437 | 136.066980
  0.50 |        N/A | 1063.467719 | 471.514031 | 278.613068
  1.00 |        N/A | 5523.947549 | 2590.311189 | 1651.008194
Figura

5.13 Lista de Exercícios Propostos

E1. Dê a expressão da potência média $P$ de um sinal PAM 8-PAM com $\sigma_a^2 = 7$ e pulso de energia $E_p = 2$, para $T_s = 10^{-6}$ s.

E2. Mostre que para sequência não correlacionada com $\mu_a = 0$, a PSD é $S_s(f) = \frac{\sigma_a^2}{T_s}|P(f)|^2$.

E3. Para $R_s = 10$ Mbaud, calcule a banda de Nyquist mínima e a banda RC com $\alpha = 0{,}35$.

E4. Verifique analiticamente que o pulso $p(t) = \operatorname{sinc}(2Wt)$ satisfaz o critério de Nyquist para $T_s = 1/(2W)$.

E5. Mostre que para $\alpha = 0$, a expressão (6.6) se reduz ao pulso sinc.

E6. Calcule o valor de $p_{\text{RC}}(t)$ em $t = T_s/(2\alpha)$ para $\alpha = 0{,}5$ e $T_s = 1$.

E7. Prove que o decaimento do pulso RC para $\alpha > 0$ é $O(1/t^3)$.

E8. Calcule a SNR máxima de um filtro casado para pulso retangular de amplitude $A$ e duração $T_s$ em AWGN com PSD $N_0/2$.

E9. Para um sistema RRC com $\alpha = 0{,}25$ e $T_s = 2 \times 10^{-6}$ s, calcule a banda unilateral.

E10. Trace o eye diagram conceitual para um canal com ISI severa e compare com um canal sem ISI. Descreva as diferenças.

E11. Justifique por que Manchester tem banda duas vezes maior que NRZ polar.

E12. Para o pulso $g(t) = e^{-|t|/T}$, calcule a ISI no instante de decisão causada por símbolos adjacentes.

5.14 Gabarito

E1. $P = \sigma_a^2 E_p / T_s = 7 \times 2 / 10^{-6} = 14 \times 10^6$ W = 14 MW.

E2. $R_{aa}[m] = \sigma_a^2\delta[m]$, então $\sum_m R_{aa}[m] e^{-j2\pi f m T_s} = \sigma_a^2$. Logo $S_s(f) = \frac{\sigma_a^2}{T_s}|P(f)|^2$.

E3. Nyquist: $B_N = R_s/2 = 5$ MHz. RC ($\alpha=0{,}35$): $B = (1{,}35)R_s/2 = 6{,}75$ MHz.

E4. $p(nT_s) = \operatorname{sinc}(2W \cdot n/(2W)) = \operatorname{sinc}(n) = \delta[n]$. ✓

E5. Para $\alpha = 0$: $\cos(0) = 1$ e $1 - (0)^2 = 1$, logo $p(t) = \operatorname{sinc}(t/T_s) \cdot 1/1 = \operatorname{sinc}(t/T_s)$. ✓

E6. $p_{\text{RC}}(T_s/2) = \operatorname{sinc}(1/2) \cdot \frac{\cos(\pi/4)}{1 - 1}$. Usando limite: $= \frac{\pi}{4}\operatorname{sinc}(2) = \frac{\pi}{4}\cdot \frac{\sin(\pi/2)}{\pi/2} = \frac{1}{2}$.

E7. $\operatorname{sinc}(t) = O(1/t)$ e $\frac{\cos(\alpha\pi t/T_s)}{1-(2\alpha t/T_s)^2} = O(1/t^2)$, então o produto é $O(1/t^3)$. ✓

E8. $E_p = A^2 T_s$. $\text{SNR}_{\max} = 2A^2 T_s / N_0$.

E9. $B = (1{,}25) / (2 \times 2 \times 10^{-6}) = 312{,}500$ Hz = 312,5 kHz.

E10. ISI severa: olhos fechados, cruzamentos dispersos, pouca abertura vertical/horizontal. Sem ISI: olhos amplamente abertos, cruzamentos precisos.

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

6.2.1 Representação de Karhunen-Loève

$$ s_i(t) = \sum_{k=1}^{N} s_{ik}\, \phi_k(t), \quad 0 \le t \le T_s. \tag{1.1} $$

Os coeficientes $s_{ik} = \int_0^{T_s} s_i(t)\phi_k(t)\,dt$ formam o vetor de sinal $\mathbf{s}_i = (s_{i1}, \dots, s_{iN}) \in \mathbb{R}^N$.

$$ \|\mathbf{s}_i - \mathbf{s}_j\|^2 = \int_0^{T_s} |s_i(t) - s_j(t)|^2 dt. \tag{1.2} $$

6.2.2 Receptor Ótimo em AWGN

$$ \hat{i} = \arg\min_i \|\mathbf{r} - \mathbf{s}_i\|^2 = \arg\max_i \left(\mathbf{r} \cdot \mathbf{s}_i - \frac{1}{2}\|\mathbf{s}_i\|^2\right). \tag{1.3} $$

A densidade de probabilidade condicional do vetor recebido $\mathbf{r}$ dado que $\mathbf{s}_i$ foi transmitido é Gaussiana multivariada:

$$ p(\mathbf{r}|\mathbf{s}_i) = \left(\frac{1}{\pi N_0}\right)^{N/2} \exp\left(-\frac{\|\mathbf{r} - \mathbf{s}_i\|^2}{N_0}\right). $$

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:

$$ \|\mathbf{r} - \mathbf{s}_i\|^2 = \|\mathbf{r}\|^2 - 2\mathbf{r} \cdot \mathbf{s}_i + \|\mathbf{s}_i\|^2. $$

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$

6.2.3 Implementação: Correlator ou Filtro Casado

$$ r_k = \int_0^{T_s} r(t)\phi_k(t)\,dt = s_{ik} + n_k, \quad n_k \sim \mathcal{N}(0, N_0/2). $$

Equivalente: filtro casado $h_k(t) = \phi_k(T_s - t)$ para cada $\phi_k$, amostra em $t = T_s$.

6.2.4 Probabilidade de Erro em Função da Distância

Para dois sinais antipodais $\pm\mathbf{s}$ ($\|\mathbf{s}\|^2 = E$), em AWGN:

$$ P_e = Q\left(\frac{\|\mathbf{s} - (-\mathbf{s})\|}{2\sqrt{N_0/2}}\right) =Q\left(\frac{2\sqrt E}{\sqrt{2N_0}}\right) = Q\left(\sqrt{\frac{2E}{N_0}}\right). $$

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})$.

Para $M$ sinais hipercúbicos (M-PAM):

$$ P_e \approx \frac{2(M-1)}{M} Q\left(\sqrt{\frac{6E_b\log_2 M}{(M^2-1)N_0}}\right). \tag{1.4} $$

6.3 M-ASK — Teoria Completa

6.3.1 Definição do Sinal M-ASK

$$ \boxed{s_m(t) = A_m\cos(2\pi f_c t), \quad m \in \{0, 1, \dots, M-1\}, \quad 0 \le t \le T_s.} \tag{2.1} $$
$$ s_m(t) = s_m\,\phi(t), \quad \text{onde } s_m = A_m\sqrt{T_s/2}. \tag{2.2} $$

Os pontos da constelação estão em uma linha (dimensão $N = 1$).

6.3.2 Mapeamento de Amplitudes

Para energia normalizada (energia média por símbolo unitária), as amplitudes são igualmente espaçadas e simétricas em torno de zero:

$$ A_m = (2m - M + 1)d, \quad m = 0, 1, \dots, M-1. \tag{2.3} $$

O espaçamento é $2d$. A energia média do símbolo é:

$$ E_s = \frac{1}{M}\sum_{m=0}^{M-1} s_m^2 = \frac{T_s}{2}\cdot\frac{1}{M}\sum_{m=0}^{M-1} A_m^2. \tag{2.4} $$

Com $A_m = (2m - M + 1)d$:

$$ \sum_{m=0}^{M-1} A_m^2 = d^2\sum_{m=0}^{M-1} (2m - M + 1)^2 = d^2 \cdot \frac{M(M^2-1)}{3}. \tag{2.5} $$

Logo:

$$ E_s = \frac{T_s}{2M} \cdot d^2 \cdot \frac{M(M^2-1)}{3} = \frac{T_s d^2(M^2-1)}{6}. \tag{2.6} $$
$$ \boxed{d = \sqrt{\frac{6E_s}{T_s(M^2-1)}} = \sqrt{\frac{6E_b\log_2 M}{T_s(M^2-1)}}.} \tag{2.7} $$

6.3.3 Potência e Eficiência

A potência média transmitida é $P = E_s/T_s$. A eficiência espectral é:

$$ \boxed{\eta=\frac{R_b}{B}=\frac{\log_2M}{BT_s}.} \tag{2.8} $$

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:

$$ P_b^{\text{OOK}}=Q\left(\sqrt{\frac{\bar E_b}{N_0}}\right). \tag{2.9} $$

4-ASK: Constelação $\{-3d, -d, d, 3d}$ normalizada. Transporta 2 bits/símbolo. BER aproximada:

$$ P_b \approx \frac{3}{4}Q\left(\sqrt{\frac{4E_b}{5N_0}}\right). $$

16-ASK: 4 bits/símbolo. BER aproximada:

$$ P_b \approx \frac{15}{32}Q\left(\sqrt{\frac{8E_b}{85N_0}}\right). $$

6.3.5 Desvantagem do M-ASK

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:

$$ P(e|m)=2Q\left(\frac{D}{2\sigma}\right) =2Q\left(\frac{D}{\sqrt{2N_0}}\right),\quad1\le m\le M-2. \tag{3.1} $$

Cada ponto de borda possui apenas uma cauda. Fazendo a média dos dois pontos de borda e dos $M-2$ internos:

$$ P_s=\frac{2(M-1)}{M}Q\left(\frac{D}{\sqrt{2N_0}}\right). \tag{3.2} $$

6.4.2 Conversão para BER

Usando Gray coding (aproximação boa para M grande), cada erro de símbolo troca tipicamente 1 bit:

$$ P_b\approx\frac{P_s}{\log_2M} =\frac{2(M-1)}{M\log_2M}Q\left(\frac{D}{\sqrt{2N_0}}\right). \tag{3.3} $$

Como $D^2=12E_s/(M^2-1)=12E_b\log_2M/(M^2-1)$:

$$ \boxed{P_b^{\text{M-ASK}}\approx\frac{2(M-1)}{M\log_2M} Q\left(\sqrt{\frac{6E_b\log_2M}{(M^2-1)N_0}}\right).} \tag{3.4} $$

Verificação para M = 2:

$$ P_b=Q\left(\sqrt{\frac{6E_b}{3N_0}}\right) =Q\left(\sqrt{\frac{2E_b}{N_0}}\right). $$

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})$.

6.4.3 Interpretação

6.5 BPSK — Teoria e Optimalidade

6.5.1 Definição BPSK

$$ \boxed{s_0(t) = \sqrt{\frac{2E_b}{T_b}}\cos(2\pi f_c t), \quad s_1(t) = -\sqrt{\frac{2E_b}{T_b}}\cos(2\pi f_c t).} \tag{4.1} $$

No espaço de sinais, os dois pontos são $\pm\sqrt{E_b}$ em $\mathbb{R}^1$. A distância entre eles é $2\sqrt{E_b}$.

6.5.2 DEDUÇÃO da BER BPSK

O receptor correlaciona $r(t)$ com $\phi(t) = \sqrt{2/T_b}\cos(2\pi f_c t)$:

$$ r = \int_0^{T_b} r(t)\phi(t)\,dt = \pm\sqrt{E_b} + n, $$

onde $n \sim \mathcal{N}(0, N_0/2)$. O limiar ótimo (equiprovável) é $0$.

Erro ocorre se $n > 0$ quando $-\sqrt{E_b}$ foi transmitido, ou se $n < 0$ quando $+\sqrt{E_b}$ foi transmitido. Por simetria:

$$ P_b = P(n > 0 | -\sqrt{E_b}) = P(n > \sqrt{E_b}) = Q\left(\frac{\sqrt{E_b}}{\sqrt{N_0/2}}\right) = Q\left(\sqrt{\frac{2E_b}{N_0}}\right). \quad \blacksquare $$

6.5.3 Teorema da Optimalidade BPSK

6.5.4 Detecção Coerente

O detector coerente BPSK usa:

  1. Recuperação de portadora: PLL ou Costas loop para estimar a fase da portadora.
  2. Correlador: $r = \int r(t)\sqrt{2/T_b}\cos(2\pi f_c t + \hat{\phi}) dt$.
  3. Decisão: $\hat{b} = 1$ se $r > 0$, $\hat{b} = 0$ se $r < 0$.

6.5.5 BER BPSK em Tabela

$E_b/N_0$ (dB) $E_b/N_0$ (linear) BER
0 1 $Q(\sqrt{2}) \approx 0{,}0787$
3 2 $Q(2) \approx 0{,}0228$
6 4 $Q(\sqrt{8}) \approx 0{,}000317$
9,6 9 $Q(3) \approx 0{,}00135$
10 $\sim$10 $Q(\sqrt{20}) \approx 2{,}87\times 10^{-5}$

6.6 QPSK — Teoria, Eficiência e Variação π/4

6.6.1 Definição QPSK

$$ \boxed{\phi_k \in \left\{\frac{\pi}{4}, \frac{3\pi}{4}, \frac{5\pi}{4}, \frac{7\pi}{4}\right\}.} \tag{5.1} $$

Os sinais são:

$$ s_k(t) = \sqrt{\frac{2E_s}{T_s}}\cos(2\pi f_c t + \phi_k), \quad k = 0, 1, 2, 3. \tag{5.2} $$

6.6.2 Representação I/Q

QPSK é equivalente a dois BPSK ortogonais:

$$ I(t) = \sqrt{\frac{2E_s}{T_s}}\cos\phi_k, \quad Q(t) = -\sqrt{\frac{2E_s}{T_s}}\sin\phi_k. \tag{5.3} $$

Para $\{\pi/4, 3\pi/4, 5\pi/4, 7\pi/4\}$: $I, Q \in \{\pm\sqrt{E_s/T_s}\} = \{\pm\sqrt{E_b/T_b}\}$.

Cada eixo é independente BPSK com energia $E_b$. Portanto:

$$ \boxed{P_b^{\text{QPSK}} \approx P_b^{\text{BPSK}} = Q\left(\sqrt{\frac{2E_b}{N_0}}\right).} \tag{5.4} $$

6.6.3 DEDUÇÃO da BER QPSK

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 $$

A probabilidade de erro de símbolo é:

$$ P_s = 1 - (1 - P_b)^2 = 2P_b - P_b^2. \tag{5.5} $$

Para $P_b \ll 1$: $P_s \approx 2P_b$.

6.6.4 Eficiência Espectral QPSK

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:

$$ \boxed{\eta_{\text{QPSK}}=\frac{R_b}{B}=\frac{2R_s}{(1+\alpha)R_s}=\frac{2}{1+\alpha}\ \text{bit/s/Hz}.} \tag{5.6} $$

Para $\alpha=0$, o limite ideal é $2$ bit/s/Hz; roll-off positivo reduz esse valor.

6.6.5 Gray Coding

Para QPSK com fases $\{\pi/4, 3\pi/4, 5\pi/4, 7\pi/4\}$, o mapeamento Gray é:

Fase Bits (Gray)
$\pi/4$ 00
$3\pi/4$ 01
$5\pi/4$ 11
$7\pi/4$ 10

6.6.6 QPSK π/4

$$ \mathcal{C}_0 = \{\pm\sqrt{E_b} \pm j\sqrt{E_b}\}, \quad \mathcal{C}_1 = \{\pm\sqrt{E_b}(1+j) \cdot e^{j\pi/4}\} = \{\pm\sqrt{2E_b}, \pm j\sqrt{2E_b}\}. $$

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).

6.6.7 DQPSK

$$ \Delta\phi_k = \phi_k - \phi_{k-1} \in \{\pm\pi/4, \pm 3\pi/4\}. $$

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:

$$ P_s \approx 2Q\left(\sqrt{2\frac{E_s}{N_0}}\sin\frac{\pi}{M}\right). \tag{6.2} $$

Convertendo para BER com Gray coding ($P_b \approx P_s/\log_2 M$):

$$ \boxed{P_b^{\text{M-PSK}} \approx \frac{2}{\log_2 M}Q\left(\sqrt{2\frac{E_b}{N_0}\log_2 M}\sin\frac{\pi}{M}\right).} \tag{6.3} $$

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$.

6.7.3 DEDUÇÃO do Limite Assintótico

$$ P_b \approx \frac{2}{\log_2 M}Q\left(\sqrt{2\frac{E_b}{N_0}\log_2 M}\cdot\frac{\pi}{M}\right). $$

Para $M = 2^k$, $\log_2 M = k$, $\pi/M = \pi/2^k$:

$$ \sqrt{2\frac{E_b}{N_0}\cdot k}\cdot\frac{\pi}{2^k} = \frac{\pi\sqrt{2k E_b/N_0}}{2^k}. $$

Para $k$ grande, o argumento decai exponencialmente:

$$ \boxed{P_b \approx \frac{2}{\log_2 M}Q\left(\frac{\pi}{M}\sqrt{2\log_2M\frac{E_b}{N_0}}\right),\qquad M\gg1.} \tag{6.4} $$

6.7.4 DPSK (Differential PSK)

BDPSK (Binary DPSK): $\Delta\phi \in \{0, \pi\}$. Decodificação: $\hat{b}_k = 1$ se $\cos(\phi_k - \phi_{k-1}) > 0$.

BER BDPSK:

$$ \boxed{P_b^{\text{BDPSK}} = \frac{1}{2}e^{-E_b/N_0}.} \tag{6.5} $$

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.

6.8 M-FSK — Teoria

6.8.1 Definição M-FSK Ortogonal

$$ \boxed{s_m(t) = \sqrt{\frac{2E_s}{T_s}}\cos(2\pi f_m t), \quad f_m = f_c + m\Delta f, \quad m = 0, \dots, M-1.} \tag{7.1} $$

6.8.2 Ortogonalidade

Os sinais são ortogonais se:

$$ \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$.

6.8.4 Largura de Banda

A banda total ocupada é:

$$ B_{\text{FSK}}\approx(M-1)\Delta f+B_p, \tag{7.4} $$

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:

$$ P_s = P\left(\bigcup_{j \ne m}\{r_j > r_m\}\right). \tag{8.1} $$

Para M grande e BER baixa, a união é dominada pelos eventos individuais:

$$ P_s \approx (M-1)P(r_j > r_m) = (M-1)Q\left(\frac{\sqrt{E_s}}{\sqrt{N_0}}\right). \tag{8.2} $$

Convertendo para BER:

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,

$$ P_b=\frac{M}{2(M-1)}P_s \ \lesssim\ \frac{M}{2}Q\left(\sqrt{\frac{E_s}{N_0}}\right), \tag{8.3} $$

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).

Para M-FSK não-coerente:

Uma expressão exata útil é

$$ \boxed{P_s=\sum_{n=1}^{M-1}(-1)^{n+1}\binom{M-1}{n} \frac{1}{n+1}\exp\left[-\frac{n}{n+1}\frac{E_s}{N_0}\right].} \tag{8.4} $$

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.

Para BFSK não-coerente ($M=2$):

$$ \boxed{P_b^{\text{BFSK, não-coer}} = \frac{1}{2}e^{-E_b/(2N_0)}.} \tag{8.5} $$

Comparação BFSK:

Para BER $= 10^{-5}$: BPSK ~9,6 dB, BFSK coerente ~12,6 dB (3 dB penalidade), BFSK não-coerente ~13,8 dB (4,2 dB penalidade).

6.10 Comparação Rigorosa de Modulações Digitais

6.10.1 Tabela Comparativa

Modulação BER (aprox.) Eficiência (bit/s/Hz) Complexidade Notas
BPSK $Q(\sqrt{2\gamma})$ 1 Baixa Ótimo BER, simples
QPSK $Q(\sqrt{2\gamma})$ 2 Média Mesmo BER; 2× mais bits por símbolo
8-PSK $\frac{2}{3}Q(\sqrt{6\gamma}\sin\frac{\pi}{8})$ 3 Média-Alta $\sin(\pi/8) \approx 0{,}383$
16-PSK $\frac{1}{2}Q(\sqrt{8\gamma}\sin\frac{\pi}{16})$ 4 Alta $\sin(\pi/16) \approx 0{,}195$
BFSK coer. $Q(\sqrt{\gamma})$ 0,5 Baixa 3 dB pior que BPSK
BFSK não-coer. $\frac{1}{2}e^{-\gamma/2}$ 0,5 Muito baixa 4,2 dB pior que BPSK
4-ASK $\frac{3}{4}Q(\sqrt{\frac{4\gamma}{5}})$ 2 Baixa Sensível a ruído
16-QAM $\frac{3}{4}Q(\sqrt{\frac{4\gamma}{5}})$ 4 Alta Eficiente, sensível a fase

6.10.2 Curvas de BER

$$ \boxed{\text{Eficiência espectral ↑} \implies \text{Eficiência energética ↓}} \tag{9.1} $$

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.

6.10.3 Observação sobre M-QAM

A BER 16-QAM é aproximada por:

$$ P_b\approx\frac34Q\left(\sqrt{\frac{4E_b}{5N_0}}\right). $$

6.11 Exercícios Resolvidos em Python

6.11.1 Protocolo computacional

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 np
import matplotlib.pyplot as plt
from scipy.special import erfc

Q = lambda x: 0.5 * erfc(x / np.sqrt(2))

ebn0_db = np.linspace(0, 12, 200)
gamma = 10**(ebn0_db / 10)

# BER teórica
ber_bpsk = Q(np.sqrt(2 * gamma))
ber_qpsk = Q(np.sqrt(2 * gamma))  # mesmo BER que BPSK
ber_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()
Figura

6.11.3 Exercício 2: Constelações M-PSK para M = 4, 8, 16

PYTHON
import numpy as np
import matplotlib.pyplot as plt

def plot_constellation(M, title="", marker='o', color='b'):
    angles = 2 * np.pi * np.arange(M) / M
    # normalizar a energia média a 1
    points = 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)
    for i, angle in enumerate(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))
for ax, M in zip(axes, [4, 8, 16]):
    angles = 2 * np.pi * np.arange(M) / M
    points = 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)
    for i, angle in enumerate(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()
Figura

6.11.4 Exercício 3: BER de BFSK vs BPSK

PYTHON
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc

Q = lambda x: 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()
Figura

6.11.5 Exercício 4: Eficiência Espectral vs Ordem de Modulação

PYTHON
import numpy as np
import matplotlib.pyplot as plt

# Eficiência espectral e BER necessária para 1e-5
from scipy.special import erfc

Qinv = lambda p: 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-5
results = []

for name, info in modulations.items():
    M = info['M']
    eta = info['eta']
    if info['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)
        if M == 2:
            arg = Qinv(target_ber)
            ebn0 = arg**2 / 2
        else:
            # resolver numericamente
            from scipy.optimize import brentq
            def eq(g):
                return (2/np.log2(M)) * 0.5*erfc(np.sqrt(2*g*np.log2(M))*sin_pi_M/np.sqrt(2)) - target_ber
            try:
                ebn0 = brentq(eq, 0.1, 30)
            except:
                ebn0 = np.nan
    elif info['type'] == 'fsk_coh':
        # P_b ≈ (M-1)/(M*log2(M)) * Q(sqrt(Eb*log2(M)/N0))
        if M == 2:
            arg = Qinv(target_ber * 2)  # (M-1)/M = 0.5 for M=2
            ebn0 = arg**2
        else:
            from scipy.optimize import brentq
            def eq(g):
                return (M-1)/(M*np.log2(M)) * 0.5*erfc(np.sqrt(g*np.log2(M)/2)) - target_ber
            try:
                ebn0 = brentq(eq, 0.1, 30)
            except:
                ebn0 = np.nan
    elif info['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 / inner

    results.append((name, eta, 10*np.log10(ebn0) if not np.isinf(ebn0) else 999))

results.sort(key=lambda x: x[1])

names = [r[0] for r in results]
etas = [r[1] for r in results]
db_vals = [r[2] for r in results]

fig, ax = plt.subplots(figsize=(12, 6))
bars = ax.barh(names, etas, color=['blue','teal','green','orange','red','purple','brown'])
for i, (bar, db) in enumerate(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()
Figura

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.

E3. $P_b = \int_{\sqrt{E_b}}^{\infty} \frac{1}{\sqrt{\pi N_0}}e^{-x^2/N_0}dx = Q(\sqrt{E_b/(N_0/2)}) = Q(\sqrt{2E_b/N_0})$. ✓

E4. QPSK: dois eixos ortogonais, cada um BPSK com energia $E_b$. $P_b = Q(\sqrt{2E_b/N_0})$. ✓

E5. $P_s = 1-(1-P_b)^2 = 2P_b-P_b^2 \approx 2P_b$ para $P_b \ll 1$. ✓

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.

E7. $P_s = P(\exists j \ne m: r_j > r_m) \approx (M-1)P(r_j > r_m) = (M-1)Q(\sqrt{E_s/N_0})$. ✓

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:

$$ c_I(t) = \cos(2\pi f_c t), \qquad c_Q(t) = -\sin(2\pi f_c t), $$

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 é:

$$ \boxed{s(t) = I_k\cos(2\pi f_c t) - Q_k\sin(2\pi f_c t)},\qquad kT_s \leq t < (k+1)T_s. $$

A convenção de sinal negativo no termo Q é padrão em comunicações: garante que a fase positiva corresponde à rotação anti-horária no plano complexo.

$$ s(t) = \Re\left\{x_k\,e^{j2\pi f_c t}\right\}. $$

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]$ é:

$$ E_s = \int_{kT_s}^{(k+1)T_s} s_k^2(t)\,dt = \int_{kT_s}^{(k+1)T_s} \bigl[I_k\cos(2\pi f_c t) - Q_k\sin(2\pi f_c t)\bigr]^2 dt. $$

Expandindo o quadrado:

$$ s_k^2(t) = I_k^2\cos^2(2\pi f_c t) + Q_k^2\sin^2(2\pi f_c t) - 2I_kQ_k\cos(2\pi f_c t)\sin(2\pi f_c t). $$

O termo cruzado se anula por ortogonalidade: $\displaystyle\int_0^{T_s} 2\cos(2\pi f_c t)\sin(2\pi f_c t)\,dt = \int_0^{T_s}\sin(4\pi f_c t)\,dt = 0$ (para $f_c \gg 1/T_s$).

Os termos quadráticos: para $f_c$ suficientemente alta, $\cos^2(2\pi f_c t)$ e $\sin^2(2\pi f_c t)$ têm valor médio $1/2$ sobre cada período. Assim:

$$ \boxed{E_s = \frac{T_s}{2}(I_k^2 + Q_k^2) = \frac{T_s}{2}|x_k|^2}. $$

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:

$$ s(t) = a_I\,g_I(t) + a_Q\,g_Q(t),\qquad E_s = a_I^2 + a_Q^2 = |x|^2. $$

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) é:

$$ \boxed{\eta = \frac{R_b}{B} = \log_2 M\;\text{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 é:

$$ \boxed{\mathcal{A} = \{\pm d, \pm 3d, \pm 5d, \ldots, \pm(L-1)d\}}, $$

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$,

$$ E[I^2]=\frac{d^2}{L}\sum_{i=0}^{L-1}(2i-L+1)^2 =\frac{L^2-1}{3}d^2=\frac{M-1}{3}d^2. $$

Os eixos I e Q têm a mesma energia. Portanto, o resultado exato é

$$ \boxed{E_s = \frac{2}{3}(M-1)d^2}. $$

Normalização a $E_s = 1$: Para normalizar a constelação de modo que a energia média seja unitária:

$$ d = \sqrt{\frac{3}{2(M-1)}}. $$

E a distância mínima é:

$$ \boxed{d_{\min} = 2\sqrt{\frac{3}{2(M-1)}} = \sqrt{\frac{6}{M-1}}}. $$

7.3.4 Constelações não-retangulares

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.

64-QAM: $L=8$, níveis $\{\pm d, \pm 3d, \pm 5d, \pm 7d\}$. $E_s = \frac{2}{3}(63)d^2 = 42d^2$. Normalizado: $d = \sqrt{\frac{3}{126}} = \sqrt{\frac{1}{42}}$.

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 np
import matplotlib.pyplot as plt

def make_qam_levels(L):
    """Retorna os L níveis para QAM retangular (L ímpar ou par)."""
    return np.array([-L+1+2*i for i in range(L)])

fig, axes = plt.subplots(1, 3, figsize=(12, 3.8))
for M, ax in [(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=1
    I, 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()
Figura

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:

$$ \boxed{Q(x) = \frac{1}{\sqrt{2\pi}}\int_x^{\infty} e^{-t^2/2}\,dt = \frac{1}{2}\operatorname{erfc}\!\left(\frac{x}{\sqrt{2}}\right)}. $$

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 é:

$$ P_s^{\text{PAM}} = 2\frac{M-1}{M}Q\!\left(\frac{d}{\sigma}\right) = 2\frac{M-1}{M}Q\!\left(\sqrt{\frac{6\log_2M}{M^2-1}\frac{E_b}{N_0}}\right). $$

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:

$$ \boxed{P_b^{\text{PAM}} \approx \frac{2(M-1)}{M\log_2 M}\,Q\!\left(\sqrt{\frac{6\log_2 M}{M^2-1}\frac{E_b}{N_0}}\right)}. $$

7.4.3 DEDUÇÃO da BER para QAM retangular

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$,

$$ p_{\rm eixo}=2\left(1-\frac1L\right)Q\!\left(\frac d\sigma\right). $$

Da Seção “Energia média e normalização”, $d^2=3E_s/[2(M-1)]$. Com $E_s=(\log_2M)E_b$,

$$ \frac d\sigma=\sqrt{\frac{3\log_2M}{M-1}\frac{E_b}{N_0}}. $$

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$:

$$ \boxed{P_b^{\text{QAM}} \approx \frac{2}{\log_2 M}\!\left(1-\frac{1}{\sqrt M}\right)\operatorname{erfc}\!\left(\sqrt{\frac{3\log_2 M}{2(M-1)}\frac{E_b}{N_0}}\right)}. $$

Forma alternativa com função Q (mais comum):

$$ \boxed{P_b^{\text{QAM}} \approx \frac{4}{\log_2 M}\!\left(1-\frac{1}{\sqrt{M}}\right)Q\!\left(\sqrt{\frac{3\log_2 M}{M-1}\frac{E_b}{N_0}}\right)}. $$

Esta é a expressão padrão para BER de QAM retangular em AWGN com mapeamento Gray.

Verificação para 4-QAM (QPSK): $M=4$, $\log_2 M=2$, $\sqrt{M}=2$:

$$ P_b = \frac{4}{2}\!\left(1-\frac{1}{2}\right)Q\!\left(\sqrt{\frac{3\cdot 2}{3}\frac{E_b}{N_0}}\right) = Q\!\left(\sqrt{2\frac{E_b}{N_0}}\right). $$

Resultado idêntico ao BPSK/QPSK — consistente, pois 4-QAM é geometricamente equivalente a QPSK.

7.4.4 Aproximação para M grande

Para $M$ grande, $1-1/\sqrt M\approx1$. A aproximação mais usada é:

$$ \boxed{P_b \approx \frac{4}{\log_2 M}\,Q\!\left(\sqrt{\frac{3\log_2 M}{M-1}\frac{E_b}{N_0}}\right)}. $$

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

7.4.6 SER (Probabilidade de Erro de Símbolo)

A probabilidade de erro de símbolo (não de bit) é:

$$ P_s = 1 - (1-p_{\text{eixo}})^2, \qquad p_{\text{eixo}}=2\!\left(1-\frac1{\sqrt M}\right)Q\!\left(\sqrt{\frac{3\log_2 M}{M-1}\frac{E_b}{N_0}}\right). $$

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 np
import matplotlib.pyplot as plt
from scipy.special import erfc

rng = np.random.default_rng(42)

def ber_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)
    return prefactor * 0.5*erfc(arg/np.sqrt(2))

def ber_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 = 1
    levels = np.array([-L+1+2*i for i in range(L)]) / scale
    
    eb_n0 = np.array(eb_n0_dbs)
    berrs = []
    for db in eb_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 // 2
        idxI = 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) & 1 for b in range(m_axis)])
        bitsQ = np.column_stack([(labelQ >> b) & 1 for b in range(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 proximos
        yI = 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) & 1 for b in range(m_axis)])
        ybitsQ = np.column_stack([(yLabelQ >> b) & 1 for b in range(m_axis)])
        ybits = np.column_stack((ybitsI, ybitsQ))
        ber = np.mean(ybits != bits)
        berrs.append(ber)
    return np.array(berrs)

eb = np.arange(2, 22, 1)
for M, lbl, mk in [(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)) for db in eb]
    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()
Figura

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)$:

$$ r_I = \int_{kT_s}^{(k+1)T_s} r(t)\,g_I(t)\,dt = I_k + n_I, $$
$$ r_Q = \int_{kT_s}^{(k+1)T_s} r(t)\,g_Q(t)\,dt = Q_k + n_Q. $$

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:

$$ p(\mathbf{r}|\mathbf{x}_k) = \frac{1}{\pi N_0}\exp\!\left(-\frac{|\mathbf{r} - \mathbf{x}_k|^2}{N_0}\right). $$

Maximizar esta probabilidade é equivalente a minimizar a distância euclidiana:

$$ \boxed{\hat{\mathbf{x}}_k = \arg\min_{m} \|\mathbf{r} - \mathbf{x}_m\|^2}. $$

Decisão separada por eixo: Para QAM retangular, a minimização se separa:

$$ \hat{I}_k = \arg\min_{I \in \mathcal{A}} (r_I - I)^2, \qquad \hat{Q}_k = \arg\min_{Q \in \mathcal{A}} (r_Q - Q)^2. $$

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:

$$ \boxed{\mathcal{V}_m = \{\mathbf{r} \in \mathbb{R}^2 : \|\mathbf{r} - \mathbf{x}_m\| \leq \|\mathbf{r} - \mathbf{x}_n\|,\ \forall n \neq m\}}. $$

Para QAM retangular:

A probabilidade de erro de símbolo é:

$$ P_s = \sum_{m}\frac{1}{M}\Pr(\mathbf{r} \notin \mathcal{V}_m|\mathbf{x}_m) = 1 - \frac{1}{M}\sum_{m}\Pr(\mathbf{r} \in \mathcal{V}_m|\mathbf{x}_m). $$

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:

$$ r_I' = I_k\cos\phi + Q_k\sin\phi + n_I', $$
$$ r_Q' = -I_k\sin\phi + Q_k\cos\phi + n_Q'. $$

Em forma matricial: $\begin{pmatrix} r_I' \\ r_Q' \end{pmatrix} = \begin{pmatrix} \cos\phi & \sin\phi \\ -\sin\phi & \cos\phi \end{pmatrix}\begin{pmatrix} I_k \\ Q_k \end{pmatrix} + \mathbf{n}'$.

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$.

A SNR efetiva no eixo de decisão é reduzida por:

$$ \boxed{\text{SNR}_{\text{eff}} = \text{SNR} \cdot \cos^2\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 np
import matplotlib.pyplot as plt

rng = np.random.default_rng(7)

M = 16; L = int(np.sqrt(M))
levels = np.array([-L+1+2*i for i in range(L)]) / np.sqrt(2*(M-1)/3)
I, Q = np.meshgrid(levels, levels)
x_clean = I + 1j*Q

angles = [0, 5, 15, 30]
fig, axes = plt.subplots(1, 4, figsize=(14, 3.5))
for ax, phi in zip(axes, angles):
    phi_rad = np.deg2rad(phi)
    # Rotação da constelacao + ruido
    x_rot = x_clean * np.exp(1j*phi_rad)
    sigma = np.sqrt(1/(2*4*10**(12/10)))  # Es/N0 = 12 dB
    noise = sigma * (rng.standard_normal(len(x_clean)) + 1j*rng.standard_normal(len(x_clean)))
    y = x_rot + noise
    ax.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()
Figura

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:

$$ \boxed{J(\mathbf{w}) = \mathbb{E}\bigl[|y_n|^2 - R\bigr]^2}, $$

onde $y_n = \mathbf{w}^H\mathbf{x}_n$ é a saída do equalizador e $R = \mathbb{E}[|x_k|^4]/\mathbb{E}[|x_k|^2]$ é a constante de módulo.

Atualização por gradiente estocástico:

$$ \mathbf{w}_{n+1} = \mathbf{w}_n - \mu\nabla_{\mathbf{w}}J|_{\mathbf{w}_n} = \mathbf{w}_n + 2\mu\bigl(R - |y_n|^2\bigr)y_n^*\mathbf{x}_n. $$

7.6.3 Estimativa de fase

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.

7.6.5 Equalização adaptativa: LMS e RLS

Algoritmo LMS (Least Mean Squares):

$$ \boxed{\mathbf{w}_{n+1} = \mathbf{w}_n + 2\mu\,e_n\,\mathbf{x}_n}, $$

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 np
import matplotlib.pyplot as plt

rng = np.random.default_rng(2026)

def constell_qam(M, n_sym=5000):
    L = int(np.sqrt(M))
    k = int(np.log2(M))
    levels = np.array([-L+1+2*i for i in range(L)]) / np.sqrt(2*(M-1)/3)
    bits = rng.integers(0, 2, (n_sym, k))
    gray = bits.copy()
    for b in range(1, k):
        gray[:, b] ^= gray[:, b-1]
    m = k // 2
    gI, 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]
    return xi, xq, levels

snrs = [6, 12, 18]
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
for ax, snr in zip(axes, snrs):
    xi, xq, levels = constell_qam(64)
    x = xi + 1j*xq
    sigma = 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)
    for lv in levels:
        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()
Figura

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 np
import matplotlib.pyplot as plt
from scipy.special import erfc

def ber_16qam(ebn0_db):
    M=16; k=4; g=10**(ebn0_db/10)
    return 4/k*(1-1/np.sqrt(M))*0.5*erfc(np.sqrt(6*k*g/(M-1))/np.sqrt(2))

def ber_16psk(ebn0_db):
    M=16; g=10**(ebn0_db/10)
    # Aproximacao: P_s ~ 2Q(sqrt(2*Es/N0*sin^2(pi/M)))
    return 2*0.5*erfc(np.sqrt(2*g*np.sin(np.pi/M)**2)/np.sqrt(2))

def ber_bpsk(ebn0_db):
    g=10**(ebn0_db/10)
    return 0.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()
Figura

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 np
import matplotlib.pyplot as plt
from scipy.special import erfc

M = 16; k = 4
eb = np.arange(2, 20, 0.5)
phases = [0, 5, 10, 15, 20]
for phi in phases:
    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()
Figura

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 np
import matplotlib.pyplot as plt
from scipy.special import erfc

M_vals = [4, 16, 64, 256, 1024]
target_ber = 1e-3
eb_dbs = np.arange(0, 30, 0.1)

plt.figure(figsize=(10, 6))
for M in M_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()
Figura

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.

7.10 Gabarito

E1. 16-QAM: $d=1 \Rightarrow E_s = \frac{2}{3}(15)\cdot 1 = 10$. $d_{\min} = 2$. Normalizado: $d_{\text{norm}} = 1/\sqrt{10}$, $d_{\min,\text{norm}} = 2/\sqrt{10} = \sqrt{2/5}$. 64-QAM: $E_s = \frac{2}{3}(63) = 42$. 256-QAM: $E_s = \frac{2}{3}(255) = 170$.

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.

E5. Aproximações numéricas: $M=16$: QAM $\sim$13,5 dB, PSK $\sim$17 dB (diff ~3,5 dB). $M=32$: QAM $\sim$15,5 dB, PSK $\sim$19,5 dB (diff ~4 dB). $M=64$: QAM $\sim$17 dB, PSK $\sim$22 dB (diff ~5 dB).

E6. (a) Canto: região quadrante, delimitada por retas perpendiculares bissetrizes dos lados adjacentes. (b) Bordas: região semi-aberta. (c) Interno: retângulo $2d\times2d$.

E7. $\cos^2\phi \approx 1-\phi^2 \Rightarrow 10\log_{10}(1-\phi^2) \approx -4{,}34\phi^2$. $\phi=2^\circ=0{,}0349$ rad: perda $\approx 0{,}0053$ dB. $\phi=5^\circ=0{,}0873$: perda $\approx 0{,}033$ dB. $\phi=10^\circ=0{,}1745$: perda $\approx 0{,}132$ dB.

E8. $\nabla_{\mathbf{w}}J = \nabla_{\mathbf{w}}\mathbb{E}[(|y_n|^2-R)^2] = 2\mathbb{E}[(|y_n|^2-R)y_n^*\mathbf{x}_n]$. Estima por amostra: $\mathbf{w}_{n+1} = \mathbf{w}_n + 2\mu(R-|y_n|^2)y_n^*\mathbf{x}_n$. A constante $R = \mathbb{E}[|x|^4]/\mathbb{E}[|x|^2]$ depende da constelação: para QPSK $R=1$ (amplitude constante), para 16-QAM $R \approx 1{,}9$ (amplitudes variadas).

E9. 256-QAM: $8$ bit/símbolo × $80\times10^6/2$ símbolos/s (Nyquist) × $4$ streams ≈ $1{,}28$ Gb/s (ideal, sem coding). 64-QAM: $6\times$ taxa $= 0{,}96$ Gb/s. 16-QAM: $4\times = 0{,}64$ Gb/s. Com FEC (rate 3/4) e overhead (~25%), taxas efetivas: ~0,72, ~0,54, ~0,36 Gb/s.

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

Comunicações Digitais — Apostila de Curso
Tópicos: ISI · Equalizadores lineares ZF/MMSE · Equalização adaptativa LMS/RLS · DFE · MLSE · Equalização OFDM

8.1 Antes de começar

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) é:

$$ r(t) = \sum_{\ell=0}^{L-1} h[\ell]\,x[n-\ell] + w[n], $$

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).

8.2.3 Formulação do problema de equalização

$$ \boxed{H_{\text{eq}}(z)\,H_c(z)\,H_{\text{rx}}(z) \approx z^{-d}}, $$

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:

$$ Y(z) = R(z)H_{\text{eq}}(z) = X(z)\underbrace{H_c(z)H_{\text{rx}}(z)H_{\text{eq}}(z)}_{C(z)} + W(z)H_{\text{eq}}(z). $$

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$.

Uma medida determinística simples para BPSK é comparar o cursor principal com a soma absoluta dos demais cursores:

$$ \boxed{A_{\rm eye}\ge2\sqrt{E_s}\left(|c[d]|-\sum_{k\ne d}|c[k]|\right).} $$

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.

8.3 Equalizadores Lineares: Zero-Forcing

8.3.1 Estrutura do equalizador transversal (FIR)

$$ \boxed{y[n] = \sum_{k=0}^{N-1} w_k\,x[n-k]}, $$

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:

$$ \begin{pmatrix} y[n] \\ y[n+1] \\ \vdots \\ y[n+M-1] \end{pmatrix} = \underbrace{\begin{pmatrix} x[n] & x[n-1] & \cdots & x[n-N+1] \\ x[n+1] & x[n] & \cdots & x[n-N+2] \\ \vdots & \vdots & \ddots & \vdots \\ x[n+M-1] & x[n+M-2] & \cdots & x[n+M-N] \end{pmatrix}}_{\mathbf{X}} \begin{pmatrix} w_0 \\ w_1 \\ \vdots \\ w_{N-1} \end{pmatrix}. $$

8.3.2 Equalizador Zero-Forcing: conceito

$$ \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}$:

$$ \mathbf H=\begin{pmatrix} h_0 & 0 & \cdots & 0 \\ h_1 & h_0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ h_{L-1}&h_{L-2}&\cdots&0\\ 0&h_{L-1}&\cdots&0\\ \vdots&\vdots&\ddots&h_0\\ 0&0&\cdots&h_{L-1} \end{pmatrix}. $$

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:

  1. Se $\mathbf H\mathbf w=\mathbf e_d$ for consistente, qualquer solução exata é ZF.
  2. Se for sobredefinido, usa-se o ZF de mínimos quadrados
$$ \boxed{\mathbf w_{\rm ZF}=\mathbf H^\dagger\mathbf e_d =(\mathbf H^H\mathbf H)^{-1}\mathbf H^H\mathbf e_d} $$

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 np
import matplotlib.pyplot as plt

# Canal de 3 taps
h = np.array([0.3, 1.0, 0.45])

# Numero de taps do equalizador
N = 5
d = N // 2  # atraso de decision

# Construir matriz Toeplitz do canal
H = np.zeros((N, N))
for i in range(N):
    for j in range(N):
        lag = i - j
        if 0 <= lag < len(h):
            H[i, j] = h[lag]

# Vetor desejado: impulso atrasado em d
desired = np.zeros(N)
desired[d] = 1.0

# Resolver w = H^{-1} * desired
w_zf = np.linalg.solve(H, desired)
print(f'Coeficientes ZF: {np.round(w_zf, 4)}')

# Verificar resposta conjunta
c = np.convolve(h, w_zf)[:N+2]
print(f'Resposta conjunta: {np.round(c, 4)}')

# Plotar resposta do canal e equalizador
fig, 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()
Output:
Coeficientes ZF: [  0.      -0.       3.3333 -11.1111  32.037 ]
Resposta conjunta: [ 0.     -0.      1.      0.     -0.     27.037  14.4167]
Figura

8.4 Limitações do Zero-Forcing: Amplificação de Ruído

8.4.1 DEDUÇÃO do SNR de saída no ZF

Considere o equalizador ZF $\mathbf{w}_{\text{ZF}} = \mathbf{H}^{-1}\mathbf{e}_d$. O sinal de saída é:

$$ y[n] = x[n-d] + \underbrace{\sum_{k \neq d} c[k]\,x[n-k]}_{\text{ISI residual (zero em ZF)}} + \underbrace{\sum_{k=0}^{N-1} w_k\,w[n-k]}_{\text{ruído amplificado}}. $$

Em ZF, o ISI é zero por projeto. O problema é o ruído amplificado.

8.4.2 Potência do ruído na saída

A potência do ruído na saída do equalizador é:

$$ \sigma_{n,\text{out}}^2 = \mathbb{E}\left[\left|\sum_{k=0}^{N-1} w_k\,w[n-k]\right|^2\right]. $$

Para ruído branco $\mathbb{E}[w[n]w^*[m]] = \sigma_w^2\delta[n-m]$:

$$ \boxed{\sigma_{n,\text{out}}^2 = \sigma_w^2\sum_{k=0}^{N-1}|w_k|^2 = \sigma_w^2\|\mathbf{w}\|^2}. $$

8.4.3 DEDUÇÃO no domínio da frequência

Para não misturar o filtro casado com a coloração do ruído, considere diretamente $R(\omega)=H(\omega)X(\omega)+N(\omega)$. O ZF ideal é:

$$ W_{\text{ZF}}(e^{j\omega})=\frac{e^{-j\omega d}}{H(e^{j\omega})}. $$

Depois da inversão, a componente de sinal tem PSD $S_X$, enquanto o ruído tem PSD $S_N/|H|^2$. Logo:

$$ \boxed{\mathrm{SNR}_{out}(\omega)=\frac{S_X(\omega)|H(\omega)|^2}{S_N(\omega)}.} $$

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

$$ \boxed{\mathbf{w}_{\text{MMSE}} = \arg\min_{\mathbf{w}}\,\mathbb{E}\bigl[|d[n] - \mathbf{w}^H\mathbf{x}_n|^2\bigr]}, $$

onde $d[n]$ é o símbolo desejado (pode ser $x[n-d]$ durante treinamento) e $\mathbf{x}_n = [x[n], x[n-1], \ldots, x[n-N+1]]^T$ é o vetor de entrada.

8.5.2 Equações de Wiener — dedução completa

Expandindo o erro quadrático:

$$ J(\mathbf{w}) = \mathbb{E}\bigl[|d[n] - \mathbf{w}^H\mathbf{x}_n|^2\bigr] = \mathbb{E}\bigl[(d[n] - \mathbf{w}^H\mathbf{x}_n)(d^*[n] - \mathbf{x}_n^H\mathbf{w})\bigr]. $$

Expandindo o produto:

$$ J(\mathbf{w}) = \mathbb{E}[|d[n]|^2] - \mathbb{E}[d[n]\mathbf{x}_n^H\mathbf{w}] - \mathbb{E}[\mathbf{w}^H\mathbf{x}_n d^*[n]] + \mathbb{E}[\mathbf{w}^H\mathbf{x}_n\mathbf{x}_n^H\mathbf{w}]. $$

Simplificando (usando $\mathbb{E}[\mathbf{w}^H\mathbf{x}_n d^*[n]] = \mathbf{w}^H\mathbb{E}[\mathbf{x}_n d^*[n]] = \mathbf{w}^H\mathbf{p}$):

$$ J(\mathbf{w}) = \sigma_d^2 - \mathbf{p}^H\mathbf{w} - \mathbf{w}^H\mathbf{p} + \mathbf{w}^H\mathbf{R}_x\mathbf{w}, $$

onde $\mathbf{R}_x = \mathbb{E}[\mathbf{x}_n\mathbf{x}_n^H]$ e $\mathbf{p} = \mathbb{E}[\mathbf{x}_n d^*[n]]$.

Para minimizar, derivamos em relação a $\mathbf{w}^*$ (derivada complexa de Wirtinger):

$$ \frac{\partial J}{\partial \mathbf{w}^*} = -\mathbf{p} + \mathbf{R}_x\mathbf{w} = \mathbf{0}. $$

Equações de Wiener:

$$ \boxed{\mathbf{R}_x\,\mathbf{w}_{\text{opt}} = \mathbf{p}}. $$

8.5.3 Solução de Wiener

$$ \boxed{\mathbf{w}_{\text{MMSE}} = \mathbf{R}_x^{-1}\mathbf{p}}. $$

Erro mínimo: Substituindo $\mathbf{w}_{\text{MMSE}}$ de volta em $J(\mathbf{w})$:

$$ \boxed{e_{\min} = \sigma_d^2 - \mathbf{p}^H\mathbf{R}_x^{-1}\mathbf{p}}. $$

Esta é a menor potência de erro quadrático médio alcançável. Note que $e_{\min} \geq 0$ (por definição de erro quadrático).

8.5.4 Forma alternativa e relação com ZF

Para um canal conhecido, símbolos brancos de variância $\sigma_s^2$, matriz de convolução $\mathbf H$ e ruído branco de variância $\sigma_n^2$,

$$ \mathbf R_r=\sigma_s^2\mathbf H^H\mathbf H+\sigma_n^2\mathbf I,\qquad \mathbf p=\sigma_s^2\mathbf H^H\mathbf e_d. $$

Substituindo esses termos na solução de Wiener:

$$ \boxed{\mathbf w_{\rm MMSE}= \left(\mathbf H^H\mathbf H+\frac{\sigma_n^2}{\sigma_s^2}\mathbf I\right)^{-1} \mathbf H^H\mathbf e_d.} $$

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.

8.5.5 Comparação ZF vs MMSE

$$ \mathbf w_{\rm MMSE}= \left(\mathbf H^H\mathbf H+\frac{\sigma_n^2}{\sigma_s^2}\mathbf I\right)^{-1} \mathbf H^H\mathbf e_d. $$

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 np
import matplotlib.pyplot as plt

rng = np.random.default_rng(13)

def simulate_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ímbolo
    EbN0 = 10**(np.array(eb_n0_dbs)/10)
    results = {}

    for lbl, gamma_factor in [('ZF', 1.0), ('MMSE', 1.0)]:
        berrs = []
        for db, eb_n0 in zip(eb_n0_dbs, EbN0):
            # Simbolos QPSK
            bits = rng.integers(0, 2, (n_sym, k))
            x = (2*bits[:, 0]-1) + 1j*(2*bits[:, 1]-1)

            # Canal + ruido
            y = 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)))

            # Equalizacao
            y_eq = np.convolve(y, np.ones(N_eq), mode='valid') / N_eq

            # Decision QPSK
            ybits = np.column_stack([(y_eq.real >= 0).astype(int),
                                     (y_eq.imag >= 0).astype(int)])
            delay = len(h) - 1
            reference = bits[delay:delay + len(ybits)]
            ber = np.mean(ybits[:len(reference)] != reference)
            berrs.append(ber)
        results[lbl] = np.array(berrs)

    return results

h = 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))
for lbl, ber in res.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()
Figura

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:

$$ p(\mathbf{r}|\mathbf{a}) \propto \exp\!\left(-\frac{1}{\sigma_n^2}\sum_{n}|r[n] - \sum_{\ell=0}^{L-1} a[n-\ell]h[\ell]|^2\right). $$

Maximizar esta probabilidade equivale a minimizar:

$$ \boxed{J(\mathbf{a}) = \sum_{n=0}^{K+L-2}\left|r[n] - \sum_{\ell=0}^{L-1} a[n-\ell]h[\ell]\right|^2}. $$

8.6.2 Algoritmo de Viterbi para equalização

O algoritmo de Viterbi resolve o problema de busca ML de forma eficiente, explorando a estrutura de trellis do canal.

Estados do trellis: Cada estado representa uma combinação dos últimos $L-1$ símbolos transmitidos. Para $M$-ary e memória $L-1$:

$$ \boxed{\text{Número de estados} = M^{L-1}}. $$

Transições: De cada estado, há $M$ transições (uma para cada símbolo possível no instante atual).

Métrica de caminho: A métrica de Viterbi é a soma dos erros quadráticos acumulados:

$$ \gamma_n(s_i, s_j) = \bigl|r[n] - \hat{r}_n(s_i, s_j)\bigr|^2, $$

onde $\hat{r}_n(s_i, s_j)$ é o sinal recebido esperado na transição do estado $s_i$ para $s_j$.

Complexidade:

$$ \boxed{\mathcal{O}\bigl(M^{L-1} \cdot K \cdot M\bigr) = \mathcal{O}\bigl(M^L \cdot K\bigr)}, $$

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:

  1. Treinamento: Usa uma sequência conhecida de treinamento (pilot sequence). O símbolo desejado é o símbolo de treinamento.
  2. 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:

$$ \boxed{\mathbf{w}[n+1] = \mathbf{w}[n] + \mu\,e^*[n]\,\mathbf{x}[n]}, $$

onde $\mu$ é o passo de adaptação (step-size).

Análise de convergência LMS: Tomando o valor esperado da atualização:

$$ \mathbb{E}[\mathbf{w}[n+1]] = \mathbb{E}[\mathbf{w}[n]] + \mu\bigl(\mathbf{p} - \mathbf{R}_x\mathbb{E}[\mathbf{w}[n]]\bigr). $$

Definindo o erro de peso $\tilde{\mathbf{w}}[n] = \mathbf{w}_{\text{opt}} - \mathbb{E}[\mathbf{w}[n]]$:

$$ \tilde{\mathbf{w}}[n+1] = (\mathbf{I} - \mu\mathbf{R}_x)\tilde{\mathbf{w}}[n]. $$

Para convergência em média no modelo idealizado, todos os autovalores de $(\mathbf{I}-\mu\mathbf R_x)$ devem ter módulo menor que 1:

$$ \boxed{0 < \mu < \frac{2}{\lambda_{\max}(\mathbf{R}_x)}}, $$

onde $\lambda_{\max}$ é o maior autovalor da matriz de autocorrelação.

Constante de tempo de convergência:

$$ \boxed{\tau_k \approx \frac{1}{\mu\lambda_k}}, $$

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.

8.7.3 NLMS (Normalized LMS)

O NLMS normaliza o passo pelo poder de entrada:

$$ \boxed{\mathbf{w}[n+1] = \mathbf{w}[n] + \frac{\mu}{\epsilon + \|\mathbf{x}[n]\|^2}\,e^*[n]\,\mathbf{x}[n]}, $$

onde $\epsilon$ é uma constante pequena para evitar divisão por zero. O NLMS é mais robusto a variações de potência de entrada.

8.7.4 Algoritmo RLS (Recursive Least Squares)

$$ J_{\text{RLS}}[n] = \sum_{k=0}^{n} \lambda^{n-k}\,|e[k]|^2. $$

Atualização recursiva:

$$ \boxed{ \begin{aligned} \mathbf{P}[n] &= \frac{1}{\lambda}\Bigl(\mathbf{P}[n-1] - \frac{\mathbf{P}[n-1]\mathbf{x}[n]\mathbf{x}^H[n]\mathbf{P}[n-1]}{\lambda + \mathbf{x}^H[n]\mathbf{P}[n-1]\mathbf{x}[n]}\Bigr) \\ \mathbf{w}[n] &= \mathbf{w}[n-1] + \mathbf{P}[n]\mathbf{x}[n]e^*[n] \end{aligned} } $$

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.

8.7.5 CMA (Constant Modulus Algorithm)

$$ \boxed{\mathbf{w}[n+1] = \mathbf{w}[n] + \mu\bigl(R - |y[n]|^2\bigr)y^*[n]\,\mathbf{x}[n]}, $$

com $y[n] = \mathbf{w}^H[n]\mathbf{x}[n]$ e $R = \mathbb{E}[|x_k|^4]/\mathbb{E}[|x_k|^2]$.

Propriedades:

8.7.6 Exercício em Python: tracking de canal com LMS

PYTHON
import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(2026)

# Canal variante no tempo (modelo Jakes simplificado)
L_chan = 3; L_eq = 9; mu = 0.01; N = 20000
d = L_eq // 2

h_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  # QPSK
n_sym = N // 4
bits = rng.integers(0, 2, (n_sym, k))
gray = bits.copy()
for b in range(1, k): gray[:, b] ^= gray[:, b-1]
m = k//2
w = 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 = []
for n in range(L_eq-1, N):
    # Variacao lenta do canal
    phase = 0.1 * np.random.randn()
    h_var = h_true * np.exp(1j*phase)
    # Transmitir
    x_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 entrada
    u = rx[n-L_eq+1:n+1]
    if len(u) != L_eq:
        continue
    # Filtrar
    y = w_lms @ u
    # Erro
    d_sym = xs[n - L_eq + 1 + d]  # simbolo desejado (decision-directed)
    e = d_sym - y
    # Atualizar
    w_lms += mu * np.conj(u) * e
    mse_arr.append(np.real(e*np.conj(e)))

# Plotar MSE e convergencia
fig, 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 inverso
w_final = w_lms
c_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()
Figura

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:

$$ W[k] = \frac{1}{H[k]} \quad \text{(ZF)} \qquad \text{ou} \qquad W[k] = \frac{H^*[k]}{|H[k]|^2 + N_0/E_s} \quad \text{(MMSE)}. $$

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.

8.8.5 Teorema da equalização OFDM

$$ \boxed{Y[k] = H[k]\,X[k] + V[k],\qquad k = 0, 1, \ldots, N_{\text{FFT}}-1}, $$

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 np
import matplotlib.pyplot as plt

h = np.array([0.3, 1.0, 0.45])
N = 5; d = N // 2

# Matriz Toeplitz do canal
H = np.zeros((N, N))
for i in range(N):
    for j in range(N):
        lag = i - j
        if 0 <= lag < len(h):
            H[i, j] = h[lag]

# ZF: w tal que Hw = e_d
desired = np.zeros(N); desired[d] = 1.0
w_zf = np.linalg.solve(H, desired)
print(f'Coeficientes ZF: {np.round(w_zf, 4)}')

# Resposta conjunta
c = 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()
Output:
Coeficientes ZF: [  0.      -0.       3.3333 -11.1111  32.037 ]
Resposta conjunta: [ 0.     -0.      1.      0.     -0.     27.037  14.4167]
ISI residual (fora d): 27.037037
Figura

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 np
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)

def run_equalization_compare(eb_n0_dbs, h, N_eq=9, n_sym=20000):
    results = {'ZF': [], 'MMSE': []}
    for db in eb_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()
        for b in range(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:] @ weights
        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))

        for eq_type in ['ZF', 'MMSE']:
            if eq_type == 'ZF':
                # ZF: matriz de autocorrelacao do canal
                R = np.zeros((N_eq, N_eq))
                for i in range(N_eq):
                    for j in range(N_eq):
                        R[i,j] = sum(h[t]*h[t-abs(i-j)] for t in range(abs(i-j), len(h)))
                p = np.array([h[d-i] if 0 <= d-i < len(h) else 0.0 for i in range(N_eq)])
                w = np.linalg.solve(R, p)
            else:
                # MMSE: R + noise regularization
                sigma2 = sigma**2 * 2  # ruido complexo
                R = np.zeros((N_eq, N_eq))
                for i in range(N_eq):
                    for j in range(N_eq):
                        R[i,j] = sum(h[t]*h[t-abs(i-j)] for t in range(abs(i-j), len(h)))
                p = np.array([h[d-i] if 0 <= d-i < len(h) else 0.0 for i in range(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))

    return np.array(results['ZF']), np.array(results['MMSE'])

h = np.array([1.0, -0.95, 0.3])  # canal com nulo espectral
eb = 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()
Figura

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 np
import matplotlib.pyplot as plt

rng = np.random.default_rng(7)
L_chan, L_eq, mu, N = 4, 11, 0.005, 15000
d = 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()
for b in range(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 = []
for n in range(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 - y
    w_lms += mu * np.conj(u) * e
    mse_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()
Figura

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 np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

rng = 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 = 18
sigma = np.sqrt(1/(2*k*10**(EbN0/10)))

bits = rng.integers(0, 2, (N//2, k))
gray = bits.copy()
for b in range(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))

# MMSE
R = np.zeros((N_eq, N_eq))
for i in range(N_eq):
    for j in range(N_eq):
        R[i,j] = sum(h[t]*h[t-abs(i-j)] for t in range(abs(i-j), len(h)))
p = np.array([h[d-i] if 0 <= d-i < len(h) else 0.0 for i in range(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 equalizacao
xs_slice = rx[N_eq-1:N_eq-1+N*2]
for n in range(0, N, 100):
    segment = xs_slice[n:n+2*N_eq]
    if len(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 equalizacao
xs_eq = rx_eq[N_eq-1:N_eq-1+N*2]
for n in range(0, N, 100):
    segment = xs_eq[n:n+2*N_eq]
    if len(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()
Figura

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).

E2. $h = [0{,}5, 1{,}0, 0{,}3]$, $N=5$, $d=2$. Matriz Toeplitz:

$$ \mathbf{H} = \begin{pmatrix} 0{,}5 & 0 & 0 & 0 & 0 \\ 1{,}0 & 0{,}5 & 0 & 0 & 0 \\ 0{,}3 & 1{,}0 & 0{,}5 & 0 & 0 \\ 0 & 0{,}3 & 1{,}0 & 0{,}5 & 0 \\ 0 & 0 & 0{,}3 & 1{,}0 & 0{,}5 \end{pmatrix}. $$

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:

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 é:

$$ y(kT_s + \epsilon) = s(kT_s + \epsilon) + n(kT_s + \epsilon) $$

Expandindo em série de Taylor ao redor do instante ideal $kT_s$:

$$ s(kT_s + \epsilon) = s(kT_s) + \epsilon\,s'(kT_s) + \frac{\epsilon^2}{2}\,s''(kT_s) + \mathcal{O}(\epsilon^3) $$

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$:

$$ s(t) = \sum_{n=-\infty}^{\infty} a_n\,p(t - nT_s) $$

Logo:

$$ y(kT_s + \epsilon) = \sum_{n=-\infty}^{\infty} a_n\,p((k-n)T_s + \epsilon) + n_k $$

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$ é:

$$ \text{ISI}(\epsilon) = \sum_{n\neq 0} a_{k-n}\,p(nT_s + \epsilon) $$

9.2.3 Jitter e Phase Noise

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:

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:

$$ r_{\text{demod}}(t) = r(t)\cdot 2\cos(2\pi f_c t + \hat{\phi}) = \text{Re}\left\{r(t)\,e^{-j\hat{\phi}}\right\} $$

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,

$$ e_\phi[n]=\operatorname{Im}\{r_n\hat a_n^*\}. $$

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

$$ r_n\hat a_n^*=a_ne^{j\epsilon_\phi}a_n^*=|a_n|^2e^{j\epsilon_\phi}. $$

Como QPSK tem $|a_n|^2=1$,

$$ \boxed{e_\phi[n]=\operatorname{Im}\{r_n\hat a_n^*\}=\sin\epsilon_\phi\approx\epsilon_\phi.} $$

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:

$$ \boxed{-\frac{\pi}{M}<\epsilon_\phi-\frac{2k\pi}{M}<\frac{\pi}{M}.} $$

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:

  1. Detector de fase: produz erro $e_\phi$ (ex.: $\sin(M\epsilon_\phi)$ para Costas loop).
  2. Filtro de malha: para PLL de 1ª ordem, é um ganho constante $K$.
  3. 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$ é:

$$ \epsilon_\phi^{\text{ss}} = \frac{\Delta\omega}{K_dK_0} = \frac{2\pi\Delta f}{K_dK_0} $$

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

$$ e_\phi[k] = \operatorname{Im}\{r_k \cdot \hat{a}_k^*\} $$

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 é:

$$ \boxed{\hat{\phi}_k = \arg\left(\sum_{p \in \text{pilotos}} r_p\,d_p^*\right)} $$

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} $$
$$ \boxed{\widehat{\Delta f} = \frac{F_s}{2\pi D}\arg(P)} $$

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 np
import 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ímbolos
M = 4             # QPSK
K = 0.05          # ganho de malha
F_c = 0.02        # offset de frequência normalizado (cycles/symbol)
phi_init = 0.4    # erro de fase inicial (radianos)

# Gerar símbolos QPSK
symbols = np.exp(1j * np.pi/2 * np.random.randint(0, 4, N))

# Gerar ruído AWGN (SNR = 15 dB)
EbN0_db = 15
sigma = 10**(-EbN0_db/20)
noise = sigma * (np.random.randn(N) + 1j*np.random.randn(N)) / np.sqrt(2)

# Simular canal com CFO e fase inicial
t = 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_init
corrected = np.zeros(N, dtype=complex)

for k in range(N):
    demod = received[k] * np.exp(-1j * phase_dot)
    d_i = 1 if demod.real >= 0 else -1
    d_q = 1 if demod.imag >= 0 else -1
    decision = d_i + 1j*d_q
    error = np.imag(demod * np.conj(decision) / np.abs(decision))
    phase_dot += K * error
    phase_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.pi
print(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 fase
fig, 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 corrigida
fig, 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 K
fig, ax = plt.subplots(figsize=(7, 4))
K_vals = np.linspace(0.001, 0.2, 100)
rms_errors = []
for K_test in K_vals:
    ph = phi_init
    errs = []
    for k in range(N):
        demod = received[k] * np.exp(-1j * ph)
        d_i = 1 if demod.real >= 0 else -1
        d_q = 1 if demod.imag >= 0 else -1
        err = np.imag(demod * np.conj(d_i + 1j*d_q) / np.abs(d_i + 1j*d_q))
        ph += K_test * err
        phase_err = ((ph - phi_init - 2*np.pi*F_c*k + np.pi) % (2*np.pi)) - np.pi
        errs.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

Considere o sinal recebido após o filtro casado:

$$ r(t) = \sum_{n=-\infty}^{\infty} a_n\,p(t - nT_s + \epsilon T_s) + n(t) $$

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).

9.4.3 Detector de Erro de Timing (TED): Gardner

$$ \boxed{e_k=\operatorname{Re}\!\left\{y_k^*\bigl(y_{k-1/2}-y_{k+1/2}\bigr)\right\}} $$

onde $y_{k}$ é a amostra em $kT$ e $y_{k\pm 1/2}$ são as amostras em $(k\pm 1/2)T$.

9.4.3.1 DEDUÇÃO do Gardner TED

Para QPSK, $a_n = I_n + jQ_n$ com $I_n, Q_n \in \{\pm 1/\sqrt{2}\}$. A componente I é:

$$ y_I(t) = \sum_n I_n p(t - nT_s + \epsilon T_s) $$

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:

Limitação: zona morta muito estreta em $\epsilon = 0$, dificultando aquisição para offsets grandes.

9.4.4 Detector de Mueller & Müller (M&M)

$$ \boxed{e_k=\operatorname{Re}\!\left\{y_k\hat a_{k-1}^*-y_{k-1}\hat a_k^*\right\}} $$

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$:

$$ y_k \approx a_k p(\epsilon T_s) + a_{k-1} p((1-\epsilon)T_s) + a_{k+1} p((-1-\epsilon)T_s) + \dots $$

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$.

$$ \boxed{\mathbb E[e_k]\propto p((1+\epsilon)T_s)-p((1-\epsilon)T_s)} $$

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:

  1. TED (Gardner ou M&M): produz erro $e_k$
  2. Filtro de malha: filtro digital (tipicamente IIR ou FIR)
  3. 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$:

$$ y(\tau) = \sum_{n=0}^{M-1} x[n] \cdot p_{\text{interp}}(\tau - nT_s) $$

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 np
import matplotlib.pyplot as plt

# === Timing Error Detector (TED): Resposta ao erro de timing ===
np.random.seed(42)

N = 10000
alpha = 0.25
Fs = 4
SNR_db = 20

# Gerar símbolos QAM-16
symbols = (2*np.random.randint(0,4,N)-1.5) + 1j*(2*np.random.randint(0,4,N)-1.5)
symbols = symbols / np.sqrt(10)

def rc_pulse(t_vals, alpha=0.25):
    result = np.zeros_like(t_vals)
    eps = 1e-12
    near_zero = np.abs(t_vals) < eps
    near_edge = np.abs(np.abs(t_vals) - 0.5/alpha) < eps
    result[near_zero] = 1.0
    result[near_edge] = np.pi/4 * np.sinc(0.5/alpha)
    not_special = ~near_zero & ~near_edge
    t_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)
    return result

t_full = np.arange(-30, 30+1) / Fs
tx_signal = np.zeros(len(t_full), dtype=complex)
for n in range(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 timing
epsilons = np.linspace(-0.45, 0.45, 91)
gardeners = np.zeros_like(epsilons)
mm_errors = np.zeros_like(epsilons)

for i, eps in enumerate(epsilons):
    sample_indices = np.arange(-15, N+15) + eps
    samples = np.interp(sample_indices, t_full, r)
    
    g_errs = []
    for k in range(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)) if g_errs else 0
    
    mm_errs = []
    for k in range(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]) if np.abs(symbols[2*k]) > 1e-10 else 0
        d_odd = symbols[2*k-1] / np.abs(symbols[2*k-1]) if np.abs(symbols[2*k-1]) > 1e-10 else 0
        mm_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) if mm_errs else 0

fig, 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 timing
fig, axes = plt.subplots(2, 3, figsize=(12, 7))
eps_test = [-0.4, -0.2, 0.0, 0.2, 0.4, 0.45]
for ax, eps in zip(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') if ax in axes[:,0] else None
    ax.set_xlabel('I') if ax in axes[1,:] else None
plt.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:

$$ \rho[k] = \frac{|C[k]|^2}{\left(\sum_{n=0}^{L-1} |r[k+n]|^2\right) \cdot \left(\sum_{n=0}^{L-1} |p[n]|^2\right)} $$

9.5.3 DEDUÇÃO da Probabilidade de Falso Alarme

Sob hipótese nula ($H_0$, apenas ruído AWGN $n[k] \sim \mathcal{CN}(0, \sigma_n^2)$):

$$ C[k] = \sum_{n=0}^{L-1} n[k+n] \cdot p^*[n] $$

O módulo ao quadrado $|C[k]|^2$ segue distribuição exponencial:

$$ |C[k]|^2 \sim \text{Exp}(\lambda), \quad \lambda = \frac{1}{\sigma_n^2 E_p} $$
$$ \boxed{P_{FA} = \Pr\{|C[k]|^2 > \gamma\} = e^{-\gamma/(\sigma_n^2 E_p)} = e^{-\gamma/(N_0 E_p/2)}} $$

Para $E_p/N_0 = 20$ dB e $\gamma = 10 \cdot \sigma_n^2 E_p$:

$$ P_{FA} = e^{-10} \approx 4{,}5 \times 10^{-5} $$

9.5.4 Frame Alignment Word (FAW) e Sequências m

Sequências m (m-sequences): geradas por registradores de deslocamento com feedback linear:

$$ R_m(\tau) = \begin{cases} m & \tau = 0 \\ -1 & \tau \neq 0 \end{cases} $$

onde $m = 2^n - 1$ é o período. A relação de pico-lateral é $(m+1)/(m-1) \approx 1$ para $m$ grande — ruim para detecção direta.

Melhoria: sequências de Barker (comprimentos: 2, 3, 4, 5, 7, 11, 13) ou Zadoff–Chu (para OFDM).

9.5.5 Algoritmo de Busca

  1. Sliding correlation: $O(L \cdot N_{\text{samples}})$. Simples, mas lento.
  2. Parallel correlation (FFT): $O(N_{\text{samples}} \log N_{\text{samples}})$. Mais rápido para preâmbulos longos.

Prática: etapa grossa (FFT) + etapa fina (sliding na região de interesse).

9.5.6 Detecção de Pacote

Em sistemas burst, detectar o início do pacote antes do preâmbulo:

$$ E[k] = \sum_{n=0}^{M-1} |r[k+n]|^2 $$

Quando $E[k]$ excede um limiar baseado no nível de ruído estimado, um pacote foi detectado.

9.5.7 DEDUÇÃO: Ganho de Correlação com Preâmbulo Repetido

Com duas cópias idênticas $p$ de comprimento $L/2$:

$$ P[k] = \sum_{n=0}^{L/2-1} r[k+n+L/2] \cdot r^*[k+n] $$

Para $E_s \gg N_0$:

$$ \text{SNR}_{\text{det}} \approx \frac{L}{2} \cdot \frac{E_s}{N_0} $$

9.6 Sincronismo em Sistemas OFDM

9.6.1 Desafios do OFDM

OFDM exige três tipos de sincronismo simultaneamente:

  1. Timing sync: identificar o início da FFT window (antes do CP)
  2. FFT bin sync: alinhar a FFT com as subportadoras
  3. Carrier offset sync: corrigir fase residual por subportadora

Sem estes, a ortogonalidade entre subportadoras é perdida, gerando interferência entre portadoras (ICI).

9.6.2 Sincronismo de Timing: Correlação do Guard Interval (CP)

O cyclic prefix (CP) é uma cópia do final do símbolo OFDM copiada para o início. Permite estimar o timing pelo pico de correlação:

$$ C_{CP}(d)=\sum_{n=0}^{N_g-1}r[d+n]r^*[d+n+N] $$

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.

9.6.3 Estimador de Timing de Schmidl & Cox

A métrica de timing é:

$$ P(d)=\sum_{n=0}^{L-1}r^*[d+n]r[d+n+L],\qquad R(d)=\sum_{n=0}^{L-1}|r[d+n+L]|^2, $$

e a métrica normalizada é

$$ \boxed{M(d)=\frac{|P(d)|^2}{R^2(d)+\varepsilon}}, $$

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.

$$ Y[k] = H[k]\cdot X[k]\cdot e^{-j2\pi k\Delta/N} + \text{ruído} $$

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$

9.6.5 Estimador de CFO e Pilotos OFDM

$$ \boxed{\widehat{\Delta f}=-\frac{F_s}{2\pi N}\arg\left(\sum_{n=0}^{N_g-1} r[d+n]\,r^*[d+n+N]\right)} $$

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)$.

Pilotos por subportadora:

$$ \hat{\phi}[k] = \arg\left(R[k] \cdot D[k]^*\right) $$
PYTHON
import numpy as np
import matplotlib.pyplot as plt

# === Sincronismo OFDM: Schmidl & Cox ===
np.random.seed(42)

N_fft = 64
N_cp = 16
N_sym = N_fft + N_cp

np.random.seed(42)
L = N_fft // 2
train_half = np.random.randn(L) + 1j*np.random.randn(L)
train_symbol = np.concatenate([train_half, train_half])
cp_symbol = np.concatenate([train_symbol[-N_cp:], train_symbol])
training_frame = np.concatenate([cp_symbol, np.zeros(100)])

snr_db = 15
sigma = 10**(-snr_db/20) / np.sqrt(2)
noise = sigma * (np.random.randn(len(training_frame)) + 1j*np.random.randn(len(training_frame)))
r = training_frame + noise

# Offset de timing artificial
timing_offset = 20
r_shifted = np.roll(r, timing_offset)

# Schmidl & Cox
gamma = np.zeros(len(r_shifted) - 2*L, dtype=complex)
sigma_sq = np.zeros(len(r_shifted) - 2*L)
for d in range(len(gamma)):
    first = r_shifted[d:d+L]
    second = r_shifted[d+L:d+2*L]
    gamma[d] = np.vdot(first, second)
    sigma_sq[d] = np.mean(np.abs(second)**2)
P = np.abs(gamma)**2 / (sigma_sq + 1e-12)

threshold = 5.0
detections = np.where(P > threshold)[0]
d_start = detections[0] if len(detections) > 0 else -1
print(f"Schmidl & Cox: detecção d={d_start}, offset real {timing_offset}, erro {abs(d_start-timing_offset)}")

# CFO
df_true = 0.03
r_cfo = r_shifted * np.exp(1j * 2 * np.pi * df_true * np.arange(len(r_shifted)))
first_cfo = r_cfo[timing_offset+N_cp:timing_offset+N_cp+L]
second_cfo = r_cfo[timing_offset+N_cp+L:timing_offset+N_cp+2*L]
gamma_cfo = np.vdot(first_cfo, second_cfo)
df_est = (1/(2*np.pi*L)) * np.angle(gamma_cfo)
print(f"CFO: real={df_true:.4f}, estimado={df_est:.4f}, erro={abs(df_true-df_est):.6f}")

# Plot: métrica P(d)
fig, ax = plt.subplots(figsize=(10, 4))
plot_range = slice(max(0, d_start-20), min(len(P), d_start+200))
ax.plot(np.arange(len(P))[plot_range], P[plot_range], color='#2563eb', lw=1.5)
ax.axhline(threshold, color='#dc2626', linestyle='--', lw=1.5, label=f'Limiar = {threshold}')
ax.axvline(d_start, color='#047857', linestyle='-', lw=2, label=f'Detecção: d = {d_start}')
ax.axvline(timing_offset, color='#7c3aed', linestyle=':', lw=2, label=f'Real: d = {timing_offset}')
ax.set_xlabel('Amostra d'); ax.set_ylabel('Métrica P(d)')
ax.set_title(f'Schmidl & Cox: Timing OFDM (SNR={snr_db} dB, N_cp={N_cp})')
ax.legend(); ax.grid(alpha=.2)
plt.tight_layout()
plt.close()

# Plot: CFO
fig, axes = plt.subplots(1, 2, figsize=(8, 3.5))
const_no = train_half * np.exp(1j*2*np.pi*df_true*np.arange(len(train_half)))
axes[0].scatter(const_no.real[:300], const_no.imag[:300], s=4, alpha=.4, color='#2563eb')
axes[0].set_title('Sem correção de CFO')
axes[0].set_xlim(-3,3); axes[0].set_ylim(-3,3); axes[0].set_aspect('equal'); axes[0].grid(alpha=.2)
axes[0].axhline(0, color='k', lw=.3, alpha=.3); axes[0].axvline(0, color='k', lw=.3, alpha=.3)
axes[1].scatter(train_half.real[:300], train_half.imag[:300], s=4, alpha=.4, color='#047857')
axes[1].set_title('Com correção de CFO')
axes[1].set_xlim(-3,3); axes[1].set_ylim(-3,3); axes[1].set_aspect('equal'); axes[1].grid(alpha=.2)
axes[1].axhline(0, color='k', lw=.3, alpha=.3); axes[1].axvline(0, color='k', lw=.3, alpha=.3)
plt.suptitle('OFDM: efeito do CFO na constelação', fontsize=11)
plt.tight_layout()
plt.close()

print("✓ OFDM synchronization simulation complete.")
Output:
Schmidl & Cox: detecção d=0, offset real 20, erro 20
CFO: real=0.0300, estimado=-0.0012, erro=0.031203
✓ OFDM synchronization simulation complete.

9.7 Análise de Performance com Erro de Sincronismo

9.7.1 BER vs. Erro de Timing $\epsilon$

Para BPSK com pulso raised cosine, amostrado com erro $\epsilon T_s$:

$$ y_k = \pm\sqrt{E_s}\cdot p(\epsilon T_s) + \sum_{n\neq k} \pm\sqrt{E_s}\cdot p((k-n)T_s + \epsilon T_s) + n_k $$

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,

$$ P_b(\epsilon)\approx Q\!\left(\sqrt{\frac{2E_b}{N_0}}\,|p(\epsilon T_s)|\right),\qquad L_t=-10\log_{10}|p(\epsilon T_s)|^2. $$

Para sinc, $\operatorname{sinc}(\epsilon)\approx1-\pi^2\epsilon^2/6$, logo

$$ \boxed{L_t\approx\frac{10\pi^2}{3\ln10}\epsilon^2\approx14{,}3\epsilon^2\ \text{dB}.} $$

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.

9.7.2 BER vs. Erro de Fase $\Delta\phi$

Para PSK com erro de fase:

$$ \boxed{P_b(\Delta\phi) \approx Q\left(\sqrt{\frac{2E_b}{N_0}}\cos(\Delta\phi)\right)} $$

Perda:

$$ \boxed{L_\phi=-10\log_{10}(\cos^2\Delta\phi)\approx\frac{10}{\ln10}\Delta\phi^2\approx4{,}34\Delta\phi^2\ \text{dB}} $$

Para perda $< 0{,}5$ dB:

$$ \boxed{|\Delta\phi|<\sqrt{0{,}5/4{,}34}\approx0{,}34\ \text{rad}\approx19{,}5^\circ} $$

9.7.3 Efeito do Erro de Frequência

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.

9.7.4 BER Combinada

$$ P_b^{\text{eff}} \approx Q\left(\sqrt{\frac{2E_b}{N_0}}\cdot p(\epsilon)\cdot\cos(\Delta\phi)\right) $$
PYTHON
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc

# === BER vs. Erro de Sincronismo ===
np.random.seed(42)

def ber_theory_bpsk(EbN0_lin, timing_err=0.0, phase_err=0.0):
    alpha = 0.25
    p_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**2
    return 0.5 * erfc(np.sqrt(eff))

# BER teórica
EbN0_dbs = np.linspace(0, 15, 300)
fig, ax = plt.subplots(figsize=(8, 5))
for eps, lbl, clr in [(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) for db in EbN0_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 Carlo
fig, ax = plt.subplots(figsize=(8, 5))
N_mc = 50000
for eps, lbl, clr in [(0.0, 'MC Ideal', '#2563eb'), (0.05, 'MC $\\epsilon=0.05$', '#dc2626'),
                        (0.10, 'MC $\\epsilon=0.10$', '#047857')]:
    bers = []
    for db in EbN0_dbs:
        EbN0 = 10**(db/10)
        sigma = 1/np.sqrt(2*EbN0)
        bits = np.random.randint(0, 2, N_mc)
        sym = 2*bits - 1
        alpha = 0.25
        p_eps = np.cos(np.pi*alpha*eps) / (1 + (2*alpha*eps)**2)
        sym_tx = sym * p_eps
        # ISI simples
        isi = 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:

  1. Rastreamento de fase ao longo dos símbolos
  2. Constelação corrigida após o loop
  3. 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:

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:

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 np
import matplotlib.pyplot as plt

# === Detecção de Frame Sync por Correlação ===
np.random.seed(42)

# Parâmetros
L_preamble = 64           # comprimento do preâmbulo
N_frames = 100            # número de quadros
bits_per_frame = 512      # bits por quadro
Fs = 1                    # normalizado
snr_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órios
all_bits = np.random.randint(0, 2, N_frames * bits_per_frame)
all_symbols = 2*all_bits - 1

# Montar frames com preâmbulos
frame_samples = []
frame_starts = []
sample_idx = 0
for i in range(N_frames):
    frame_samples.extend(preamble.tolist())
    frame_starts.append(sample_idx)
    sample_idx += L_preamble
    frame_samples.extend(all_symbols[i*bits_per_frame:(i+1)*bits_per_frame].tolist())
    sample_idx += bits_per_frame

# Adicionar ruído
snr_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 sliding
corr = 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 picos
from scipy.signal import find_peaks
peaks, _ = 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 corretas
correct = 0
missed = 0
false_alarms = 0
for fs in frame_starts:
    found = any(abs(p - fs) < 5 for p in peaks)
    if found:
        correct += 1
    else:
        missed += 1
false_alarms = len(peaks) - correct
print(f"  Corretas: {correct}/{N_frames}, Perdidas: {missed}, Falsas: {false_alarms}")

# Plot: correlação com preâmbulos
fig, ax = plt.subplots(figsize=(12, 4))
ax.plot(corr_norm, color='#2563eb', lw=0.8, label='Correlação normalizada')
for fs in frame_starts:
    ax.axvline(fs, color='#dc2626', linestyle=':', alpha=.3, label='Preâmbulo real' if fs == frame_starts[0] else '')
for p in peaks:
    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.")
Output:
Detecção de Frame Sync:
  Preâmbulo real em: [0, 576, 1152, 1728, 2304, 2880, 3456, 4032, 4608, 5184, 5760, 6336, 6912, 7488, 8064, 8640, 9216, 9792, 10368, 10944, 11520, 12096, 12672, 13248, 13824, 14400, 14976, 15552, 16128, 16704, 17280, 17856, 18432, 19008, 19584, 20160, 20736, 21312, 21888, 22464, 23040, 23616, 24192, 24768, 25344, 25920, 26496, 27072, 27648, 28224, 28800, 29376, 29952, 30528, 31104, 31680, 32256, 32832, 33408, 33984, 34560, 35136, 35712, 36288, 36864, 37440, 38016, 38592, 39168, 39744, 40320, 40896, 41472, 42048, 42624, 43200, 43776, 44352, 44928, 45504, 46080, 46656, 47232, 47808, 48384, 48960, 49536, 50112, 50688, 51264, 51840, 52416, 52992, 53568, 54144, 54720, 55296, 55872, 56448, 57024]
  Detecções em:      [19, 56, 97, 146, 198, 244, 283, 350, 386, 447, 535, 576, 631, 689, 732, 765, 862, 929, 961, 1000, 1071, 1152, 1213, 1255, 1325, 1394, 1428, 1473, 1506, 1558, 1627, 1673, 1728, 1800, 1860, 1942, 2024, 2095, 2138, 2185, 2304, 2338, 2372, 2420, 2472, 2515, 2560, 2593, 2627, 2674, 2714, 2751, 2828, 2880, 2917, 2968, 3000, 3033, 3126, 3164, 3201, 3260, 3307, 3349, 3383, 3416, 3456, 3499, 3537, 3600, 3633, 3701, 3768, 3801, 3839, 3874, 3915, 3993, 4032, 4098, 4144, 4181, 4232, 4284, 4327, 4370, 4441, 4503, 4543, 4608, 4675, 4739, 4806, 4840, 4874, 4920, 4952, 4997, 5077, 5184, 5227, 5270, 5311, 5376, 5457, 5526, 5577, 5625, 5662, 5713, 5760, 5793, 5835, 5922, 5971, 6015, 6058, 6096, 6131, 6182, 6228, 6278, 6336, 6452, 6502, 6569, 6601, 6648, 6701, 6767, 6814, 6869, 6912, 6957, 7001, 7053, 7095, 7143, 7177, 7236, 7275, 7369, 7447, 7488, 7540, 7583, 7656, 7727, 7799, 7842, 7888, 7937, 7983, 8021, 8064, 8133, 8172, 8211, 8258, 8315, 8356, 8410, 8453, 8526, 8593, 8640, 8697, 8755, 8789, 8859, 8901, 8944, 8993, 9045, 9088, 9127, 9161, 9216, 9291, 9369, 9468, 9502, 9553, 9600, 9635, 9698, 9737, 9792, 9835, 9878, 9923, 9975, 10032, 10111, 10156, 10216, 10297, 10334, 10368, 10438, 10519, 10580, 10658, 10714, 10806, 10866, 10944, 10983, 11047, 11081, 11123, 11169, 11229, 11306, 11349, 11394, 11427, 11483, 11520, 11581, 11633, 11674, 11737, 11788, 11858, 11894, 11934, 11973, 12010, 12049, 12096, 12148, 12235, 12293, 12463, 12503, 12539, 12604, 12672, 12719, 12779, 12829, 12864, 12928, 12986, 13033, 13069, 13145, 13208, 13248, 13285, 13331, 13380, 13470, 13513, 13547, 13648, 13708, 13746, 13824, 13861, 13919, 14016, 14059, 14101, 14151, 14197, 14232, 14265, 14335, 14400, 14450, 14503, 14566, 14608, 14642, 14691, 14738, 14783, 14826, 14887, 14937, 14976, 15031, 15106, 15164, 15202, 15237, 15279, 15313, 15356, 15420, 15466, 15506, 15552, 15595, 15638, 15693, 15726, 15765, 15798, 15844, 15901, 15937, 15973, 16027, 16081, 16128, 16168, 16214, 16277, 16343, 16376, 16476, 16509, 16562, 16608, 16641, 16704, 16747, 16785, 16826, 16861, 16894, 16943, 16989, 17035, 17087, 17159, 17217, 17280, 17329, 17435, 17488, 17535, 17567, 17625, 17675, 17715, 17776, 17856, 17908, 17943, 17980, 18021, 18056, 18117, 18190, 18225, 18261, 18317, 18364, 18432, 18510, 18582, 18643, 18684, 18755, 18798, 18832, 18898, 18939, 19008, 19051, 19107, 19151, 19201, 19234, 19271, 19335, 19388, 19478, 19523, 19584, 19627, 19666, 19709, 19747, 19800, 19857, 19904, 19954, 20012, 20075, 20120, 20160, 20212, 20265, 20322, 20368, 20453, 20486, 20532, 20572, 20612, 20693, 20736, 20785, 20831, 20917, 20958, 21031, 21076, 21138, 21214, 21275, 21312, 21351, 21394, 21438, 21476, 21514, 21546, 21615, 21674, 21712, 21801, 21841, 21888, 21930, 21971, 22026, 22081, 22148, 22210, 22294, 22340, 22383, 22417, 22464, 22549, 22613, 22675, 22720, 22758, 22815, 22858, 22905, 22952, 23040, 23128, 23198, 23244, 23287, 23334, 23388, 23428, 23497, 23544, 23576, 23616, 23665, 23729, 23816, 23876, 23912, 23963, 23998, 24068, 24120, 24153, 24192, 24263, 24298, 24333, 24369, 24409, 24456, 24493, 24528, 24562, 24618, 24664, 24701, 24768, 24818, 24866, 24913, 24977, 25024, 25057, 25126, 25191, 25246, 25292, 25344, 25406, 25461, 25522, 25567, 25616, 25702, 25740, 25779, 25815, 25868, 25920, 25988, 26025, 26065, 26112, 26146, 26219, 26285, 26332, 26376, 26496, 26552, 26591, 26665, 26715, 26794, 26858, 26891, 26933, 26975, 27014, 27072, 27133, 27166, 27213, 27258, 27328, 27361, 27426, 27481, 27527, 27579, 27648, 27744, 27806, 27839, 27877, 27927, 27998, 28061, 28104, 28163, 28224, 28271, 28360, 28395, 28435, 28487, 28524, 28558, 28594, 28645, 28714, 28757, 28800, 28867, 28914, 28969, 29042, 29093, 29132, 29201, 29243, 29284, 29316, 29376, 29429, 29462, 29498, 29555, 29596, 29633, 29699, 29754, 29802, 29858, 29913, 29952, 30002, 30053, 30088, 30180, 30273, 30337, 30396, 30454, 30528, 30621, 30666, 30713, 30778, 30844, 30938, 31019, 31061, 31104, 31205, 31244, 31281, 31390, 31471, 31510, 31577, 31629, 31680, 31770, 31846, 31879, 31912, 31955, 32021, 32061, 32147, 32187, 32256, 32299, 32351, 32383, 32426, 32466, 32499, 32538, 32604, 32663, 32710, 32752, 32785, 32832, 32881, 33012, 33067, 33109, 33169, 33215, 33259, 33308, 33340, 33408, 33472, 33519, 33555, 33618, 33657, 33689, 33732, 33772, 33806, 33849, 33881, 33941, 33984, 34060, 34093, 34165, 34201, 34247, 34347, 34395, 34429, 34472, 34527, 34560, 34606, 34644, 34719, 34760, 34814, 34853, 34922, 34954, 35016, 35089, 35136, 35179, 35227, 35266, 35331, 35377, 35418, 35460, 35516, 35607, 35654, 35712, 35762, 35832, 35878, 35920, 35972, 36022, 36063, 36123, 36155, 36195, 36288, 36345, 36418, 36471, 36532, 36573, 36613, 36710, 36748, 36817, 36864, 36937, 37005, 37066, 37124, 37164, 37211, 37260, 37312, 37350, 37382, 37440, 37520, 37573, 37640, 37699, 37756, 37810, 37847, 37879, 37936, 37969, 38016, 38053, 38100, 38148, 38196, 38255, 38325, 38375, 38486, 38545, 38592, 38653, 38734, 38781, 38824, 38882, 38958, 38991, 39044, 39120, 39168, 39231, 39276, 39319, 39370, 39425, 39462, 39497, 39540, 39579, 39618, 39701, 39744, 39781, 39827, 39866, 39926, 39999, 40036, 40078, 40123, 40211, 40245, 40286, 40320, 40387, 40433, 40499, 40552, 40607, 40643, 40706, 40771, 40808, 40851, 40896, 40941, 40991, 41096, 41159, 41193, 41246, 41293, 41335, 41409, 41472, 41511, 41564, 41627, 41672, 41712, 41746, 41796, 41899, 41963, 42014, 42048, 42091, 42131, 42203, 42246, 42278, 42317, 42372, 42428, 42464, 42525, 42572, 42624, 42692, 42787, 42886, 42935, 42968, 43033, 43084, 43125, 43168, 43200, 43252, 43331, 43383, 43423, 43457, 43496, 43553, 43601, 43634, 43698, 43737, 43776, 43831, 43889, 43952, 44037, 44089, 44131, 44171, 44209, 44254, 44298, 44352, 44390, 44463, 44553, 44585, 44619, 44665, 44723, 44755, 44809, 44869, 44928, 44978, 45023, 45064, 45108, 45159, 45217, 45285, 45341, 45399, 45435, 45504, 45574, 45617, 45673, 45715, 45748, 45787, 45868, 45936, 45988, 46021, 46080, 46119, 46154, 46226, 46260, 46360, 46436, 46488, 46570, 46609, 46656, 46725, 46760, 46834, 46872, 46933, 46992, 47039, 47090, 47149, 47185, 47232, 47275, 47316, 47349, 47400, 47476, 47514, 47568, 47603, 47687, 47761, 47808, 47881, 47922, 47997, 48048, 48117, 48161, 48208, 48263, 48300, 48337, 48384, 48434, 48511, 48549, 48618, 48687, 48730, 48790, 48831, 48877, 48960, 49003, 49047, 49094, 49152, 49186, 49227, 49284, 49329, 49397, 49460, 49499, 49536, 49638, 49692, 49730, 49787, 49842, 49879, 49950, 50018, 50073, 50112, 50188, 50258, 50293, 50337, 50378, 50435, 50467, 50507, 50556, 50596, 50633, 50688, 50731, 50771, 50814, 50852, 50892, 50929, 51034, 51099, 51138, 51175, 51212, 51264, 51297, 51369, 51412, 51466, 51539, 51572, 51622, 51676, 51721, 51753, 51788, 51840, 51907, 51982, 52017, 52064, 52098, 52144, 52187, 52228, 52278, 52310, 52373, 52416, 52477, 52520, 52567, 52601, 52636, 52675, 52718, 52761, 52814, 52853, 52923, 52959, 52992, 53042, 53082, 53157, 53212, 53275, 53321, 53382, 53421, 53462, 53497, 53568, 53607, 53663, 53708, 53742, 53811, 53871, 53909, 53946, 54019, 54094, 54144, 54202, 54235, 54320, 54357, 54432, 54477, 54540, 54603, 54647, 54679, 54720, 54774, 54833, 54889, 54959, 55005, 55042, 55105, 55138, 55192, 55244, 55296, 55348, 55440, 55515, 55561, 55600, 55641, 55684, 55752, 55807, 55872, 55926, 55970, 56014, 56060, 56124, 56158, 56192, 56244, 56281, 56344, 56399, 56448, 56503, 56551, 56601, 56663, 56699, 56736, 56768, 56811, 56846, 56885, 56934, 56966, 57024, 57180, 57232, 57346, 57403, 57446, 57494, 57529]
  Comprimento preâmbulo: 64
  Limiar: 0.176
  Corretas: 99/100, Perdidas: 1, Falsas: 1000
✓ Frame sync simulation complete.

9.9 Lista de Exercícios Propostos

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°}$.

E2. Faixa não ambígua: $\boxed{|\Delta f| < F_s/(2D) = 1\,\text{MHz}/200 = 5\,\text{kHz}}$.

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.

E6. $P_{FA} = e^{-\gamma/(\sigma_n^2 E_p)}$. Para $\gamma = 5 \cdot \sigma_n^2 E_p$: $P_{FA} = e^{-5} \approx 6{,}7 \times 10^{-3}$. Para $\gamma = 10$: $e^{-10} \approx 4{,}5 \times 10^{-5}$. Para $\gamma = 15$: $e^{-15} \approx 3{,}1 \times 10^{-7}$.

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:

  1. Detecção de pacote por energia
  2. Estimador de CFO por preâmbulo repetido
  3. Costas loop para tracking fino de fase
  4. Gardner TED para timing
  5. Detecção de preâmbulo de frame
  6. 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.

$$ R_{\mathrm{info}}=R_cR_b=\frac47\,7=4\,\mathrm{Mbit/s}. $$

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:

$$ \boxed{d_H(\mathbf c_1,\mathbf c_2) = w_H(\mathbf c_1 \oplus \mathbf c_2)} $$

onde $w_H(\mathbf x)$ é o peso de Hamming (número de 1s em $\mathbf x$). A distância mínima do código, $d_{min}$, determina sua capacidade:

$$ \boxed{t=\left\lfloor\frac{d_{min}-1}{2}\right\rfloor}\quad\text{erros corrigíveis}, \qquad \boxed{d_{min}-1}\quad\text{erros detectáveis}. $$

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,

$$ \boxed{d_{min}=\min_{\mathbf c\ne\mathbf0}w_H(\mathbf c)}, $$

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.

Se $\mathbf r=\mathbf c+\mathbf e$, então

$$ \mathbf s=H\mathbf r^T=H\mathbf c^T+H\mathbf e^T=H\mathbf e^T. $$

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 é:

$$ p_1=d_1\oplus d_2\oplus d_4,\quad p_2=d_1\oplus d_3\oplus d_4,\quad p_4=d_2\oplus d_3\oplus d_4. $$

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.

10.5.2 Códigos SECDED (Single Error Correction, Double Error Detection)

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$:

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:

1101000
⊕ 1011    (g × x^3)
-------
  110000
⊕ 1011    (g × x^2)
-------
  11100
⊕ 1011    (g × x^1)
-------
  1010
⊕ 1011    (g × x^0)
-------
   001

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:

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$,

$$ v_1[k]=u[k]\oplus u[k-1]\oplus u[k-2],\qquad v_2[k]=u[k]\oplus u[k-2]. $$

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:

$$ d_H = \sum_k \mathbb{I}(y_k^{\text{dura}} \neq \hat{y}_k^{\text{esperado}}) $$

10.8 Limite de Shannon

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$ é:

$$ \frac{C}{R_b} = \log_2(1 + \frac{E_b}{N_0}R_c) $$

O limite de Shannon para $E_b/N_0$ mínimo (com $C/R_b \to 0$) é:

$$ \boxed{\left(\frac{E_b}{N_0}\right)_{\min} = \ln 2 \approx -1{,}59\,\mathrm{dB}} $$

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 np

def hamming74_encode(d):
    d1, d2, d3, d4 = map(int, d)
    p1 = d1 ^ d2 ^ d4
    p2 = d1 ^ d3 ^ d4
    p4 = d2 ^ d3 ^ d4
    return np.array([p1, p2, d1, p4, d2, d3, d4], dtype=int)

def hamming74_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*s4
    if pos:
        r[pos-1] ^= 1
    return r[[2, 4, 5, 6]], pos

# Teste 1: sem erro
data = 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}')
assert np.array_equal(data, decoded) and position == 0

# Teste 2: erro no 5º bit
received = codeword.copy(); received[4] ^= 1
decoded, position = hamming74_decode(received)
print(f'Recebido com erro: {received}')
print(f'Decodificado (com erro): {decoded}, posição corrigida: {position}')
assert np.array_equal(data, decoded) and position == 5

# Teste 3: dois erros (correção indevida possível)
received2 = codeword.copy()
received2[0] ^= 1; received2[1] ^= 1
decoded2, 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 indevida

print("✓ 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
def crc_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 zeros
    for _ in range(poly_len - 1):
        msg.append(0)
        
    # Polynomial division
    for i in range(len(message_bits)):
        if msg[i] == 1:
            for j in range(poly_len):
                msg[i+j] ^= poly[j]
                
    return msg[-(poly_len-1):]

# Teste CRC
message = [1, 1, 0, 1]
poly = [1, 0, 1, 1]  # x^3 + x + 1
remainder = crc_compute(message, poly)
print(f'Mensagem: {message}')
print(f'Polinômio: {poly}')
print(f'Resto CRC: {remainder}')

# Transmitted codeword
codeword_crc = message + remainder
print(f'Codeword transmitido: {codeword_crc}')

# Verify with no error
verify_remainder = crc_compute(codeword_crc, poly)
print(f'Resto na verificação (sem erro): {verify_remainder}')
assert verify_remainder == [0, 0, 0]

# Verify with error
codeword_error = codeword_crc.copy()
codeword_error[3] ^= 1
error_remainder = crc_compute(codeword_error, poly)
print(f'Resto na verificação (com erro): {error_remainder}')
assert error_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 np

class ViterbiDecoder:
    def __init__(self, k=1, n=2, memory=2, generators=[7, 5]):
        self.k = k
        self.n = n
        self.memory = memory
        self.generators = generators
        self.num_states = 2**memory
        
    def encode_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 = state
        u_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_k2
        
        return (v1, v2), (u_k1, u_k)
    
    def decode(self, received_bits):
        """Viterbi decoding with hard decision."""
        num_states = self.num_states
        # Trellis: metrics[step][state] = accumulated metric
        metrics = {state: 0 for state in range(num_states)}
        path_history = [{state: [] for state in range(num_states)}]
        
        # Process each received pair
        for step in range(len(received_bits) // 2):
            r_pair = received_bits[2*step:2*step+2]
            new_metrics = {state: float('inf') for state in range(num_states)}
            new_path_history = {state: [] for state in range(num_states)}
            
            for state in range(num_states):
                # Two possible transitions: input 0 or 1
                for input_bit in [0, 1]:
                    (v1, v2), next_state = self.encode_state(state, input_bit)
                    
                    # Calculate branch metric (Hamming distance)
                    expected_bits = [v1, v2]
                    branch_metric = sum(1 for e, r in zip(expected_bits, r_pair) if e != r)
                    
                    new_metric = metrics[state] + branch_metric
                    
                    if new_metric < new_metrics[next_state]:
                        new_metrics[next_state] = new_metric
                        new_path_history[next_state] = path_history[-1][state] + [input_bit]
            
            metrics = new_metrics
            path_history.append(new_path_history)
            
        # Traceback
        final_state = min(metrics.keys(), key=lambda s: metrics[s])
        decoded_bits = path_history[-1][final_state]
        
        return decoded_bits

# Test Viterbi
decoder = ViterbiDecoder(k=1, n=2, memory=2, generators=[7, 5])
original_bits = [1, 0, 1, 1, 0]

# Encode
encoded_bits = []
state = (0, 0)
for bit in original_bits:
    (v1, v2), state = decoder.encode_state(state, bit)
    encoded_bits.extend([v1, v2])

# Simulate channel with 1 error
received_bits = encoded_bits.copy()
received_bits[3] ^= 1  # Flip one bit

decoded_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:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[1], line 77
     74 received_bits = encoded_bits.copy()
     75 received_bits[3] ^= 1  # Flip one bit
---> 77 decoded_bits = decoder.decode(received_bits)
     78 print(f'Bits originais: {original_bits}')
     79 print(f'Bits codificados: {encoded_bits}')

Cell In[1], line 41, in ViterbiDecoder.decode(self, received_bits)
     38 for state in range(num_states):
     39     # Two possible transitions: input 0 or 1
     40     for input_bit in [0, 1]:
---> 41         (v1, v2), next_state = self.encode_state(state, input_bit)
     43         # Calculate branch metric (Hamming distance)
     44         expected_bits = [v1, v2]

Cell In[1], line 14, in ViterbiDecoder.encode_state(self, state, input_bit)
     12 """Encode a state and input bit to output bits."""
     13 # State is (u[k-1], u[k-2])
---> 14 u_k2, u_k1 = state
     15 u_k = input_bit
     17 # Generator 7 (111): v1 = u[k] ^ u[k-1] ^ u[k-2]

TypeError: 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 np
from scipy.special import erfc

def ber_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 - 1
    noise = sigma * np.random.randn(N_bits)
    received = symbols + noise
    
    decisions = (received > 0).astype(int)
    errors = np.sum(bits != decisions)
    return errors / N_bits

def ber_with_hamming74(EbN0_db, N_blocks=10000):
    """BER for BPSK with Hamming (7,4) FEC."""
    EbN0_lin = 10**(EbN0_db/10)
    # Energy per coded bit
    EbN0_coded = EbN0_lin * (4/7)  # Rate 4/7
    sigma = 1/np.sqrt(2*EbN0_coded)
    
    blocks_errors = 0
    for _ in range(N_blocks):
        # Generate 4 data bits
        data = np.random.randint(0, 2, 4)
        codeword = hamming74_encode(data)
        
        # BPSK modulation
        symbols = 2*codeword - 1
        noise = sigma * np.random.randn(7)
        received_analog = symbols + noise
        
        # Hard decision
        received_bits = (received_analog > 0).astype(int)
        
        # Decode
        decoded_data, pos = hamming74_decode(received_bits)
        
        # Check for block error
        if not np.array_equal(data, decoded_data):
            blocks_errors += 1
            
    return blocks_errors / N_blocks

# Simulate BER curves
EbN0_dbs = np.linspace(0, 10, 11)
ber_no_fec = [ber_without_fec(db, N_bits=50000) for db in EbN0_dbs]
ber_with_fec = [ber_with_hamming74(db, N_blocks=5000) for db in EbN0_dbs]

print("BER Comparison (BPSK vs BPSK+Hamming(7,4)):")
for db, b_no, b_fec in zip(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.

10.11 Gabarito

E1. $R_c=11/15\approx\boxed{0{,}733}$. Redundância: $\boxed{26{,}7\%}$.

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:

  1. Identifique a finalidade: detectar, corrigir sem retransmissão, ou solicitar retransmissão?
  2. Calcule o custo: determine $n$, $k$, $R_c=k/n$ e a taxa útil.
  3. Modele o erro: erros independentes, rajadas, apagamentos ou amostras suaves?
  4. 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.
  5. Cheque o limite físico: compare a taxa de informação com a capacidade usando unidades e largura de banda consistentes.
  6. Valide: injete padrões de erro controlados antes de medir BER em um canal aleatório.

Erros comuns a evitar:

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.