SuperNotes by yuri.rodrix

Notas de Yuri.Rodrix


Página tipo blog en el que voy a publicar mis notas de aprendizaje, en especial de temas como matemáticas, física y quizá algo de programación

Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales

Radio definido por software

En un SDR casi toda la radio es software: el equipo traslada la señal a 0 Hz y la convierte en números, y lo demás (filtrar, demodular, medir) lo hace un programa. Estas notas recorren los conceptos del curso con cuatro simuladores que puedes mover, uno por tema, y con los bloques de GNU Radio con los que se arma cada cadena.

Recepción y análisis espectral

De la antena a los números: I y Q

Una señal de radio es una portadora de frecuencia fcf_c a la que el transmisor le cambia la amplitud y la fase. El receptor no necesita guardar la portadora, porque toda la información está en esos dos cambios. Por eso el SDR la traslada a 0 Hz y entrega dos números por muestra.

s(t)=A(t)cos⁡(2πfct+φ(t))=ℜ{x(t) ej2πfct}s(t)=A(t)\cos\bigl(2\pi f_c t+\varphi(t)\bigr)=\Re\bigl\{x(t)\,e^{j2\pi f_c t}\bigr\}x(t)=I(t)+jQ(t)=A(t) ejφ(t)x(t)=I(t)+jQ(t)=A(t)\,e^{j\varphi(t)}

El mezclador en cuadratura obtiene cada componente multiplicando y filtrando el doble de frecuencia:

I(t)=LPF{s(t) 2cos⁡2πfct}=Acos⁡φQ(t)=LPF{−s(t) 2sin⁡2πfct}=Asin⁡φI(t)=\mathrm{LPF}\{s(t)\,2\cos 2\pi f_c t\}=A\cos\varphi\qquad Q(t)=\mathrm{LPF}\{-s(t)\,2\sin 2\pi f_c t\}=A\sin\varphi

Notación:

  • s(t)s(t): señal real que llega por la antena, es decir, la señal de RF.
  • fcf_c: frecuencia central, la del oscilador local. En los flowgraphs es center_freq o rf_freq.
  • x(t)x(t): señal en banda base compleja, lo que entrega el USRP.
  • I(t)I(t): componente en fase, la parte real de la muestra.
  • Q(t)Q(t): componente en cuadratura, la parte imaginaria.
  • A(t)=∣x(t)∣A(t)=\lvert x(t)\rvert: envolvente instantánea.
  • φ(t)=arg⁡x(t)\varphi(t)=\arg x(t): fase instantánea.

Un tono de RF en ff aparece en banda base como un fasor que gira a la diferencia con el oscilador local:

fbb=f−fcx[n]=A e j(2πfbbn/fs+φ0)f_{bb}=f-f_c\qquad x[n]=A\,e^{\,j(2\pi f_{bb}n/f_s+\varphi_0)}

Simulador: la señal I/Q y su espectro

La misma señal, vista a la vez como hélice en el espacio (t,I,Q)(t,I,Q), como muestras en el tiempo y como espectro. Arrastra el fasor para cambiar amplitud y fase, y el pico del espectro para cambiar frecuencia y nivel. El catálogo deja el simulador listo para cada concepto de las secciones siguientes.

x=t,  y=I,  z=Qx=t,\ \ y=\textcolor{#3b82f6}{I},\ \ z=\textcolor{#f97316}{Q}

x(0)=0.500 ej 0.00\textcolor{#f59e0b}{x(0)}=0.500\,e^{j\,0.00}

giro antihorario

Arrastra la bola ámbar: radio = amplitud, ángulo = fase.

Tiempo: I y Q por muestra

x[n]=I[n]+j Q[n]=0.500 ej(2π(0.100)n+0.00)+w[n]x[n]=\textcolor{#3b82f6}{I[n]}+j\,\textcolor{#f97316}{Q[n]}=0.500\,e^{j(2\pi(0.100)n+0.00)}+w[n]
Ts=1fs=0.500 μsT_s=\frac{1}{f_s}=0.500\ \mu\text{s}recortadas: 0.0 %\text{recortadas: }\textcolor{#64748b}{0.0\,\%}

Espectro

Δf=fsN=1.95 kHz\Delta f=\frac{f_s}{N}=1.95\ \text{kHz}f1=200.0 kHz\textcolor{#f59e0b}{f_1}=200.0\ \text{kHz}nivel=20log⁡10A=−6.0 dBFS\text{nivel}=20\log_{10}A=-6.0\ \text{dBFS}∣f1∣≤fs2=1.000 MHz (sin aliasing)|f_1|\le\frac{f_s}{2}=1.000\ \text{MHz}\ \text{(sin aliasing)}piso=−68.3 dB/bin\textcolor{#64748b}{\text{piso}}=-68.3\ \text{dB/bin}

Frecuencias negativas

Con II y QQ a la vez, el signo de la frecuencia es real y medible: dice si el tono está por encima o por debajo de fcf_c. Si fbb>0f_{bb}>0 el fasor gira en sentido antihorario, y si fbb<0f_{bb}<0, en sentido horario. Con una sola componente esa información se pierde, porque un coseno contiene las dos frecuencias:

cos⁡(2πft)=12(ej2πft+e−j2πft)\cos(2\pi f t)=\tfrac12\bigl(e^{j2\pi ft}+e^{-j2\pi ft}\bigr)

Por eso el espectro de una señal real es simétrico y el de una señal compleja no tiene por qué serlo: los dos lados de fcf_c pueden traer emisoras distintas.

Pruébalo en el simulador, caso Frecuencia negativa: mira hacia dónde gira la hélice y compáralo con el lado del pico.

Muestreo complejo y aliasing

Cada muestra compleja aporta dos números, así que con fsf_s muestras complejas por segundo (samp_rate) se observa un ancho de fsf_s completo, no de fs/2f_s/2. El muestreo en general, con sus réplicas de espectro y su reconstrucción, está deducido en el post de Señales.

−fs2≤fbb<fs2-\frac{f_s}{2}\le f_{bb}<\frac{f_s}{2}

Dos tonos separados por un múltiplo de fsf_s producen exactamente las mismas muestras:

e j2π(f+mfs)n/fs=e j2πfn/fs⇒fa=((f+fs2) mod fs)−fs2e^{\,j2\pi(f+mf_s)n/f_s}=e^{\,j2\pi fn/f_s}\quad\Rightarrow\quad f_a=\bigl((f+\tfrac{f_s}{2})\bmod f_s\bigr)-\tfrac{f_s}{2}

Notación:

  • fsf_s: tasa de muestreo compleja, en muestras por segundo.
  • nn: índice de la muestra.
  • mm: número entero cualquiera.
  • faf_a: frecuencia a la que se ve el tono dentro de la ventana.

Subir samp_rate ensancha lo que se ve y multiplica los datos: en complex float32 son 8 bytes por muestra, es decir 16 MB/s a 2 MS/s. No mejora por sí solo la calidad de un canal.

Pruébalo en el simulador, caso Aliasing: lleva el pico más allá del borde de la ventana y observa dónde reaparece.

FFT: resolución y ventanas

X[k]=∑n=0N−1w[n] x[n] e−j2πkn/NΔf=fsNT=NfsX[k]=\sum_{n=0}^{N-1}w[n]\,x[n]\,e^{-j2\pi kn/N}\qquad \Delta f=\frac{f_s}{N}\qquad T=\frac{N}{f_s}

Notación:

  • NN: tamaño de la FFT, las muestras de cada bloque.
  • kk: índice del bin; tras fftshift corresponde a fk=fc+kΔff_k=f_c+k\Delta f.
  • w[n]w[n]: ventana aplicada al bloque.
  • Δf\Delta f: separación entre bins.
  • TT: tiempo que hay que observar para llenar un bloque.

Δf⋅T=1\Delta f\cdot T=1: más detalle en frecuencia exige observar más tiempo. Además, el cómputo crece como O(Nlog⁡2N)O(N\log_2 N).

Un bloque finito equivale a multiplicar la señal por una ventana, así que un tono que no cae justo en un bin reparte energía en los demás: es la fuga espectral. Una ventana suave baja esos lóbulos laterales a cambio de ensanchar el principal, y por eso dos tonos cercanos pueden dejar de separarse aunque Δf\Delta f sea pequeño.

VentanaLóbulo principal (nulo a nulo)Primer lóbulo lateralENBW (bins)
Rectangular2Δf−13 dB1
Hann4Δf−31 dB1,5
Hamming4Δf−43 dB1,36
Blackman6Δf−58 dB1,73

Valores estándar de la literatura (Harris, 1978).

Pruébalo en el simulador, caso Dos tonos cercanos: cambia N de 512 a 2048 y mira cuándo aparecen dos picos.

dBFS y piso de ruido

El SDR entrega números, no voltios calibrados. En complex float32 la plena escala es ±1\pm1 en cada componente, y un tono de amplitud 1 corresponde a 0 dBFS con la normalización siguiente. Sin calibrar la ganancia de la cadena, estos dB no son dBm.

Lk=20log⁡10∣X[k]∣∑nw[n][dBFS]L_k=20\log_{10}\frac{\lvert X[k]\rvert}{\sum_n w[n]}\quad[\text{dBFS}]

Si el ruido blanco tiene potencia total σ2\sigma^2, esa potencia se reparte en los NN bins. Un tono, en cambio, se concentra en uno solo. Con esta normalización:

E ⁣[∣Xruido[k]∣2(∑w)2]=σ2 ∑w2(∑w)2=σ2 ENBWN\mathrm{E}\!\left[\frac{\lvert X_\text{ruido}[k]\rvert^2}{(\sum w)^2}\right]=\sigma^2\,\frac{\sum w^2}{(\sum w)^2}=\frac{\sigma^2\,\mathrm{ENBW}}{N}piso=10log⁡10σ2+10log⁡10ENBW−10log⁡10N[dBFS/bin]\text{piso}=10\log_{10}\sigma^2+10\log_{10}\mathrm{ENBW}-10\log_{10}N\quad[\text{dBFS/bin}]

Duplicar N baja el piso 3 dB, porque 10log⁡102=3,0110\log_{10}2=3{,}01, y el pico del tono no se mueve. El ruido real no bajó: su densidad N0=σ2/fsN_0=\sigma^2/f_s es la misma. Lo que cambia es que cada bin es más angosto y deja entrar menos ruido. Por eso el pico sobre el piso mejora 10log⁡10N10\log_{10}N, la ganancia de procesamiento. Promediar espectros, en cambio, no baja el piso: solo lo alisa.

Notación:

  • ENBW=N∑w2/(∑w)2\mathrm{ENBW}=N\sum w^2/(\sum w)^2: ancho equivalente de ruido de la ventana, en bins.
  • N0N_0: densidad espectral de ruido, en dBFS/Hz.

Ese piso digital viene de fuentes físicas:

N=kTB ⇒ −174 dBm/Hz a 290 KSQNRmax⁡≈6,02 b+1,76 dBN=kTB\ \Rightarrow\ -174\ \text{dBm/Hz a }290\text{ K}\qquad \mathrm{SQNR}_{\max}\approx 6{,}02\,b+1{,}76\ \text{dB}
  • kk: constante de Boltzmann; TT: temperatura; BB: ancho de banda.
  • Figura de ruido (NF): lo que suman amplificadores y mezcladores.
  • bb: bits del ADC: unos 50 dB con 8 bits (RTL-SDR) y unos 74 dB con 12 bits (según la hoja de datos del USRP).

Sin ruido no hay piso que baje. Con un Signal Source ideal, sin ruido sumado, lo que aparece bajo el tono no es ruido sino fuga de la ventana y error numérico de la FFT. Ese «piso» puede caer decenas de dB al cambiar N, mucho más que los 3 dB por duplicación de la regla, porque depende de cuánto se aleja el tono del centro de un bin y de la ventana. Para ver la regla hace falta ruido: súmalo con un Noise Source o usa una captura real.

Pruébalo en el simulador, caso Piso de ruido: sube N y compara cuánto baja la línea del piso.

Ganancia y saturación del ADC

La ganancia RF amplifica antes del ADC: sube la señal y el ruido que entra con ella, y aleja a la señal del ruido de cuantización. El objetivo es usar bien el rango del ADC sin llegar a plena escala.

Al pasarse, las muestras se recortan en ±1\pm1. Las señales de saturación son muestras pegadas a plena escala, picos nuevos que crecen más rápido que la señal y un piso que sube. Una señal potente pero sana, en cambio, conserva su forma y sube dB a dB con la ganancia.

Al recortar I y Q por separado, un tono en ff genera productos en −3f, +5f, −7f-3f,\ +5f,\ -7f…: el tercer armónico aparece del lado opuesto.

El caso opuesto es igual de común: sin emisoras fuertes en la banda, I y Q quedan muy lejos de ±1\pm1 y la señal ocupa unos pocos niveles del ADC. Eso no es un error, pero indica margen para subir la ganancia antes de que el ruido de cuantización pese.

Pruébalo en el simulador, caso Saturación: mira las crestas planas en el tiempo y las espurias en el espectro. Luego baja la ganancia hasta que desaparezcan.

Waterfall: el espectro en el tiempo

El waterfall apila espectros sucesivos: una fila por bloque, frecuencia en horizontal, tiempo en vertical y color según el nivel. Una portadora fija es una línea vertical, una emisora FM es una franja ancha y el ruido es un moteado. Cada fila cubre T=N/fsT=N/f_s, así que el compromiso entre detalle en frecuencia y detalle en tiempo también se ve aquí.

Las tres vistas de GNU Radio

En un flowgraph de recepción, USRP Source alimenta tres visores: Time Sink (I y Q en el tiempo),Frequency Sink (el espectro de cada bloque de N muestras) y Waterfall Sink (la historia de ese espectro). Son las mismas tres vistas del simulador.

Ventana de GNU Radio con un USRP: I y Q en el tiempo, espectro y waterfall
Ejemplo de las tres vistas en GNU Radio con un USRP como fuente.

El pico de DC. Muchos receptores de conversión directa, como los USRP y el RTL-SDR, muestran una raya fija justo en fcf_c, es decir en 0 Hz de banda base. No es una emisora: viene de la fuga del oscilador local hacia la entrada y de pequeños desniveles de continua en I y Q. Se reconoce porque sigue a fcf_c al cambiar center_freq. Para que no caiga sobre la señal de interés se sintoniza el equipo un poco al lado y se corrige el desplazamiento en software, con un offset de sintonía.

Las piezas del equipo

Tres capas colaboran: el hardware muestrea, el driver UHD lo programa y transfiere las muestras, y GNU Radio las procesa.

  • Throttle: una fuente de software como Signal Source generaría muestras tan rápido como pueda la CPU, así que necesita este bloque para limitar la tasa. USRP Source no lo requiere: el reloj del equipo ya marca el ritmo.
  • Overflow (la «O» en consola): el PC no alcanzó a recibir las muestras a tiempo y se perdieron.
  • File Sink en fc32: graba I/Q con 8 bytes por muestra.
EquipoInterfazRX / TXRango RFAncho de bandaADC
USRP B210 / NI 2901USB 3.02 / 270 MHz – 6 GHzhasta 56 MHz12 bits
RTL-SDRUSB 2.01 / 0~24 MHz – 1,7 GHzhasta 2,4 MHz8 bits

Especificaciones típicas de hoja de datos. Para saber qué equipo está conectado, con qué interfaz y qué rango admite, uhd_usrp_probe lo informa; un USRP conectado por USB 2 en vez de USB 3 limita la tasa de muestreo sostenible.

Receptor: AM, FM y QPSK

Con la misma banda de 2 MHz se pueden demodular señales muy distintas. Un receptor SDR no es una fuente conectada a un demodulador, sino una cadena de sintonía, filtrado, cambio de tasa, demodulación y medida, con parámetros que dependen unos de otros. Aquí esa cadena es una sola, con un selector mode que elige la rama, como se arma un receptor multifunción en GNU Radio.

Simulador: un receptor con tres modos

La tira superior es el flowgraph: en QPSK, sus bloques con borde se encienden y apagan al pulsarlos. En AM y FM, arrastra el centro y los bordes del filtro sobre el espectro. La escena muestra el canal en (t,I,Q)(t,I,Q), igual que el simulador de la señal I/Q, para comparar dónde viaja el mensaje en cada modulación. Las emisoras son sintéticas, con niveles y CNR típicos de una banda FM: el mensaje es un tono o un «programa» hecho de tonos.

mode
  1. USRP2 MS/s
  2. Freq Xlating FIR92 kHz, ÷5
  3. chan_rate400 kS/s
  4. Quadrature DemodG = 0.8488
  5. LPF12 kHz
  6. Resampler3/25
  7. audio48 kS/s

x=t,  y=I,  z=Qx=t,\ \ y=\textcolor{#3b82f6}{I},\ \ z=\textcolor{#f97316}{Q}

∣x(t)∣=cte,  fi(t)=Δf m(t)\textcolor{#f59e0b}{|x(t)|}=\text{cte},\ \ f_i(t)=\Delta f\,m(t)

el radio no cambia, la velocidad de giro sí

Curva: la emisora sin ruido. Puntos: lo que deja pasar el filtro, con ruido.

Resumen numérico

Canal100.092 MHz
Emisora en el filtroFM 1
CNR en el canal9.5 dB
Ancho 99 %197.8 kHz
Ancho a −3 dB29.79 kHz
G del discriminador0.8488
Carson180.0 kHz
SNR de audio33.2 dB
Frecuencia media en el canal4.4 kHz
Variación de |x|22.4 %
Audio recortado0.0 %
Pico de DCapagado
Datos por USB16 MB/s

Colores

  • I
  • Q
  • x(t), espectro, |x|, y[n]
  • Muestras del canal
  • Filtro, tubo y μ
  • Bordes y referencia
  • Umbral y recorte
  • Piso de ruido

Espectro de la banda capturada

fcanal=rf_freq+tune_offset=100.092 MHz\textcolor{#f59e0b}{f_{\text{canal}}}=\texttt{rf\_freq}+\texttt{tune\_offset}=100.092\ \text{MHz}cutoff=bw/2=100.0 kHz\textcolor{#10b981}{\text{cutoff}}=\texttt{bw}/2=100.0\ \text{kHz}transition=bw/10=20.00 kHz\text{transition}=\texttt{bw}/10=20.00\ \text{kHz}taps≈53fs/(22 transition)=241\text{taps}\approx 53f_s/(22\,\text{transition})=241chan_rate=fs/D=2 M/5=400 kS/s\texttt{chan\_rate}=f_s/D=2\ \text{M}/5=400\ \text{kS/s}

Discriminador FM

y[n]=G arg⁡(x[n] x∗[n−1])\textcolor{#8b5cf6}{y[n]}=G\,\arg\bigl(x[n]\,x^*[n-1]\bigr)G=chan_rate2π fm_dev=0.8488G=\frac{\texttt{chan\_rate}}{2\pi\,\texttt{fm\_dev}}=0.8488B≈2(Δf+fm)=180.0 kHz\textcolor{#10b981}{B}\approx 2(\Delta f+f_m)=180.0\ \text{kHz}CNR=9.6 dB\text{CNR}=9.6\ \text{dB}SNR audio=33.2 dB\text{SNR audio}=33.2\ \text{dB}
Simulando la curva…

Elegir el canal: frecuencia central y filtro

rf_freq programa el oscilador del equipo y decide qué 2 MHz se digitalizan. Dentro de esa banda, el bloque Freq Xlating FIR hace tres cosas: traslada el canal a 0 Hz, filtra y decima. Filtrar antes de decimar es obligatorio, porque lo que quede fuera de la nueva ventana se plegaría dentro.

y[k]=∑ih[i]  x[kD−i]  e−j2π tune_offset (kD−i)/fsy[k]=\sum_{i}h[i]\;x[kD-i]\;e^{-j2\pi\,\texttt{tune\_offset}\,(kD-i)/f_s}chan_rate=fsD \texttt{chan\_rate}=\frac{f_s}{D}
cutoff=channel_bw2\text{cutoff}=\frac{\texttt{channel\_bw}}{2}transition=channel_bw10 \text{transition}=\frac{\texttt{channel\_bw}}{10}taps≈53 fs22 transition \text{taps}\approx\frac{53\,f_s}{22\,\text{transition}}

Notación:

  • tune_offset: posición del canal respecto a rf_freq. El canal queda en rf_freq+tune_offset\texttt{rf\_freq}+\texttt{tune\_offset}.
  • channel_bw: ancho del filtro. Decide cuánto ruido y cuántos vecinos entran al demodulador.
  • h[i]h[i]: los taps del FIR, diseñado con ventana de Hamming. Menos transición exige más taps: 241 con 200 kHz y 4015 con 12 kHz a 2 MS/s.
  • DD: factor de decimación. A fs=2f_s=2 MS/s, D=5D=5 y chan_rate = 400 kS/s.

Por qué no sintonizar en el centro: los receptores de conversión directa suelen dejar un pico justo en fcf_c, el pico de DC. Con tune_offset distinto de cero, ese pico queda fuera del canal. En el simulador es un interruptor con un nivel ilustrativo: en un equipo concreto puede ser fuerte o quedar bajo el piso.

Subir samp_rate no mejora el canal: pasa a 4 MS/s y mira la CNR: no cambia, porque el ruido que entra al demodulador lo fija channel_bw. Lo que sí se duplica es el flujo por USB, de 16 a 32 MB/s.

Frequency Sink de GNU Radio con 2 MHz de la banda FM: dos emisoras anchas y algunas líneas angostas
Así se ve una banda FM real en el Frequency Sink de GNU Radio: dos emisoras anchas, el ruido de fondo y algunas líneas angostas que agrega el propio receptor.

Pruébalo en el simulador, caso FM cerca del umbral: activa el pico de DC, lleva el centro del filtro a 0 Hz y luego aleja rf_freq: se mueve todo menos el canal elegido.

AM: el mensaje está en el radio

sAM(t)=Ac[1+μ m(t)]cos⁡(2πfct)s_{AM}(t)=A_c\bigl[1+\mu\,m(t)\bigr]\cos(2\pi f_c t)⇒\Rightarrow∣x[n]∣=Ac ∣1+μ m[n]∣ \lvert x[n]\rvert=A_c\,\bigl\lvert 1+\mu\,m[n]\bigr\rvert
banda lateralportadora=20log⁡10μ2[dBc]\frac{\text{banda lateral}}{\text{portadora}}=20\log_{10}\frac{\mu}{2}\quad[\text{dBc}]BAM=2fm B_{AM}=2f_m

Notación:

  • AcA_c: amplitud de la portadora.
  • μ\mu: índice de modulación; m(t)m(t) es el mensaje, con pico 1.
  • Complex to Mag: calcula ∣x∣\lvert x\rvert. Es el detector de envolvente.
  • DC Blocker: quita el valor medio AcA_c, que no es mensaje.
  • am_gain: una portadora débil da una envolvente muy pequeña, por ejemplo 10−310^{-3}, así que hay que amplificarla unos 60 dB. Como la salida AM depende del nivel recibido, un receptor comercial lo resuelve con un AGC lento.

El orden importa: el DC Blocker va después del detector. En banda base, la portadora AM es justamente una componente en 0 Hz, y bloquearla antes destruiría la envolvente.

Limitador: forzar ∣x∣=1\lvert x\rvert=1 borra por completo el mensaje en AM. Enciéndelo y el audio desaparece.

Sobremodulación: con μ>1\mu>1, el valor 1+μm1+\mu m cruza por cero. El detector solo ve su valor absoluto y la onda se pliega: la línea punteada del panel es lo que debió salir.

Filtro y CNR: la CNR se mide dentro del filtro de canal. Pasar de 200 a 12 kHz deja fuera unos 12 dB de ruido, pero el audio mejora mucho menos, porque el LPF de audio ya quitaba casi todo ese ruido. Una CNR alta no garantiza por sí sola un buen audio.

Pruébalo en el simulador, caso AM con μ = 0,5: arrastra el punto ámbar en el panel de tiempo y compara el valor de μ\mu con las bandas laterales en el panel Canal.

FM: el mensaje está en la velocidad de giro

La definición de FM y su notación están en el post de Señales. Con muestras complejas, demodular es muy simple: la diferencia de fase entre dos muestras seguidas es proporcional a la frecuencia instantánea.

fi(t)=fc+Δf m(t)f_i(t)=f_c+\Delta f\,m(t)y[n]=G arg⁡(x[n] x∗[n−1]) y[n]=G\,\arg\bigl(x[n]\,x^*[n-1]\bigr)G=chan_rate2π fm_dev G=\frac{\texttt{chan\_rate}}{2\pi\,\texttt{fm\_dev}}
BFM≈2 (Δf+fm)B_{FM}\approx 2\,(\Delta f+f_m)

Notación:

  • Δf\Delta f: desviación con la que transmite la emisora; 75 kHz en radiodifusión.
  • fm_dev: la desviación que el receptor cree que hay. Solo escala la salida.
  • GG: factor de Quadrature Demod, calculado con la tasa a su entrada: 400 000/(2π⋅75 000)=0,8488400\,000/(2\pi\cdot 75\,000)=0{,}8488.
  • fmf_m: frecuencia máxima del mensaje. La regla de Carson da 180 kHz con 15 kHz de audio mono, y 256 kHz con los 53 kHz del MPX estéreo completo.

El umbral de FM

La CNR es la potencia de la portadora sobre la del ruido dentro del canal. Mientras sea alta, el ruido apenas mueve la fase y el audio mejora dB a dB, según esta fórmula:

SNRaudio≈3 Pm Δf2W3⋅CN0\mathrm{SNR}_{\text{audio}}\approx\frac{3\,P_m\,\Delta f^2}{W^3}\cdot\frac{C}{N_0}
  • PmP_m: potencia del mensaje, con pico 1; 0,5 para un tono.
  • WW: ancho del audio, 12 kHz; C/N0C/N_0: potencia de portadora sobre densidad de ruido.

Por debajo de cierta CNR, el ruido llega a dar vueltas completas alrededor del origen. Cada vuelta suma 2π2\pi a la fase y sale como un clic. El audio cae entonces mucho más rápido que la fórmula: es la rodilla. La curva del panel Umbral no es un dibujo: se simula con esta misma cadena, y la rodilla cae entre 9 y 11 dB, cerca de los 10 dB que da la literatura. Una emisora con 6 dB de CNR se oye con clics; con 20 dB, limpia.

El limitador en este discriminador no cambia el audio: arg⁡(x x∗)\arg(x\,x^*) ya ignora la amplitud. Enciéndelo y la SNR queda idéntica; lo único que cambia es ∣x∣\lvert x\rvert. Sigue siendo útil en discriminadores que sí dependen de la amplitud, y por eso aparece en los diagramas clásicos.

fm_dev mal puesto: si no coincide con la desviación real, el audio sale escalado por el mismo factor. Con 5 kHz sobre una emisora de 75 kHz, GG se multiplica por 15 (+23,5 dB) y el audio supera ±1, así que el Audio Sink lo recorta.

Filtro angosto: si channel_bw es menor que Carson, la señal se sale del filtro cada vez que su frecuencia instantánea llega lejos. Sobra CNR y aun así el audio se rompe.

La salida no depende del nivel: sube rf_gain 10 dB. El audio AM sube 10 dB, mientras que el FM no se mueve.

Cómo se mide el ancho: el ancho al 99 % contiene casi toda la potencia y sirve en cualquier señal. El ancho a −3 dB se mide desde el máximo: en AM queda limitado por la resolución, porque la portadora es una línea, y en FM no representa mucho, porque el espectro no tiene un pico dominante.

La salida del discriminador no es solo audio. Es el MPX: audio mono hasta 15 kHz, piloto a 19 kHz, estéreo L−R alrededor de 38 kHz y RDS a 57 kHz. El LPF de 12 kHz se queda con el mono. La radio comercial también preenfatiza los agudos al transmitir, así que un receptor para escucha necesita de-énfasis. El simulador no lo aplica, para comparar el audio directamente con el mensaje.

Espectro de la salida del discriminador de una emisora FM estéreo: audio mono, piloto de 19 kHz, subcanal L−R alrededor de 38 kHz y zona de RDS
Salida del discriminador de una emisora FM estéreo: el audio mono hasta 15 kHz, el piloto de 19 kHz y el subcanal L−R alrededor de 38 kHz.
H(f)=11+j2πfτH(f)=\frac{1}{1+j2\pi f\tau}τ=75 μs ⇒ 12πτ≈2,1 kHz \tau=75\ \mu\text{s}\ \Rightarrow\ \frac{1}{2\pi\tau}\approx 2{,}1\ \text{kHz}

Para terminar, un Rational Resampler lleva el audio a la tasa de la tarjeta de sonido. La razón es la fracción reducida de las dos tasas:

2 MS/s → ÷5  400 kS/s → ×3/25  48 kS/s2\ \text{MS/s}\ \xrightarrow{\ \div 5\ }\ 400\ \text{kS/s}\ \xrightarrow{\ \times 3/25\ }\ 48\ \text{kS/s}

Pruébalo en el simulador, caso FM bajo el umbral: abre Audio para ver los clics y Umbral para arrastrar la CNR por la curva.

QPSK: pulsos, ojo y constelación

sk=e j(π/4+kπ/2)k∈{0,1,2,3}s_k=e^{\,j(\pi/4+k\pi/2)}\quad k\in\{0,1,2,3\}qpsk_rate=symbol_rate⋅sps \texttt{qpsk\_rate}=\texttt{symbol\_rate}\cdot\texttt{sps}B=Rs(1+α) B=R_s(1+\alpha)

Notación:

  • sks_k: cada símbolo lleva 2 bits en una de cuatro fases.
  • symbol_rate (Rs)(R_s), sps y qpsk_rate: símbolos por segundo, muestras por símbolo y su producto. No son independientes.
  • α\alpha: roll-off del filtro RRC. Más α\alpha ocupa más ancho y da pulsos con colas más cortas.
  • rrc_ntaps = 11⋅sps11\cdot\texttt{sps}: longitud del filtro, 11 símbolos.

Cambiar de fase de golpe ocuparía mucho espectro, así que cada símbolo se conforma con un pulso. El mismo RRC está en TX y en RX: el de RX es el filtro adaptado, que maximiza la SNR. Los dos juntos forman un coseno alzado, que vale cero en los instantes de los demás símbolos. Si se muestrea ahí, no hay interferencia entre símbolos (ISI). El diagrama de ojo superpone esos pulsos: la abertura en el centro es el margen de decisión, y su ancho es la tolerancia a errores de reloj.

El bloque Channel Model agrega las perturbaciones. Su noise_voltage es la desviación total del ruido complejo, y después del filtro adaptado da:

EsN0=spsnv2⇒EsN0∣dB≈6−20log⁡10nv(sps=4)\frac{E_s}{N_0}=\frac{\texttt{sps}}{\texttt{nv}^2}\quad\Rightarrow\quad \frac{E_s}{N_0}\Big|_{\text{dB}}\approx 6-20\log_{10}\texttt{nv}\quad(\texttt{sps}=4)

Recuperar el reloj y la portadora

  • Symbol Sync busca cuándo decidir. Con el detector de Gardner, la muestra a mitad de símbolo debe ser cero en cada transición; si no, el lazo ajusta el periodo. No depende de la fase de la portadora:ek=ℜ{xk−1/2∗ (xk−1−xk)}e_k=\Re\bigl\{x^*_{k-1/2}\,(x_{k-1}-x_k)\bigr\}
  • Costas Loop corrige fase y frecuencia, después del reloj. De orden 4 en QPSK:
    ek=sgn⁡(Ik) Qk−sgn⁡(Qk) Ike_k=\operatorname{sgn}(I_k)\,Q_k-\operatorname{sgn}(Q_k)\,I_kf^=ω^ Rs2π \hat f=\hat\omega\,\frac{R_s}{2\pi}
  • Slicer (Constellation Decoder): elige el punto más cercano.

Lo que Costas no corrige: el ruido, el error de temporización y la ISI. Tampoco distingue una rotación de 90°, porque la constelación rotada es idéntica. Esa ambigüedad se resuelve con codificación diferencial o con una trama conocida.

Enganche: el lazo solo adquiere dentro de un rango que crece con costas_bw. En el simulador, a 100 kbaud, el límite está entre 6 y 7 kHz con 0,0628, y cerca de 10 kHz con 0,15. Fuera de ese rango puede quedar en un falso enganche, con una frecuencia estimada que no es la real.

Ancho de los lazos: un lazo ancho sigue rápido los cambios, pero su propio error se suma al ruido. Sin ruido en el canal, con sync_bw = 0,045 el EVM ya no es cero (cerca de 1 %), y con 0,005 baja a la mitad. Un lazo estrecho es más limpio, pero tarda más en enganchar.

Coordinar sps: de él dependen ambos RRC, Symbol Sync y la normalización de freq_offset. Cambiarlo solo en una parte produce ISI o pérdida de sincronismo, sin ruido ni offset.

Tres firmas en la constelación

EVM=rms⁡(r−s)rms⁡(s)\mathrm{EVM}=\frac{\operatorname{rms}(r-s)}{\operatorname{rms}(s)}

El EVM resume en un número la distancia de cada símbolo recibido rr a su punto ideal ss. Pero la forma de la nube dice más que ese número, porque cada causa deja una firma propia:

Las tres firmas vistas en el Constellation Sink de GNU Radio:

Constelación QPSK con cuatro nubes circulares por ruido
Ruido: nubes circulares.
Constelación QPSK convertida en un anillo por un error de frecuencia de 500 Hz
Error de frecuencia antes de Costas: anillo.
Constelación QPSK muy dispersa por un error de temporización
Temporización con sps mal configurado: dispersión general aunque Costas esté activo.

Pruébalo en el simulador, caso Firma: temporización (sin Symbol Sync): enciende y apaga Costas y Symbol Sync en la tira de arriba: cada bloque arregla solo lo suyo.

Un receptor, tres modulaciones

AspectoAMFMQPSK
InformaciónEnvolventeFrecuencia instantáneaFase, 2 bits por símbolo
En I/QMagnitud variable, fase fijaMagnitud constante, fase rotando4 puntos a 90°
Ancho de banda2fm2f_m (2 kHz con un tono de 1 kHz)2(Δf+fm)2(\Delta f+f_m) (180 kHz con audio de 15 kHz)Rs(1+α)R_s(1+\alpha) (135 kHz con 100 kbaud y α = 0,35)
RobustezBaja: el ruido entra al audioAlta sobre el umbral de CNRAlta; depende de Eb/N0E_b/N_0 y del sincronismo
ReceptorSimple: |x| + DC BlockerMedio: discriminadorComplejo: RRC, reloj, portadora, decisión
Dónde se usaOnda media, radio aeronáutica VHFRadiodifusión de 88 a 108 MHzSatélite (DVB-S), modos robustos de LTE y Wi-Fi

Un receptor reconfigurable comparte la adquisición, los controles y la visualización, y cambia de modo sin reiniciar. A cambio, las tasas de todas las ramas deben ser compatibles, y las ramas inactivas no actualizan sus gráficos. Además, no convierte en demodulable una señal mala: sobre una FM, la cadena AM entrega casi nada, y solo el modo correcto recupera el mensaje.

Desempeño: BER frente a Eb/N0

La forma clásica de medir un enlace digital es contar cuántos bits llegan mal según cuánta energía tiene cada bit frente al ruido, y comparar esa curva con la teoría. La distancia entre las dos es lo que cuesta, en dB, cada imperfección del receptor.

Qué mide la BER

La SNR compara potencias dentro de un ancho de banda, y por eso depende del receptor. Eb/N0E_b/N_0 normaliza por la tasa de bit y permite comparar esquemas con tasas distintas. Para BPSK en ruido blanco con filtro adaptado, la probabilidad de error de bit es el área de la cola de una gaussiana:

EbN0=SNR⋅BRb\frac{E_b}{N_0}=\mathrm{SNR}\cdot\frac{B}{R_b}Pb=Q ⁣(2EbN0)=12 erfc ⁣(EbN0)P_b=Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right)=\tfrac12\,\mathrm{erfc}\!\left(\sqrt{\frac{E_b}{N_0}}\right)Q(x)=12π∫x∞e−u2/2 duQ(x)=\frac{1}{\sqrt{2\pi}}\int_x^\infty e^{-u^2/2}\,du

Notación:

  • PbP_b: probabilidad de error de bit. La BER es su estimación por conteo.
  • EbE_b: energía por bit de información.
  • N0N_0: densidad espectral de ruido. Cada rama recibe una varianza de N0/2N_0/2.
  • BB: ancho de banda en que se mide la SNR. RbR_b: tasa de bit.
  • Q(x)Q(x): área de la cola derecha de una gaussiana normal. erfc\mathrm{erfc}: función de error complementaria.
  • AWGN: ruido aditivo, blanco y gaussiano; el modelo de canal de esta curva.
  • BPSK: un bit por símbolo, por ejemplo 0 → −1 y 1 → +1. La distancia al umbral es d=Ebd=\sqrt{E_b}.

La cadena de medida en GNU Radio

Una medida de BER arma un transmisor y un receptor completos y compara los bits de los dos extremos:

  1. Fuente de bits: Random Source o GLFSR Source.
  2. Mapeo y conformación: BPSK y un filtro RRC, por ejemplo con α=0,35\alpha=0{,}35 y sps=4sps=4.
  3. Canal: Channel Model, que suma ruido (Noise Voltage) y puede añadir offset de frecuencia y error de reloj.
  4. Receptor: RRC adaptado, Symbol Sync para el instante de muestreo, Costas Loop para fase y frecuencia, y Binary Slicer para decidir.
  5. Comparación: se guardan las dos secuencias, se alinean y se cuentan las diferencias.

Simulador: del ruido a la curva BER

La escena dibuja un monte gaussiano por cada símbolo sobre el plano I-Q. Lo que cruza la frontera de decisión está en rojo: esa área es el error. La curva de abajo cuenta errores de verdad, por Monte Carlo, y sus barras se cierran mientras entran bits. Arrastra el punto rosa para mover Eb/N0E_b/N_0 en todo el simulador. El modo Cadena completa simula muestra a muestra la cadena de arriba, con sus lazos.

y=s+n,  n∼N(0,σ2) por ejey=s+n,\ \ n\sim\mathcal{N}(0,\textcolor{#3b82f6}{\sigma}^2)\ \text{por eje}

σ=0.354,  rojo=cruza la frontera\textcolor{#3b82f6}{\sigma}=0.354,\ \ \textcolor{#ef4444}{\text{rojo}}=\text{cruza la frontera}

El área roja es la BER

Altura ∝ densidad (escala comprimida). Puntos: símbolos recibidos.

Del Eb/N0 al Noise Voltage

EbN0=6.0 dB=3.98\frac{E_b}{N_0}=6.0\ \text{dB}=3.98EsN0=EbN0log⁡2M=3.98 (6.00 dB)\frac{E_s}{N_0}=\frac{E_b}{N_0}\log_2 M=3.98\ (6.00\ \text{dB})SNRmuestra=EsN0−10log⁡10sps=−0.02 dB\text{SNR}_{\text{muestra}}=\frac{E_s}{N_0}-10\log_{10}sps=-0.02\ \text{dB}σ=spsEs/N0=1.002\sigma=\sqrt{\frac{sps}{E_s/N_0}}=1.002σI2=σQ2=σ22=0.502\sigma_I^2=\sigma_Q^2=\frac{\sigma^2}{2}=0.502Rb=fslog⁡2Msps=250 kb/sR_b=\frac{f_s\log_2 M}{sps}=250\ \text{kb/s}

BER contra Eb/N0

P^b=kn=00=0\textcolor{#ec4899}{\hat P_b}=\frac{k}{n}=\frac{0}{0}=0IC95%=[0, 1.00⋅100]\text{IC}_{95\%}=[0,\ 1.00\cdot 10^{0}]k=0: sin errores auˊnk=0:\ \text{sin errores aún}(EbN0) ⁣10−3=6.79 dB\left(\frac{E_b}{N_0}\right)_{\!10^{-3}}=6.79\ \text{dB}

Variable de decisión

Pb=Q ⁣(dσ)=Q ⁣(2EbN0)\textcolor{#ef4444}{P_b}=Q\!\left(\frac{d}{\textcolor{#3b82f6}{\sigma}}\right)=Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right)=Q(2.82)=2.39⋅10−3=Q(2.82)=2.39\cdot 10^{-3}d=1.000,  σ=N0/2=0.354d=1.000,\ \ \textcolor{#3b82f6}{\sigma}=\sqrt{N_0/2}=0.354

La cadena completa es un modelo de los bloques de GNU Radio con las mismas ganancias de lazo. Donde hay deslizamientos o enganche, el valor exacto cambia de una corrida a otra: eso también es parte de lo que se aprende.

Del Eb/N0 al Noise Voltage

En GNU Radio no se escribe Eb/N0E_b/N_0 sino Noise Voltage, y hay que traducirlo. El bloque Channel Model entiende esa cifra como la desviación estándar total del ruido complejo. Se puede comprobar midiendo su salida con entrada nula y σ=1\sigma=1: la varianza total da 1 y la de I, 0,5.

EsN0=EbN0log⁡2MSNRmuestra=EsN0−10log⁡10sps  [dB]\frac{E_s}{N_0}=\frac{E_b}{N_0}\log_2 M\qquad \mathrm{SNR}_{\text{muestra}}=\frac{E_s}{N_0}-10\log_{10}sps\ \ [\text{dB}]N0=σ2fs,Es=Ps spsfs⇒EsN0=Ps spsσ2⇒σ=spsEs/N0N_0=\frac{\sigma^2}{f_s},\quad E_s=\frac{P_s\,sps}{f_s}\quad\Rightarrow\quad \frac{E_s}{N_0}=\frac{P_s\,sps}{\sigma^2}\quad\Rightarrow\quad \sigma=\sqrt{\frac{sps}{E_s/N_0}}

Notación:

  • EsE_s: energía por símbolo. MM: puntos de la constelación.
  • spssps: muestras por símbolo, por ejemplo 4.
  • PsP_s: potencia de la señal por muestra; vale 1 si el RRC de transmisión tiene ganancia spssps.
  • σ\sigma: Noise Voltage. Cada rama recibe σ2/2\sigma^2/2.
  • fsf_s: tasa de muestreo. Por ejemplo, 1 MS/s con sps=4sps=4 da Rb=250R_b=250 kb/s en BPSK.

Subir sps sube σ y no cambia la BER: hay más ruido por muestra, pero el filtro adaptado integra más muestras y lo compensa. Lo que decide es Es/N0E_s/N_0, no la SNR por muestra.

Un error muy común es calcular σ\sigma como si fuera la de una sola rama:

σeje=N0 sps2=σ2⇒EbN0∣real=EbN0∣declarado+3,01 dB\sigma_{\text{eje}}=\sqrt{\frac{N_0\,sps}{2}}=\frac{\sigma}{\sqrt2}\quad\Rightarrow\quad \frac{E_b}{N_0}\Big|_{\text{real}}=\frac{E_b}{N_0}\Big|_{\text{declarado}}+3{,}01\ \text{dB}

Entra la mitad de la potencia de ruido, y la curva sale 3 dB mejor que la teoría. Es un error difícil de ver, porque el resultado parece bueno: una curva por encima de la teoría casi siempre indica un error de calibración, no un receptor excelente.

Pruébalo en el simulador, caso σ por eje en vez de total (3 dB): la curva se corre a la izquierda y M2M4 mide unos 3 dB de más.

Por qué QPSK Gray rinde igual que BPSK

Un símbolo QPSK son dos BPSK en cuadratura. Con código Gray cada bit se decide en un solo eje, y los ruidos de I y Q son independientes:

Es=2Eb,dI=dQ=Es2=Eb,σI2=σQ2=N02⇒Pb=Q ⁣(EbN0/2)=Q ⁣(2EbN0)E_s=2E_b,\quad d_I=d_Q=\sqrt{\frac{E_s}{2}}=\sqrt{E_b},\quad \sigma_I^2=\sigma_Q^2=\frac{N_0}{2}\quad\Rightarrow\quad P_b=Q\!\left(\frac{\sqrt{E_b}}{\sqrt{N_0/2}}\right)=Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right)

QPSK lleva el doble de bits en el mismo ancho de banda porque usa las dos dimensiones ortogonales, no porque gaste más energía por bit. Código Gray significa que dos símbolos vecinos difieren en un solo bit, así que el error más probable cuesta un bit. En 16-QAM los puntos están más cerca a igual EbE_b. La aproximación estándar de vecino más cercano es:

Pb≈34 Q ⁣(4Eb5N0)P_b\approx\tfrac34\,Q\!\left(\sqrt{\frac{4E_b}{5N_0}}\right)

Pruébalo en el simulador, caso QPSK Gray = BPSK: compara la BER de cada rama en el resumen numérico.

Monte Carlo: cuántos bits hacen falta

Una BER medida es una estimación, y su incertidumbre depende de cuántos errores se contaron, no de cuántos bits se enviaron. El número de errores sigue aproximadamente una distribución de Poisson:

P^b=knΔP^bP^b≈1k\hat P_b=\frac{k}{n}\qquad \frac{\Delta\hat P_b}{\hat P_b}\approx\frac{1}{\sqrt{k}}

Conviene dar cada punto con su intervalo de confianza. El de Wilson al 95 % sigue siendo válido con pocos errores:

p^+z22n±zp^(1−p^)n+z24n21+z2n\frac{\hat p+\frac{z^2}{2n}\pm z\sqrt{\frac{\hat p(1-\hat p)}{n}+\frac{z^2}{4n^2}}}{1+\frac{z^2}{n}}

Notación:

  • kk: errores contados. nn: bits comparados. p^=k/n\hat p=k/n.
  • z=1,96z=1{,}96: cuantil para el 95 %.

Regla práctica: de 10 a 100 errores por punto. Con BER 10−510^{-5} y 10510^5 bits se espera un solo error, y la probabilidad de no ver ninguno es e−1=37 %e^{-1}=37\,\%. Con 10610^6 bits el intervalo va de 5,4·10⁻⁶ a 1,8·10⁻⁵, y con 10710^7 se estrecha a 8,2·10⁻⁶–1,2·10⁻⁵. Por eso «0 errores» no significa BER 0: en el simulador se dibuja como un triángulo en el límite superior.

Pruébalo en el simulador, caso Pocos bits (Wilson y 1/√k): sube los bits por punto y mira cerrarse las barras.

Alinear antes de contar

Para comparar bit a bit, el receptor debe conocer la secuencia transmitida. Se usa una secuencia pseudoaleatoria (PRBS), que parece ruido y se puede repetir. En GNU Radio la da Random Source con una semilla fija, o un GLFSR Source, que la genera con un registro de desplazamiento realimentado. Como los filtros y lazos retrasan la señal, primero hay que hallar el retardo:

r[ℓ]=∑n(2brx[n+ℓ]−1)(2btx[n]−1),ℓ^=arg⁡max⁡ℓ ∣r[ℓ]∣r[\ell]=\sum_n (2b_{\text{rx}}[n+\ell]-1)(2b_{\text{tx}}[n]-1),\qquad \hat\ell=\arg\max_\ell\,\lvert r[\ell]\rvert
  • ∣r∣\lvert r\rvert y no rr: si el Costas engancha a 180°, el pico es negativo. El máximo sin valor absoluto elegiría un retardo falso. El signo del pico dice si hay que invertir los bits.
  • Por FFT: la correlación directa con 10610^6 bits son del orden de 101210^{12} productos, minutos por punto. Por FFT tarda menos de un segundo.
  • Una sola vez: si el retardo se fija al inicio, un deslizamiento posterior deja todos los bits siguientes con BER ≈ 0,5.

Los lazos: el reloj y la portadora

Dos lazos reconstruyen lo que el receptor no conoce. El Symbol Sync busca el instante de muestreo con un detector de error de temporización (TED), y el Costas Loop corrige fase y frecuencia.

eM&M[k]=a^[k−1] y[k]−a^[k] y[k−1]e_{\text{M\&M}}[k]=\hat a[k-1]\,y[k]-\hat a[k]\,y[k-1]eG[k]=ℜ{y[k−12] (y[k−1]−y[k])∗}e_{\text{G}}[k]=\Re\bigl\{y[k-\tfrac12]\,\bigl(y[k-1]-y[k]\bigr)^*\bigr\}eCostas[k]=ℜ{z[k]} ℑ{z[k]},ω←ω+βe,φ←φ+ω+αee_{\text{Costas}}[k]=\Re\{z[k]\}\,\Im\{z[k]\},\quad \omega\leftarrow\omega+\beta e,\quad \varphi\leftarrow\varphi+\omega+\alpha eα=4ζB1+2ζB+B2,β=4B21+2ζB+B2,ζ=22\alpha=\frac{4\zeta B}{1+2\zeta B+B^2},\qquad \beta=\frac{4B^2}{1+2\zeta B+B^2},\qquad \zeta=\frac{\sqrt2}{2}

Notación:

  • y[k]y[k]: muestra en el instante de decisión. a^[k]\hat a[k]: decisión sobre ese símbolo. y[k−12]y[k-\tfrac12]: muestra a mitad de camino.
  • M&M (Mueller y Müller) decide sobre la constelación, y por eso necesita la fase resuelta. Gardner no decide: su error no depende de la fase de portadora.
  • z[k]z[k]: símbolo tras corregir la fase φ\varphi. ω\omega: frecuencia estimada, en rad/símbolo.
  • BB: loop bandwidth. α,β\alpha,\beta: ganancias que salen de él.

El ancho del lazo es un compromiso: uno estrecho (por ejemplo 0,005) deja pasar poco ruido pero tarda en engancharse; uno ancho (por ejemplo 0,045) reacciona rápido y se lleva el ruido consigo. A Eb/N0E_b/N_0 bajo, un lazo ancho produce dos fallas que la curva teórica no contempla:

  • Deslizamiento de símbolo: el reloj gana o pierde un símbolo entero. Todo lo que sigue queda desalineado, con BER ≈ 0,5.
  • Salto de 180°: el Costas de orden 2 se engancha igual de bien en φ\varphi y φ+π\varphi+\pi, y ese tramo llega invertido. En un sistema real se resuelve con codificación diferencial o una secuencia de sincronismo.

La constelación no delata esta falla. Una cadena con ruido alto y lazos estrechos y otra con menos ruido pero deslizamientos pueden verse como la misma nube difusa, con BER del orden de 10⁻¹ en un caso y 0,5 en el otro. La BER sí lo detecta, y para localizar la falla se mide por bloques, cada uno con su propio retardo.

Pruébalo en el simulador, caso Lazos anchos (deslizamientos): en el panel Lazos la correlación cae a 0 tras cada deslizamiento.

Offset de frecuencia: enganche contra piso de error

Un offset de frecuencia hace girar la constelación, y el Costas debe alcanzar ese giro antes de poder seguirlo:

Δω=2π ΔfRsp. ej.  2π⋅3000250 000=0,075 rad/sıˊmbolo\Delta\omega=\frac{2\pi\,\Delta f}{R_s}\qquad\text{p. ej. }\ \frac{2\pi\cdot 3000}{250\,000}=0{,}075\ \text{rad/símbolo}

Mientras no lo alcanza, la constelación gira y la BER de ese tramo es 0,5. Si esos bits entran en la cuenta, suman un número fijo de errores, y la BER medida depende de la longitud de la corrida:

P^b≈Pb+Neng2 n\hat P_b\approx P_b+\frac{N_{\text{eng}}}{2\,n}

Notación:

  • NengN_{\text{eng}}: bits que dura el enganche.
  • nn: bits contados en total.

Un transitorio de enganche puede parecer un piso de error. A Eb/N0E_b/N_0 alto, PbP_b es diminuta y domina el término Neng/2nN_{\text{eng}}/2n: la curva se aplana como si hubiera un piso. La prueba es repetir con más bits: un piso verdadero se queda donde está, y este baja en proporción a 1/n1/n. Por eso se descarta el arranque de los lazos, se mide por tramos o se ensancha el lazo para que enganche antes.

Un piso verdadero aparece cuando la degradación no depende del ruido térmico: un error de fase residual que el lazo no corrige, el ruido de fase del oscilador o un lazo que pierde el enganche una y otra vez. Esos errores ocurren aunque Eb/N0E_b/N_0 sea muy alto, y la curva deja de bajar. Un error de fase fijo φe\varphi_e, en cambio, no hace piso: acerca los puntos a la frontera y corre la curva una cantidad fija de dB.

Pb=Q ⁣(2EbN0 cos⁡φe)⇒L=−20log⁡10cos⁡φe  [dB]P_b=Q\!\left(\sqrt{\frac{2E_b}{N_0}}\,\cos\varphi_e\right)\quad\Rightarrow\quad L=-20\log_{10}\cos\varphi_e\ \ [\text{dB}]

Pruébalo en el simulador, caso Offset 3 kHz: ¿piso de error?: mira cómo baja el «piso» mientras entran bits, y luego abre Offset 3 kHz sin el enganche.

Si además el nivel recibido es desconocido, se añade un AGC que lo normaliza antes de los lazos:

y[n]=g[n] x[n],g[n+1]=g[n]+μ(1−∣y[n]∣)y[n]=g[n]\,x[n],\qquad g[n+1]=g[n]+\mu\bigl(1-\lvert y[n]\rvert\bigr)

Si la entrada tiene nivel aa, la ganancia se acerca a 1/a1/a con una constante de tiempo de 1/(aμ)1/(a\mu) muestras. Con a=0,01a=0{,}01, por ejemplo, son unas 10410^4 muestras con μ=10−2\mu=10^{-2} y unas 10610^6 con 10−410^{-4}. Un AGC lento alarga el arranque que hay que descartar.

Pruébalo en el simulador, caso Offset con Gardner + AGC: en Lazos, la frecuencia del Costas sube a 3 kHz en pocos miles de bits.

M2M4: estimar Eb/N0 sin conocer los bits

En un enlace no se conoce σ\sigma, así que hay que estimar Eb/N0E_b/N_0 desde la señal. M2M4 usa solo los momentos de los símbolos tras el sincronismo, sin mirar las decisiones, y por eso no se sesga a SNR baja:

M2=E∣y∣2,M4=E∣y∣4,S=2M22−M4,N=M2−S,EsN0=SNM_2=\mathrm{E}\lvert y\rvert^2,\quad M_4=\mathrm{E}\lvert y\rvert^4,\quad S=\sqrt{2M_2^2-M_4},\quad N=M_2-S,\quad \frac{E_s}{N_0}=\frac{S}{N}

Vale para señales de módulo constante como BPSK y QPSK, no para 16-QAM. En BPSK, Eb=EsE_b=E_s. Sirve también para validar una simulación por un camino independiente: si el ruido se calculó como σ por eje, M2M4 mide unos 3 dB más de lo declarado. Mide la SNR efectiva tras el sincronismo: baja con el jitter de los lazos anchos, pero no dice si los bits siguen alineados.

Pérdida de implementación y presupuesto

La pérdida de implementación es cuántos dB más que la teoría necesita un sistema real para la misma BER. Se suma al presupuesto de enlace:

EbN0∣receptor≥EbN0∣10−6+L=10,53+2=12,5 dB\frac{E_b}{N_0}\Big|_{\text{receptor}}\ge \frac{E_b}{N_0}\Big|_{10^{-6}}+L=10{,}53+2=12{,}5\ \text{dB}

A eso se añade el margen por desvanecimiento o variación del enlace. Las causas de la pérdida son ruido de fase, offset y jitter de los lazos, desbalance I/Q y componente DC, cuantización y recorte, no linealidad del amplificador e ISI residual. Como esas degradaciones no dependen del ruido térmico, a SNR alta pasan a dominar, y la pérdida suele crecer con Eb/N0E_b/N_0.

Pruébalo en el simulador, caso Presupuesto: 10⁻⁶ con 2 dB: la banda gris es la pérdida y la línea discontinua marca el Eb/N0 requerido.

FEC: comprar dB con redundancia

Un código corrector añade redundancia controlada. Un convolucional de tasa 1/2 y longitud de restricción 7, con Viterbi por decisión suave, da unos 5 dB de ganancia a BER 10−510^{-5}: cada bit de salida depende de los 7 últimos de entrada, y el decodificador elige la secuencia válida más cercana. El costo es duplicar el ancho de banda (o reducir a la mitad la tasa útil) y sumar latencia. Los códigos LDPC y turbo se acercan más al límite de Shannon. El simulador no modela FEC.

Errores típicos

  • Calcular Noise Voltage como σ por eje, N0 sps/2\sqrt{N_0\,sps/2}: la curva sale 3 dB mejor que la teoría. Conviene medir la salida del bloque antes de fiarse de una fórmula.
  • Usar lazos demasiado anchos a Eb/N0 bajo: deslizamientos y BER ≈ 0,5.
  • Usar argmax(corr) sin valor absoluto: con el Costas a 180° elige un retardo falso.
  • np.correlate(…, 'full') con 10610^6 bits: minutos por punto. Hay que correlacionar por FFT.
  • Contar los bits del enganche de los lazos: el error parece un piso que depende de la longitud de la corrida.
  • Dar por buena una BER con menos de 10 errores, o leer «0 errores» como BER 0.
  • Diagnosticar por la constelación: dos cadenas pueden verse igual y diferir mucho en la BER.
  • Poner un Head en un ramal de monitoreo: al llenarse detiene toda la cadena.

Transmisor I/Q y OFDM

En el transmisor la señal va en sentido contrario al receptor: el programa genera los números I y Q y el USRP los convierte en radio. Hay dos formas clásicas de ocupar un canal: una portadora rápida, donde cada símbolo usa todo el ancho, o muchas portadoras lentas en paralelo, que es OFDM. Las dos tienen que respetar el fondo de escala del DAC, el ancho del canal y la linealidad del amplificador.

Del bit a la antena

En portadora única cada símbolo es un pulso, y la señal es la suma de esos pulsos. En GNU Radio, el Constellation Modulator hace dos cosas en un solo bloque: asigna los bits a la constelación y filtra con una raíz de coseno alzado (RRC).

s(t)=ℜ{x(t) ej2πfct}x(t)=∑nsn g(t−nTs)s(t)=\Re\bigl\{x(t)\,e^{j2\pi f_c t}\bigr\}\qquad x(t)=\sum_n s_n\,g(t-nT_s)Rs=fsspsB=(1+α)RsB−3 dB=RsR_s=\frac{f_s}{sps}\qquad B=(1+\alpha)R_s\qquad B_{-3\,\text{dB}}=R_s

Por ejemplo, con una configuración típica:

fs=1 MS/s, sps=4, α=0,35 ⇒ Rs=250 kbaud,  B=337,5 kHzf_s=1\ \text{MS/s},\ sps=4,\ \alpha=0{,}35\ \Rightarrow\ R_s=250\ \text{kbaud},\ \ B=337{,}5\ \text{kHz}

Notación:

  • sns_n: símbolo de la constelación, 2 bits en QPSK y 4 en 16-QAM.
  • g(t)g(t): pulso RRC; Ts=1/RsT_s=1/R_s: tiempo de símbolo.
  • α\alpha: factor de roll-off, entre 0 y 1; 0,35 es un valor habitual.
  • spssps: muestras por símbolo.
  • DUC: dentro del USRP, interpola hasta la tasa del DAC.
  • NCO: oscilador numérico que traslada la señal a fcf_c.
  • ACI: interferencia sobre el canal adyacente; lo que se escapa de la banda propia cae en la de otro.
  • Máscara: límite regulatorio de lo que se puede emitir fuera de banda. El simulador dibuja un canal de 340 kHz y los adyacentes a ±400 kHz como ejemplo.

Simulador: el transmisor completo

La escena apila las piezas de la señal: subportadoras en OFDM y pulsos en portadora única, con su suma al frente y su espectro al fondo. Debajo, el espectro y el DAC por un lado, y por el otro la rejilla, la CCDF, el eco y el amplificador. Todo lee del mismo estado, y el catálogo abre cada concepto de las secciones siguientes.

x(t)=∑kXk ej2πkΔftx(t)=\sum_k \textcolor{#3b82f6}{X_k}\,e^{j2\pi k\Delta f t}

52 activas de 64

PAPR de este símbolo: 8,5 dB

Pasa el puntero por la rejilla para resaltar una subportadora.

Espectro TX: OFDM-QPSK

Δf=fsN=400 kHz64=6,25 kHz\Delta f=\frac{f_s}{N}=\frac{400\ \text{kHz}}{64}=6{,}25\ \text{kHz}B−3=330,6 kHz\textcolor{#f59e0b}{B_{-3}}=330{,}6\ \text{kHz}B−20=381,3 kHz\textcolor{#10b981}{B_{-20}}=381{,}3\ \text{kHz}B99%=329,1 kHz\textcolor{#ec4899}{B_{99\%}}=329{,}1\ \text{kHz}η=1,48 b/s/Hz\eta=1{,}48\ \text{b/s/Hz}

Rejilla y estimación de canal

Configuración de ejemplo: IFFT de 64, CP de 16, 48 datos y 4 pilotos.

52 de 64 activas: clic en una columna para apagarla
k = -26 (datos): clic para apagark = -25 (datos): clic para apagark = -24 (datos): clic para apagark = -23 (datos): clic para apagark = -22 (datos): clic para apagark = -21 (piloto): clic para apagark = -20 (datos): clic para apagark = -19 (datos): clic para apagark = -18 (datos): clic para apagark = -17 (datos): clic para apagark = -16 (datos): clic para apagark = -15 (datos): clic para apagark = -14 (datos): clic para apagark = -13 (datos): clic para apagark = -12 (datos): clic para apagark = -11 (datos): clic para apagark = -10 (datos): clic para apagark = -9 (datos): clic para apagark = -8 (datos): clic para apagark = -7 (piloto): clic para apagark = -6 (datos): clic para apagark = -5 (datos): clic para apagark = -4 (datos): clic para apagark = -3 (datos): clic para apagark = -2 (datos): clic para apagark = -1 (datos): clic para apagark = 1 (datos): clic para apagark = 2 (datos): clic para apagark = 3 (datos): clic para apagark = 4 (datos): clic para apagark = 5 (datos): clic para apagark = 6 (datos): clic para apagark = 7 (piloto): clic para apagark = 8 (datos): clic para apagark = 9 (datos): clic para apagark = 10 (datos): clic para apagark = 11 (datos): clic para apagark = 12 (datos): clic para apagark = 13 (datos): clic para apagark = 14 (datos): clic para apagark = 15 (datos): clic para apagark = 16 (datos): clic para apagark = 17 (datos): clic para apagark = 18 (datos): clic para apagark = 19 (datos): clic para apagark = 20 (datos): clic para apagark = 21 (piloto): clic para apagark = 22 (datos): clic para apagark = 23 (datos): clic para apagark = 24 (datos): clic para apagark = 25 (datos): clic para apagark = 26 (datos): clic para apagar-26-21-7072126
H^k=YkXk, k=±7,±21\textcolor{#f59e0b}{\hat H_k}=\frac{Y_k}{X_k},\ k=\pm7,\pm21error de H^=1,5 %\text{error de }\textcolor{#10b981}{\hat H}=1{,}5\,\%EVM=5,7 %\text{EVM}=5{,}7\,\%
Estimador de canal
Antes de ecualizar (Yₖ)
Tras ecualizar (Yₖ / Ĥₖ)

Ancho de banda: tres maneras de medirlo

  • A −3 dB: donde la potencia cae a la mitad respecto a la meseta. En un coseno alzado es exactamente RsR_s, sin importar α\alpha.
  • A −20 dB: mide las faldas. Es el que importa para no molestar al canal vecino.
  • 99 %: ancho que contiene el 99 % de la potencia.

Lo bajo que quedan las faldas depende de la longitud del filtro, no solo de α\alpha: un RRC truncado deja lóbulos que suben el fuera de banda. El Constellation Modulator de GNU Radio usa un pulso largo, de unos 11·sps símbolos, y por eso sus faldas son muy bajas.

Pruébalo en el simulador, caso QPSK bien escalada: arrastra α\alpha en el espectro: hasta α ≈ 0,5 el ancho a −3 dB casi no cambia y las faldas se abren. Con α mayor la meseta desaparece, y el ancho medido respecto a ella crece.

Escala hacia el DAC

El USRP Sink en fc32 tiene un fondo de escala de ±1\pm1 por componente. Si I o Q lo superan, la señal se recorta. Lo que define el nivel es una constante kk (tx_amp u ofdm_amp), y esa constante depende de cuánta potencia entrega el bloque anterior y de cuánto se alejan sus picos de esa potencia:

xDAC[n]=k x[n]∣ℜ xDAC∣≤1,∣ℑ xDAC∣≤1x_{\text{DAC}}[n]=k\,x[n]\qquad \lvert\Re\,x_{\text{DAC}}\rvert\le1,\quad \lvert\Im\,x_{\text{DAC}}\rvert\le1k Px  10PAPR/20<1  ⇒  k<1Px  10PAPR/20k\,\sqrt{P_x}\;10^{\mathrm{PAPR}/20}<1\ \ \Rightarrow\ \ k<\frac{1}{\sqrt{P_x}\;10^{\mathrm{PAPR}/20}}

Notación:

  • PxP_x: potencia media que entrega el bloque anterior.
  • PAPR\mathrm{PAPR}: cuánto supera el pico a la potencia media, en dB. Se explica más abajo.

Los bloques de GNU Radio no entregan potencia 1. La QPSK del Constellation Modulator sale con potencia 4. La IFFT de OFDM no divide entre NN, así que su potencia es la suma de las subportadoras que llegan:

x[n]=∑kXk e j2πkn/N ⇒ ∣x[n]∣2‾=∑k∣Xk∣2x[n]=\sum_{k}X_k\,e^{\,j2\pi kn/N}\ \Rightarrow\ \overline{\lvert x[n]\rvert^2}=\sum_{k}\lvert X_k\rvert^2

Con 48 datos QPSK de ∣Xk∣2=4\lvert X_k\rvert^2=4 y 4 pilotos de potencia 1 son 196 en cada símbolo de datos, y del orden de 150 en promedio cuando la trama intercala sincronismo y cabecera. Por eso una constante que parece pequeña, como 0,05, ya recorta en OFDM, y hace falta algo cercano a 0,016. En QPSK, con potencia 4 y unos 3,5 dB de PAPR, la regla da k<0,33k<0{,}33: 0,3 funciona y 0,5 recorta.

Pruébalo en el simulador, caso QPSK con amplitud excesiva (se recorta): mira las muestras en rojo y, en Vista 2D, la trayectoria aplastada contra el cuadrado.

OFDM: muchas portadoras lentas

En vez de un símbolo rápido que ocupa todo el canal, OFDM envía muchos símbolos lentos a la vez, cada uno en su subportadora. La IFFT calcula esa suma de una sola vez.

x[n]=∑kXk e j2πkn/NΔf=fsNx[n]=\sum_{k}X_k\,e^{\,j2\pi kn/N}\qquad \Delta f=\frac{f_s}{N}fs=400 kS/s, N=64 ⇒ Δf=6,25 kHz,  52 Δf=325 kHzf_s=400\ \text{kS/s},\ N=64\ \Rightarrow\ \Delta f=6{,}25\ \text{kHz},\ \ 52\,\Delta f=325\ \text{kHz}

Las subportadoras se traslapan en frecuencia y aun así no se interfieren, porque dentro de una ventana de NN muestras son ortogonales:

1N∑n=0N−1e j2πkn/N e−j2πmn/N={1,k=m0,k≠m\frac1N\sum_{n=0}^{N-1}e^{\,j2\pi kn/N}\,e^{-j2\pi mn/N}=\begin{cases}1,&k=m\\0,&k\ne m\end{cases}

Notación:

  • XkX_k: símbolo de la subportadora kk.
  • NN: tamaño de la IFFT, por ejemplo 64.
  • Δf\Delta f: separación entre subportadoras.
  • OFDM Carrier Allocator: ubica datos y pilotos en la rejilla. Un reparto típico con N=64N=64: 48 de datos, 4 pilotos en k=±7,±21k=\pm7,\pm21 y 12 vacías.
  • Nulo de DC: k=0k=0 va vacía, porque ahí se concentran las imperfecciones del oscilador local del equipo.
  • Guardas: subportadoras vacías en los bordes, para dejar margen a los filtros y al canal vecino.

Las subportadoras usadas forman una meseta de unos Nusadas ΔfN_{\text{usadas}}\,\Delta f. Medido a −3 dB el ancho sale un poco mayor, cerca de (Nusadas+1) Δf(N_{\text{usadas}}+1)\,\Delta f, porque la primera y la última subportadora aportan medio lóbulo más hacia afuera.

Pruébalo en el simulador, caso OFDM bien escalada: en la escena, cada sinc del fondo pasa por cero en el centro de las demás. Pasa el puntero por la rejilla para resaltar una.

Prefijo cíclico y multitrayecto

Un eco hace que cada símbolo se derrame sobre el siguiente. El prefijo cíclico (CP) copia el final del símbolo a su inicio y así hace dos cosas: absorbe el derrame y vuelve circular la convolución con el canal dentro de la ventana de la FFT.

Tsıˊmbolo=N+Ncpfseficiencia del CP=NN+NcpT_{\text{símbolo}}=\frac{N+N_{cp}}{f_s}\qquad \text{eficiencia del CP}=\frac{N}{N+N_{cp}}N=64, Ncp=16, fs=400 kS/s ⇒ Tsıˊmbolo=200 μs,  Tcp=40 μs,  80 %N=64,\ N_{cp}=16,\ f_s=400\ \text{kS/s}\ \Rightarrow\ T_{\text{símbolo}}=200\ \mu\text{s},\ \ T_{cp}=40\ \mu\text{s},\ \ 80\,\%τ≤Tcp ⇒ Yk=HkXk+WkHk=∑ℓhℓ e−j2πkℓ/N\tau\le T_{cp}\ \Rightarrow\ Y_k=H_kX_k+W_k\qquad H_k=\sum_{\ell}h_\ell\,e^{-j2\pi k\ell/N}

Notación:

  • NcpN_{cp}: muestras del prefijo; TcpT_{cp}: su duración.
  • τ\tau: retardo del eco.
  • hℓh_\ell: respuesta al impulso del canal; HkH_k: su DFT, un número complejo por subportadora.
  • WkW_k: ruido en la subportadora kk.
  • ISI: interferencia entre símbolos, porque la ventana recoge parte del símbolo anterior.
  • ICI: interferencia entre subportadoras, porque ese trozo ajeno no es periódico en la ventana y se pierde la ortogonalidad.

Mientras τ≤Tcp\tau\le T_{cp} basta un coeficiente por subportadora para corregir el canal. Si τ\tau supera al CP aparece un piso de error que más potencia no corrige. El costo del CP es tiempo: con 16 muestras sobre 64, solo el 80 % de cada símbolo lleva información nueva.

Pruébalo en el simulador, caso Eco mayor que el CP: 60 µs: arrastra el eco y el borde del CP. En el simulador, con Es/N0 de 30 dB y un eco a la mitad de amplitud, el EVM es de unos 6 % hasta 40 µs y de unos 45 % a 60 µs.

Pilotos: estimar el canal

El receptor conoce lo que se transmitió en los pilotos, así que puede despejar el canal en esas subportadoras:

H^k=YkXk\hat H_k=\frac{Y_k}{X_k}
  • YkY_k: lo recibido; XkX_k: el valor conocido del piloto.
  • H^k\hat H_k: estimación del canal. Entre pilotos se interpola.

En un canal plano y sin ruido la estimación es exacta. Cuando el canal es selectivo, HkH_k cambia de una subportadora a otra, y unos pocos pilotos separados no alcanzan a seguirlo: entre pilotos la interpolación se equivoca. Por eso muchos sistemas estiman el canal completo con un símbolo de preámbulo conocido y usan los pilotos sobre todo para seguir el error de fase común, símbolo a símbolo.

Pruébalo en el simulador, caso Pilotos y canal selectivo: sube el retardo y compara los dos estimadores: con solo pilotos el EVM crece rápido y con el preámbulo se mantiene bajo. En un canal plano sin ruido, Ĥ da exactamente 1.

PAPR y CCDF

La relación pico a promedio dice qué tan por encima de su potencia media llega la señal. Se mide con la CCDF: la probabilidad de que la potencia instantánea supere un nivel. Una muestra OFDM es la suma de decenas de términos independientes, y por el límite central tiende a una gaussiana compleja. Su envolvente es de Rayleigh y su potencia normalizada, exponencial:

PAPR=PpicoPpromP ⁣(∣x∣2Pprom>γ)≈e−γ\mathrm{PAPR}=\frac{P_{\text{pico}}}{P_{\text{prom}}}\qquad P\!\left(\frac{\lvert x\rvert^2}{P_{\text{prom}}}>\gamma\right)\approx e^{-\gamma}γ10−3=ln⁡103=6,9 → 8,4 dBγ10−5=ln⁡105=11,5 → 10,6 dB\gamma_{10^{-3}}=\ln 10^{3}=6{,}9\ \to\ 8{,}4\ \text{dB}\qquad \gamma_{10^{-5}}=\ln 10^{5}=11{,}5\ \to\ 10{,}6\ \text{dB}
  • γ\gamma: nivel respecto al promedio.
  • Rayleigh: distribución del módulo de una gaussiana compleja.

El PAPR de OFDM depende del número de subportadoras, no de su modulación: con decenas de ellas, QPSK o 16-QAM dan casi la misma curva. La QPSK de portadora única, en cambio, se queda en pocos dB, porque sus picos solo vienen del solapamiento de los pulsos.

Una cabecera o un preámbulo que se repite casi igual en cada trama suma siempre el mismo pico, así que la CCDF de la trama completa queda por encima de la de solo datos en las probabilidades bajas. Para comparar con e−γe^{-\gamma} hay que mirar solo los datos.

Pruébalo en el simulador, caso Una subportadora contra muchas (PAPR): con 1 subportadora el PAPR es 0 dB, con 2 son 3 dB, y con 8 ya se acerca a la curva exponencial. Alterna «Solo datos» y «Con cabecera».

El amplificador: back-off, SDR y ACLR

Un amplificador real se aplana cerca de su saturación. Para no deformar los picos hay que trabajar lejos de ella, y esa distancia es el back-off. Un modelo sencillo y habitual es el de Rapp, que solo comprime la amplitud:

∣y∣=∣x∣(1+∣x∣2p)1/2pIBO=PsatPent\lvert y\rvert=\frac{\lvert x\rvert}{\bigl(1+\lvert x\rvert^{2p}\bigr)^{1/2p}}\qquad \mathrm{IBO}=\frac{P_{\text{sat}}}{P_{\text{ent}}}SDR=∥g x∥2∥y−g x∥2,g=⟨x,y⟩⟨x,x⟩ACLR=PcanalPadyacente\mathrm{SDR}=\frac{\lVert g\,x\rVert^2}{\lVert y-g\,x\rVert^2},\quad g=\frac{\langle x,y\rangle}{\langle x,x\rangle}\qquad \mathrm{ACLR}=\frac{P_{\text{canal}}}{P_{\text{adyacente}}}

Notación:

  • pp: suavidad de la saturación; p=2p=2 es típico en amplificadores de estado sólido. La salida satura en 1.
  • IBO\mathrm{IBO}: back-off de entrada, potencia de saturación sobre potencia media de entrada.
  • gg: ganancia compleja que mejor alinea la salida con la entrada; lo que sobra es distorsión.
  • SDR: potencia útil sobre distorsión dentro de la banda. Limita el EVM.
  • ACLR: potencia en el canal sobre la del canal adyacente, medida con el mismo ancho.
  • Recrecimiento espectral: la no linealidad crea potencia fuera de banda que no estaba en la señal.

Para una misma SDR, la señal con más PAPR necesita más back-off, y la diferencia se parece a la diferencia de PAPR en las probabilidades bajas: OFDM pide varios dB más que QPSK. Más back-off significa menos potencia media por el mismo amplificador, es decir, menos alcance o menos eficiencia energética. Es el precio de OFDM.

Pruébalo en el simulador, caso Back-off del PA: QPSK contra OFDM: arrastra el punto de operación y compara la salida del PA con la entrada. Las curvas de SDR y ACLR marcan cuánto back-off pide cada señal para llegar a 25 dB.

Eficiencia espectral

ηuˊnica=log⁡2M1+αηOFDM=Ndatoslog⁡2M(N+Ncp)/fs⋅1Nusadas Δf\eta_{\text{única}}=\frac{\log_2 M}{1+\alpha}\qquad \eta_{\text{OFDM}}=\frac{N_{\text{datos}}\log_2 M}{(N+N_{cp})/f_s}\cdot\frac{1}{N_{\text{usadas}}\,\Delta f}

Con las configuraciones de ejemplo de esta sección:

EsquemaTasa y anchoEficiencia bruta (b/s/Hz)
QPSK, α = 0,35500 kb/s en 337,5 kHz1,48
16-QAM, α = 0,351 Mb/s en 337,5 kHz2,96
OFDM-QPSK, 48 datos, CP 16480 kb/s en 325 kHz1,48
OFDM-16QAM, 48 datos, CP 16960 kb/s en 325 kHz2,95

Con el mismo ancho, las dos tienen casi la misma eficiencia bruta: la portadora única pierde por el roll-off (1/(1+α)=0,741/(1+\alpha)=0{,}74) y OFDM por CP, pilotos y guardas (4880⋅6452=0,74\tfrac{48}{80}\cdot\tfrac{64}{52}=0{,}74). La ventaja de OFDM no es la eficiencia, sino que con multitrayecto cada subportadora ve un canal plano que se corrige con un solo coeficiente.

La trama se lleva además una parte: sincronismo, cabecera, CRC y relleno. En un paquete de 96 bytes con QPSK sobre 48 subportadoras, 3 de cada 12 símbolos no llevan datos.

Duplicar la tasa en el mismo ancho

Se consigue con 16-QAM: 4 bits por símbolo en lugar de 2, con el mismo pulso y el mismo ancho. El precio es que los puntos quedan más juntos para la misma energía por símbolo:

dmin⁡QPSK=2Esdmin⁡16-QAM=0,4 Es10log⁡1020,4≈7 dBd_{\min}^{\text{QPSK}}=\sqrt{2E_s}\qquad d_{\min}^{\text{16-QAM}}=\sqrt{0{,}4\,E_s}\qquad 10\log_{10}\frac{2}{0{,}4}\approx7\ \text{dB}

Hacen falta unos 7 dB más de Es/N0E_s/N_0 para la misma tasa de error, y la señal tiene más PAPR, porque sus puntos no tienen todos la misma amplitud.

Pruébalo en el simulador, caso Duplicar la tasa en el mismo ancho (16-QAM): el ancho no cambia, la eficiencia se duplica y la CCDF se abre.

La trama de GNU Radio

  • Stream to Tagged Stream: corta el flujo en paquetes, por ejemplo de 96 bytes, y los etiqueta con su longitud.
  • Stream CRC32: 4 bytes de comprobación. Un paquete con errores se descarta, así que un archivo puede llegar incompleto, pero no alterado.
  • Protocol Formatter y Tagged Stream Mux: crean la cabecera y la unen al paquete. La cabecera va en BPSK.
  • Preámbulo de Schmidl y Cox: un símbolo con dos mitades idénticas en el tiempo, que permite detectar la trama y estimar el offset. Otro símbolo conocido da el canal.
  • Tag Gate: se usa cuando transmisor y receptor están en el mismo flowgraph. Las etiquetas del transmisor llegarían al receptor y lo confundirían; por RF no viajan.
  • PER: tasa de paquetes perdidos, la métrica natural en OFDM con paquetes.

Cada paquete ocupa varios símbolos OFDM: dos de sincronismo, uno de cabecera y los de datos, con el último incompleto. La rejilla del simulador dibuja esos símbolos. El detector de trama compara una métrica con un umbral fijo, típicamente 0,9, y el valor medio de esa métrica es:

M‾≈(SNR1+SNR)2=0,9 ⇒ SNR≈18,5 → 12,7 dB\overline{M}\approx\left(\frac{\mathrm{SNR}}{1+\mathrm{SNR}}\right)^2=0{,}9\ \Rightarrow\ \mathrm{SNR}\approx18{,}5\ \to\ 12{,}7\ \text{dB}

La media cruza el umbral recién hacia los 12,7 dB, y como la métrica fluctúa, una detección fiable pide bastante más, del orden de 20 dB. Por eso un enlace OFDM con paquetes puede necesitar más SNR que la portadora única aunque por subportadora no sea más exigente: el cuello de botella es la detección de la trama, no la demodulación.

Codificación diferencial

El Costas Loop de orden 4 engancha con una ambigüedad de múltiplos de 90°. La codificación diferencial envía los datos en el cambio de fase, y funciona solo si girar la constelación 90° equivale a sumar una constante al índice de cada símbolo. constellation_dqpsk() suma +1 y qam_constellation(16, True) suma +4.

Errores típicos

Fallas comunes al armar el flujograma en GNU Radio. Que el espectro se vea bien no las delata; solo aparecen al medir.

  • Sin Pack K Bits: una fuente como el GLFSR entrega un bit por byte y el modulador espera bytes empaquetados. Casi todos los símbolos salen iguales y aparece una raya espectral muy por encima de la meseta.
  • constellation_qpsk() con codificación diferencial: hay errores aun sin ruido, porque girarla 90° permuta los índices sin un desplazamiento constante.
  • Sin Stream CRC32 en el transmisor: el receptor verifica un CRC al final de cada paquete. Sin él se descartan todos.
  • Repack Bits en MSB: la cabecera no se reconoce y no llega ningún paquete. Debe coincidir el orden de bits a ambos lados (LSB primero en la cadena OFDM de ejemplo).
  • Constante hacia el DAC elegida a ciegas: si no tiene en cuenta la potencia del bloque anterior y el PAPR, la señal se recorta.
  • Costas de orden 4 con 16-QAM: solo usa el signo de I y Q, que en 16-QAM no apunta al punto correcto, y deja un piso de error. Un lazo dirigido por decisión, como el Constellation Receiver, lo evita.