7. Modulação QAM — Transmissão Digital em Banda Base
7. Modulação QAM — Transmissão Digital em Banda Base
Comunicações Digitais — Apostila de Curso
Tópicos: Representação I/Q · Constelações QAM · Distância mínima · Energia normalizada · Probabilidade de erro · Detecção coerente · Erro de fase · Aplicações práticas
7.1 Antes de começar
Ao final, você deve normalizar constelações QAM, relacionar $d_{\min}$ a BER e ordem de modulação, implementar decisão I/Q e quantificar erro de fase. Diagnóstico: aumentar $M$ eleva a eficiência espectral, mas o que acontece com $d_{\min}$ quando $E_s$ é fixo? Evidência mínima: validar numericamente a energia média e a BER de 16-, 64- e 256-QAM.
7.2 Representação I/Q e a estrutura do sinal QAM
7.2.1 Modulação em quadratura: a ideia central
Em modulações como BPSK e QPSK, apenas a fase da portadora é modulada. A Modulação por Codificação de Amplitude Quadrática (QAM) vai além: modula simultaneamente a amplitude e a fase. O insight fundamental é que duas portadoras ortogonais (seno e cosseno) podem transportar informações independentes.
Considere uma portadora de frequência $f_c$. Construimos duas portadoras ortogonais:
que satisfazem $\displaystyle\int_0^{T_s} c_I(t)c_Q(t)\,dt = 0$ para qualquer intervalo inteiro de período $T_s$ da portadora. A ortogonalidade garante que as duas componentes são independentes no receptor — podemos transmitir dados separados em cada uma sem interferência mútua (desde que o receptor mantenha sincronismo de fase perfeito).
7.2.2 Dedução da representação I/Q
Sejam $I_k$ e $Q_k$ os símbolos nas componentes em fase e em quadratura, respectivamente, no $k$-ésimo intervalo de símbolo de duração $T_s$. O sinal QAM transmitido é:
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.
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]$ é:
Expandindo o quadrado:
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:
Para normalização, convém adotar portadoras com energia unitária por símbolo: definamos $g_I(t) = \sqrt{\frac{2}{T_s}}\cos(2\pi f_c t)$ e $g_Q(t) = -\sqrt{\frac{2}{T_s}}\sin(2\pi f_c t)$, então:
A partir deste ponto, assumiremos essa normalização: $E_s = |x_k|^2$.
7.2.4 Eficiência espectral
Cada símbolo QAM carrega $\log_2 M$ bits, onde $M$ é o tamanho da constelação. A taxa de símbolos é $R_s = 1/T_s$. A eficiência espectral (bit/s/Hz) é:
onde $B \approx R_s = 1/T_s$ é a largura de banda ocupada na aproximação de pulsos Nyquist com excesso de banda nulo. Com filtro cosseno levantado, a convenção usual fornece $B=(1+\alpha)R_s$ e, portanto, $\eta=\log_2M/(1+\alpha)$. Comparação: para a mesma taxa de símbolos e o mesmo excesso de banda, QPSK transporta 2 bit/símbolo, enquanto 16-QAM transporta 4 bit/símbolo e dobra a eficiência espectral; essa vantagem custa menor distância entre pontos para a mesma energia média e, assim, maior $E_b/N_0$ para uma BER fixada.
7.2.5 Mapeamento Gray
Em alta SNR, erros quase sempre cruzam a fronteira mais próxima no plano complexo. Para minimizar o número de bits errados por erro de símbolo, usa-se mapeamento Gray: pontos vizinhos diferem em exatamente um bit. Em QAM retangular com $L$ níveis por eixo, cada eixo usa mapeamento Gray independente: os $m = \log_2 L$ bits mais significativos determinam a região (metade superior/inferior, esquerda/direita), e os menos significativos refinam.
7.3 Constelações QAM — Geometria Completa
7.3.1 QAM quadrada: estrutura geral
A maioria das aplicações práticas usa QAM quadrada, onde $M = L^2$ e ambos os eixos I e Q usam o mesmo conjunto de níveis. O conjunto de níveis é:
com $L = \sqrt{M}$ níveis ímpares equidistantes, separados por $2d$. A distância mínima entre pontos adjacentes no mesmo eixo é $2d$.
7.3.2 Distância mínima entre pontos
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:
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
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$,
Os eixos I e Q têm a mesma energia. Portanto, o resultado exato é
Normalização a $E_s = 1$: Para normalizar a constelação de modo que a energia média seja unitária:
E a distância mínima é:
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
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()
7.4 Probabilidade de Erro — Dedução Completa
7.4.1 A função Q e a probabilidade de erro PAM
A função Q é definida como a cauda direita da distribuição normal padrão:
Relação com erfc: A função erro complementar é $\operatorname{erfc}(x) = \frac{2}{\sqrt{\pi}}\int_x^{\infty}e^{-t^2}dt$. Fazendo $t = u/\sqrt{2}$, obtém-se $\operatorname{erfc}(x) = 2Q(x\sqrt{2})$.
Para um canal AWGN com ruído $n\sim\mathcal N(0,\sigma^2)$, a probabilidade de cruzar a fronteira situada no ponto médio de dois vizinhos separados por distância $D$ é $Q(D/(2\sigma))$. Como aqui $D=2d$ e $\sigma^2=N_0/2$ por dimensão, o argumento é $d/\sigma$.
7.4.2 BER do PAM M-ary (resultados conhecidos)
Considere PAM com $M$ níveis equidistantes separados por $2d$. A probabilidade de erro de símbolo é:
O fator $\frac{M-1}{M}$ surge porque pontos internos têm dois vizinhos, mas são $\frac{M-2}{M}$ dos pontos; pontos de borda têm um vizinho e são $\frac{2}{M}$. O BER (bits errados) é aproximado por:
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$,
Da Seção “Energia média e normalização”, $d^2=3E_s/[2(M-1)]$. Com $E_s=(\log_2M)E_b$,
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$:
Forma alternativa com função Q (mais comum):
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$:
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 é:
Essa aproximação preserva a dependência essencial: aumentar $M$ reduz a distância normalizada entre vizinhos e exige maior $E_b/N_0$ para a mesma BER.
7.4.5 Comparativo QAM vs PSK
- 16-QAM vs 16-PSK: 16-QAM é superior por ~3–4 dB em BER a $10^{-6}$. A razão é que 16-QAM tem pontos com distâncias variadas (cantos mais distantes do centro) e melhor aproveitamento da energia para alta ordem.
- 64-QAM vs 64-PSK: vantagem ~5 dB a favor de QAM.
- 256-QAM vs 256-PSK: vantagem ~6–7 dB.
7.4.6 SER (Probabilidade de Erro de Símbolo)
A probabilidade de erro de símbolo (não de bit) é:
A aproximação usa $1-(1-p)^2 \approx 2p$ para $p$ pequeno (alta SNR). Note que $P_s \approx \log_2 M \cdot P_b$ por mapeamento Gray.
7.4.7 Exercício em Python: BER Monte Carlo de QAM
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()
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 é:
onde $n(t)$ é ruído branco gaussiano com densidade espectral $N_0/2$.
7.5.2 Dedução do correlador I/Q
Para recuperar $I_k$ e $Q_k$, projetamos $r(t)$ nas bases ortogonais $g_I(t)$ e $g_Q(t)$:
Dedução dos ruídos projetados: $n_I = \int n(t)g_I(t)dt$ e $n_Q = \int n(t)g_Q(t)dt$ são variáveis gaussianas independentes $\mathcal{N}(0, N_0/2)$ por ortogonalidade e linearidade.
Recebemos: $\mathbf{r} = \mathbf{x}_k + \mathbf{n}$, onde $\mathbf{r} = (r_I, r_Q)$, $\mathbf{x}_k = (I_k, Q_k)$, e $\mathbf{n} \sim \mathcal{N}(0, \frac{N_0}{2}\mathbf{I}_2)$.
7.5.3 Decisão ML — regra de decisão de máxima verossimilhança
O detector de máxima verossimilhança escolhe o símbolo $\hat{x}_k$ que maximiza a densidade de probabilidade condicional $p(\mathbf{r}|\mathbf{x}_k)$. Como o ruído é gaussiano:
Maximizar esta probabilidade é equivalente a minimizar a distância euclidiana:
Decisão separada por eixo: Para QAM retangular, a minimização se separa:
Ou seja: projetamos cada componente no conjunto de níveis e escolhemos o mais próximo. Isso é ótimo para QAM retangular, pois as regiões de Voronoi são retângulos alinhados com os eixos.
7.5.4 Regiões de decisão de Voronoi
Para cada ponto da constelação $\mathbf{x}_m$, a região de decisão de Voronoi $\mathcal{V}_m$ é o conjunto de pontos no plano $\mathbb{R}^2$ mais próximos de $\mathbf{x}_m$ do que de qualquer outro ponto da constelação:
Para QAM retangular:
- Pontos internos: região retangular $2d \times 2d$.
- Pontos de borda: região semi-aberta (metade da largura em uma direção).
- Pontos de canto: região quadrante (um quarto do retângulo).
A probabilidade de erro de símbolo é:
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:
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:
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
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()
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:
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:
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:
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):
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.
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()
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.
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()
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.
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()
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.
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()
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.