
Prólogo
En el verano de 2016, de un evento bien conocido, su humilde servidor, entre un grupo de otros estudiantes, pudo asistir a las conferencias del profesor Martin Haardt sobre temas de MIMO , impartidos por él en el marco del programa internacional de maestría "Comunicación y procesamiento de señales" . Pero, desafortunadamente, una semana y media de cada dos me enfermé bastante y, por lo tanto, varios temas quedaron fuera de mi alcance ... Sin embargo, después de un tiempo, analizar los conceptos básicos de MIMO se convirtió en mi hobby, no dejar el caso sin terminar.
Poco a poco, todo esto se ha convertido en una serie de pequeños seminarios abstractos , que, probablemente, sería un error no compartir. Y hoy, en honor del Día de la Comunicación , me gustaría discutir con ustedes el tema del ancho de banda del canal MIMO, un tema simple, pero que sigue causando ciertas dificultades a los estudiantes (y no solo a los estudiantes).
Puede parecer a las personas no involucradas que un aumento en el número de antenas de recepción y transmisión dentro del marco de la tecnología mencionada aumenta el ancho de banda del sistema exactamente en la misma cantidad: por ejemplo, si coloca 2 antenas en el lado de recepción y 2 antenas en el lado de transmisión (MIMO 2x2), entonces el rendimiento definitivamente aumentará definitivamente 2 veces ¿Pero es esto incluso cierto en teoría? ¡Intentemos resolverlo!
Puede encontrar una versión más formal en inglés en el enlace y en mi repositorio de GitHub .
En este artículo, no consideraremos los problemas de correlación de antena y otros problemas de implementación. Nos limitamos a una teoría destilada, para empezar.
Modelo de señal recibida

Antes de comenzar a hablar sobre el ancho de banda, primero trataremos la descripción matemática de la señal recibida. Esta parte debe tomarse con mucho cuidado, ya que esta fórmula aportará mucho. Entonces la señal recibida se puede representar como:
donde
- potencia del transmisor,
- número de antenas transmisoras,
- caracteres transmitidos
- ruido aditivo, y
- matriz de coeficientes de transmisión del canal (de hecho, el proceso de desvanecimiento).
La señal transmitida también se puede pintar con un poco más de detalle:
donde
- una de las señales de información (
) y
- amplificación de un cierto camino de propagación de una onda EM (ganancia de camino).
Digamos cuál es el refuerzo del camino:
Fortalecer el camino de propagación (o el peso de la antena) significa la distribución de la potencia de salida proporcional a la "fuerza" de un camino particular. En otras palabras, queremos asignar más potencia para los buenos canales (rutas de propagación) y menos energía para los malos canales.
Los pesos de las antenas están limitados por el número de antenas de transmisión:
donde
Es el rango de la matriz del canal.
Hablando de esto último.
Dimensión de la matriz
hace las paces
donde
- número de antenas receptoras.
Para varias mediciones de tiempo, el canal se verá así:

Para referencia:
Tal vez para cálculos y modelos más complejos desee utilizar una de las herramientas más populares para eso: MatLab . En este caso, vale la pena considerar que allí se usa una estructura de datos ligeramente diferente: las filas son medidas de tiempo (instantáneas), el número de columnas corresponde al número de antenas de transmisión
, la dimensión lateral corresponde a
.
La fórmula (1) se puede adaptar fácilmente para casos especiales de MIMO.
MISO ( Múltiple Entrada Entrada Salida - varias antenas de transmisión y una de recepción):
donde
Es un vector
.
SIMO (SINGLE Single M Ultiple O utput - varias antenas de recepción y una antena de transmisión):
donde
Es un vector 
SISO (SINGLE SINGLE SINGLE O utput - una antena en los lados de recepción y transmisión):
Parece ser simple
Toda consideración adicional se puede dividir en dos grandes casos: la información de estado del canal (CSI - información de estado del canal) es desconocida para el transmisor ( CU - Canal desconocido) y la información del estado del canal es conocida por el transmisor ( CK - Canal conocido).
Arriba, examinamos el caso cuando el canal es desconocido para el transmisor ( caso de bucle abierto , transmisión sin retroalimentación). En otras palabras, debido a la falta de información necesaria, no podemos elegir ninguna dirección efectiva y, por lo tanto, seguimos el camino más simple: transmitimos la misma potencia a través de todas las antenas (caminos, caminos de propagación). Por lo tanto, la ganancia de cada ganancia de ruta es 1 :
Sin embargo, repetimos: queremos asignar más potencia para los buenos canales (rutas de propagación) y menos energía para los malos canales.
Surge la pregunta: ¿cómo distribuir efectivamente el poder?
Si se conoce el canal ( caso de bucle cerrado , con retroalimentación), podemos usar escenarios de transmisión avanzados con algunos algoritmos de procesamiento de señal adicionales. Por ejemplo, con enfoques lineales como precodificación y postprocesamiento .
Entenderemos lo que significan los dos últimos términos.
Si tenemos CSI en el lado de transmisión, es decir matriz
, podemos procesar matemáticamente esta misma matriz. Por ejemplo, aplicando el algoritmo SVD (Descomposición de valor singular).

Tenga en cuenta que la matriz
Es una matriz diagonal, y los elementos de su diagonal (valores singulares) son, en esencia, coeficientes de transmisión de rutas de propagación únicas. En otras palabras, si logramos la multiplicación de nuestra señal por una matriz de valores singulares
en lugar de canal completo
, entonces el canal MIMO se descompondrá en una matriz de canales SISO paralelos.
Entonces la matriz de precodificación lineal (filtro) debe ser
, y la matriz de postprocesamiento lineal (demodulador)
( H significa conjugación hermitiana).
Obviamente, para el caso con un canal desconocido
y
matrices de identidad igual.
Ahora, sabiendo todo lo anterior, redefinimos el modelo de la señal recibida:
Tenga en cuenta que:
tiene las mismas propiedades estadísticas que
;- Valores propios
son los cuadrados de los valores singulares de la matriz de canales
(
)
Esquemáticamente, esto se puede representar como:

Fig. 1. El esquema de precodificación y postprocesamiento [1, p.67].

Fig. 2. Esquema de descomposición modal
cuando el canal es conocido por el transmisor y el receptor [1, p.67].
Los conceptos básicos se desarman: ¡podemos pasar directamente al ancho de banda !
Capacidad
Creo que todos los que estudiaron la teoría de la información recuerdan que el término ancho de banda nos llegó de esta disciplina en particular. Por lo general (en mi edad de estudiante), la consideración se centró en el caso clásico del canal AWGN, pero la fórmula se puede derivar con relativa facilidad para el caso de un canal MIMO con desvanecimiento.
Para no volver a escribir los cálculos de los libros, traté de organizar todo más o menos colorido y a mano, para dar fórmulas de vida, por así decirlo. Espero que este formato sea menos tedioso.
Entonces, una vez más, escribimos el modelo de señal:

Ahora pasemos a determinar el rendimiento a través de la información mutua .

Escribimos la matriz de autocovarianza de la señal recibida y sus componentes:

Y los usamos para determinar la entropía diferencial :

Sustituya (4) y (5) en (2):

Y ahora sustituimos (6) en (1):

Seguimos razonando. Tome el primer caso: el canal es desconocido ( C hannel U desconocido). Esto significa para nosotros que es imposible elegir la dirección de transmisión óptima y, por lo tanto, las señales transmitidas serán independientes y tendrán la misma potencia (equi- alimentada). Basado en la condición máxima (
), podemos tomar la matriz de autocovarianza de los caracteres transmitidos igual a la matriz de identidad. Entonces tenemos:

Utilizamos la siguiente propiedad de determinantes:
Este es nuestro caso, y podemos intercambiar las matrices para que
(de las propiedades EVD). Permanecerá:

Pasando de matrices a sumas, tenemos:

Esta fórmula nuevamente ilustra el enfoque de considerar MIMO como canales SISO paralelos.
Para el caso con el canal conocido ( C hannel K nown), los pesos de la antena se agregarán a la fórmula:

También escribimos fórmulas para casos especiales:

Nota :
Para los casos de SIMO y MISO, no es en vano que los cuadrados de la norma Frobenius aparezcan en el registro
- desde un punto de vista matemático, son equivalentes a valores propios
. Por lo tanto, si necesita calcular rápidamente algo a mano, aquí hay una manera.
Bueno, espero que mi letra y mi inglés no interfieran mucho con la percepción de la información, pero aún así, hablemos del punto principal :
- Sí, el ancho de banda del canal MIMO puede considerarse como la suma del ancho de banda de los canales SISO .
- Sin embargo, esta cantidad está limitada por el rango del canal.
Algoritmo de vertido de agua
Como se puede ver en la fórmula de ancho de banda conocida en el lado de transmisión del canal (CK - Canal conocido), la distribución de energía sobre las antenas se puede optimizar. Para hacer esto, utilizamos el algoritmo de vertido de agua ( llenado con agua ) [1, p. 68-69]:
import numpy as np from numpy import linalg as LA import matplotlib.pyplot as plt def waterpouring(Mt, SNR_dB, H_chan): SNR = 10**(SNR_dB/10) r = LA.matrix_rank(H_chan) H_sq = np.dot(H_chan,np.matrix(H_chan, dtype=complex).H) lambdas = LA.eigvals(H_sq) lambdas = np.sort(lambdas)[::-1] p = 1; gammas = np.zeros((r,1)) flag = True while flag == True: lambdas_r_p_1 = lambdas[0:(r-p+1)] inv_lambdas_sum = np.sum(1/lambdas_r_p_1) mu = ( Mt / (r - p + 1) ) * ( 1 + (1/SNR) * inv_lambdas_sum) for idx, item in enumerate(lambdas_r_p_1): gammas[idx] = mu - (Mt/(SNR*item)) if gammas[rp] < 0:
Prueba:
Mt = 3 SNR_db = 10 H_chan = np.array([[1,0,2],[0,1,0], [0,1,0]], dtype = float) gammas = waterpouring(Mt, SNR_db, H_chan) print('Rank of the matrix: '+str(LA.matrix_rank(H_chan))) print('Gammas:\n'+str(gammas)) >>> Rank of the matrix: 2 >>> Gammas: >>> [1.545 1.455]
Bueno, parece razonable:
1) el número de antenas de transmisión involucradas es igual al rango del canal;
2) la suma de los pesos de las antenas es igual al número de antenas de transmisión.
Dos casos limitantes
Y ahora vamos a distraernos un poco y resolver los problemas de comprensión.
Encontremos, por ejemplo, a qué serán iguales los coeficientes
con SNR tendiendo a
y
(en una escala logarítmica, por supuesto, porque no hay poderes negativos).
Recordamos la fórmula de correspondencia entre decibelios y tiempos:
donde
- potencia de la señal transmitida (para nuestras tareas, es equivalente a la energía del símbolo
) y
- potencia de ruido (en nuestro problema es igual a la densidad espectral del ruido
)
Entonces en una escala lineal será:
Observamos las fórmulas básicas del algoritmo:
donde
Es un iterador que comienza con 1,
Es el rango de la matriz del canal,
- i-ésimo valor propio del "cuadrado" de la matriz del canal. Los gammas se calculan de acuerdo con la siguiente fórmula:
Comenzamos a razonar:
Si
entonces
. Por lo tanto
. Para la primera iteración, permanece:
Sustituir a gamma:
Resumimos:
Con una energía de transmisión infinitamente grande o ruido infinitesimal, no es necesario pensar en nada especial, digamos así: distribuimos uniformemente la potencia entre las antenas de transmisión (teniendo en cuenta el rango de la matriz del canal).
Razonamos aún más:
¿Y a qué tiende el caso de SNR?
? Aquí ni siquiera entraremos en matemáticas, razonaremos lógicamente: este caso corresponde a ruido infinitamente grande o potencia de transmisión cero. Entonces, de una manera y otra, nuestro sistema, considere, no funciona. Por lo tanto, la pregunta con gammas desaparece automáticamente ...
Estas son a veces preguntas que surgen en un examen con un profesor.
Contando el rendimiento (¡finalmente!)
def siso_capacity(H_chan, SNR_dB): SNR = 10**(SNR_dB/10) c = np.log2(1 + SNR*(np.abs(H_chan)**2)) return c def openloop_capacity(H_chan, SNR_dB): SNR = 10**(SNR_dB/10) Mt = np.shape(H_chan)[1] H_sq = np.dot(H_chan,np.matrix(H_chan, dtype=complex).H) lambdas = LA.eigvals(H_sq) lambdas = np.sort(lambdas)[::-1] c = 0 for eig in lambdas: c = c + np.log2(1 + SNR*eig/Mt) return np.real(c) def closedloop_capacity(H_chan, SNR_dB): SNR = 10**(SNR_dB/10) Mt = np.shape(H_chan)[1] H_sq = np.dot(H_chan,np.matrix(H_chan, dtype=complex).H) lambdas = LA.eigvals(H_sq) lambdas = np.real(np.sort(lambdas))[::-1] c = 0 gammas = waterpouring(Mt, SNR_dB, H_chan) for idx, item in enumerate(lambdas): c = c + np.log2(1 + SNR*item*gammas[idx]/Mt) return np.real(c) Mr = 4 Mt = 4 H_chan = (np.random.randn(Mr,Mt) \ + 1j*np.random.randn(Mr, Mt))/np.sqrt(2)
Parece funcionar Pasamos a evaluaciones más sustantivas.
Capacidad ergódica
Como se puede ver en los ejemplos anteriores, trabajamos con procesos aleatorios. Y, francamente, es un error sacar conclusiones sobre procesos aleatorios en una implementación. Incluso si el canal es constante en el sentido estadístico, es necesario un promedio sobre un conjunto suficientemente grande.
Aquí el concepto de capacidad ergódica nos es útil:
donde
denota mat. expectativa (valor esperado).
Estamos modelando
Mr = 4 Mt = 4 counter = 1000 SNR_dBs = [i for i in range(1, 21)] C_MIMO_CU = np.empty((len(SNR_dBs), counter)) C_MIMO_CK = np.empty((len(SNR_dBs), counter)) C_SISO = np.empty((len(SNR_dBs), counter)) C_SIMO = np.empty((len(SNR_dBs), counter)) C_MISO_CU = np.empty((len(SNR_dBs), counter)) C_MISO_CK = np.empty((len(SNR_dBs), counter)) for c in range(counter): H_MIMO = (np.random.randn(Mr,Mt) + 1j*np.random.randn(Mr, Mt))/np.sqrt(2) H_SISO = H_MIMO[0,0] H_SIMO = H_MIMO[:,0].reshape(Mr,1) H_MISO = H_MIMO[0,:].reshape(1,Mt) for idx, SNR_dB in enumerate(SNR_dBs): C_MIMO_CU[idx, c] = openloop_capacity(H_MIMO, SNR_dB) C_MIMO_CK[idx, c] = closedloop_capacity(H_MIMO, SNR_dB) C_SISO[idx, c] = siso_capacity(H_SISO, SNR_dB) C_SIMO[idx, c] = openloop_capacity(H_SIMO, SNR_dB) C_MISO_CU[idx, c] = openloop_capacity(H_MISO, SNR_dB) C_MISO_CK[idx, c] = closedloop_capacity(H_MISO, SNR_dB) C_MIMO_CU_erg = np.mean(C_MIMO_CU, axis=1) C_MIMO_CK_erg = np.mean(C_MIMO_CK, axis=1) C_SISO_erg = np.mean(C_SISO, axis=1) C_SIMO_erg = np.mean(C_SIMO, axis=1) C_MISO_CU_erg = np.mean(C_MISO_CU, axis=1) C_MISO_CK_erg = np.mean(C_MISO_CK, axis=1) plt.figure(figsize=(7, 5), dpi=600) plt.plot(SNR_dBs, C_MIMO_CU_erg,'g-o', label='$M_R=4$, $M_T=4$ (CU)') plt.plot(SNR_dBs, C_MIMO_CK_erg,'g-v', label='$M_R=4$, $M_T=4$ (CK)') plt.plot(SNR_dBs, C_MISO_CU_erg, 'm-o', label='$M_R=1$, $M_T=4$ (CU)') plt.plot(SNR_dBs, C_MISO_CK_erg, 'm-v', label='$M_R=1$, $M_T=4$ (CK)') plt.plot(SNR_dBs, C_SISO_erg, 'k-', label='$M_R=1$, $M_T=1$') plt.plot(SNR_dBs, C_SIMO_erg, 'c-', label='$M_R=4$, $M_T=1$') plt.title("Ergodic Capacity") plt.xlabel('SNR (dB)') plt.ylabel('Capacity (bps/Hz)') plt.legend() plt.minorticks_on() plt.grid(which='major') plt.grid(which='minor', linestyle=':') plt.show()

Fig.3. Curvas de ancho de banda para diferentes esquemas de transmisión. Comparar con [1, p. 74].
Entonces vemos que
- Se espera que el caso MIMO sea superior a los demás, y con el aumento de la SNR, la necesidad de conocimiento de la matriz del canal disminuye (ver el ejemplo con infinitos).
- SIMO es superior a MISO si el transmisor no conoce el canal (la potencia en MISO se comparte en todas las antenas, pero no de manera óptima) y coincide con MISO en el caso de un canal conocido .
- Se espera que SISO azote la cola.
Y Su Majestad reina sobre el rango de la matriz de canales , lo que no nos permite comparar inequívocamente el aumento en el número de antenas con el aumento en la velocidad de transmisión.
Tales cosas
Literatura
(aunque solo hay un libro, ¡pero qué libro!)
- Paulraj, Arogyaswami, Rohit Nabar y Dhananjay Gore.
Introducción a las comunicaciones inalámbricas espacio-temporales. Cambridge University Press, 2003.