scieee AI-readable full text Open interactive document viewer

Evaluación de la distorsión no lineal producida por amplificadores de potencia en señales Wi-Fi

Ruiz González, María Jesús

Abstract

La tecnología WiFi se ha convertido en una herramienta fundamental para el acceso a Internet en hogares, centros educativos, oficinas y otros entornos. Gracias a su evolución continua, esta tecnología ha logrado adaptarse a las crecientes demandas de movilidad, capacidad y eficiencia, siendo una de las soluciones más utilizadas en redes de área local. Dentro de un sistema WiFi, el amplificador de potencia cumple una función clave al aumentar el nivel de señal para que esta pueda ser transmitida efizcamente a través del medio inalámbrico. Sin embargo, cuando estos dispositivos operan cerca de su punto de saturación, pueden introducir un fenómeno conocido como distorsión no lineal, que en algunos casos afecta negativamente a la calidad de la señal. Por ello, este trabajo se centra en evaluar el comportamiento de un amplificador de potencia de clase J al ser excitado con señales correspondientes a distintas versiones del estándar IEEE 802.11. Para evaluar dicho comportamiento, se analizan y comparan diferentes figuras de mérito, con el fin de derminar en qué medida la distorsión no lineal compromete o no la calidad de la señal de salida.

Full text

Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado en Ingeniería de las Tecnologías de Telecomunicación Evaluación de la distorsión no lineal producida por amplificadores de potencia en señales Wi-Fi Autor: María Jesús Ruiz González Tutores: María José Madero Ayora y Elías Marqués Valderrama Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2025 Trabajo Fin de Grado en Ingeniería de las Tecnologías de Telecomunicación Evaluación de la distorsión no lineal producida por amplificadores de potencia en señales Wi-Fi Autor: María Jesús Ruiz González Tutores: María José Madero Ayora y Elías Marqués Valderrama Profesora Titular y Profesor Sustituto Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2025 Trabajo Fin de Grado: Evaluación de la distorsión no lineal producida por amplificadores de potencia en señales Wi-Fi Autor: María Jesús Ruiz González Tutores: María José Madero Ayora y Elías Marqués Valderrama El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha: Agradecimientos Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado Robert Waldinger C on este trabajo finalizo una de las etapas más importantes de vida, un camino en el que no solo me he formado académicamente, sino que también he crecido como persona. Hoy puedo mirar atrás, y confirmar lo que dice la frase inicial: he llegado lejos, pero no lo hice sola. En primer lugar, agradecer a mis padres y a mi hermano, que han sido mi pilar fundamental. Su apoyo incondicional, su paciencia y su confianza en mí han sido claves para no rendirme en los momentos más dificiles, dándome siempre la mano para no dejarme sola. Gracias por enseñarme que el verdadero éxito se comparte en familia. Mi madre solía decirme: "Cuando entres en la carrera, vas a encontrar a tus amigas de verdad". ¡Y cuanta razón tenía! Durante estos años he tenido la suerte de compartir el camino con personas increíbles (Ana, Laura, Victoria, María, Nuria, Paula y Marina) que me han demostrado el verdadero significado de la amistad. Siempre hemos encontrado la manera de sacarnos una sonrisa y de seguir adelante juntas. Gracias chicas. Por último, agradecer a todos los profesores que han sido parte de la formación alcanzada en esta etapa. En especial, a María José, por su cercanía y por hacer que este trabajo final, lejos de convertirse en una carga, fuera una oportunidad de aprender y superar mis límites. María Jesús Ruiz González Sevilla, 2025 I Resumen L a tecnología WiFi se ha convertido en una herramienta fundamental para el acceso a Internet en hogares, centros educativos, oficinas y otros entornos. Gracias a su evolución continua, esta tecnología ha logrado adaptarse a las crecientes demandas de movilidad, capacidad y eficiencia, siendo una de las soluciones más utilizadas en redes de área local. Dentro de un sistema WiFi, el amplificador de potencia cumple una función clave al aumentar el nivel de señal para que esta pueda ser transmitida efizcamente a través del medio inalámbrico. Sin embargo, cuando estos dispositivos operan cerca de su punto de saturación, pueden introducir un fenómeno conocido como distorsión no lineal, que en algunos casos afecta negativamente a la calidad de la señal. Por ello, este trabajo se centra en evaluar el comportamiento de un amplificador de potencia de clase J al ser excitado con señales correspondientes a distintas versiones del estándar IEEE 802.11. Para evaluar dicho comportamiento, se analizan y comparan diferentes figuras de mérito, con el fin de derminar en qué medida la distorsión no lineal compromete o no la calidad de la señal de salida. III XÍndice 4.2.3 PAPR 24 4.2.4 Sincronización de las señales 24 4.2.5 NMSE 25 4.2.6 Característica AM-AM y AM-PM 25 4.2.7 EVM y constelación de la señal 26 5 Resultados experimentales 27 5.1 Montaje experimental 27 5.1.1 Caracterización del camino de entrada 27 5.1.2 Caracterización del camino de salida 27 5.2 Amplificador de Potencia de Doble Banda Clase J 28 5.3 Resultados experimentales 29 5.3.1 IEEE 802.11g 29 5.3.2 IEEE 802.11n 35 5.3.3 IEEE 802.11ac 38 5.3.4 IEEE 802.11ax 40 5.3.5 IEEE 802.11be 41 6 Conclusiones y líneas futuras de trabajo 45 Apéndice A Códigos utilizados 47 Índice de Figuras 157 Índice de Tablas 159 Índice de Códigos 161 Bibliografía 163 Notación PA Power Amplifier IEEE Institute of Electrical and Electronics Engineers IoT Internet of Things WLAN Wireless Local Area Network OFDM Orthogonal Frequency Division Multiplexing MAC Medium Access Contrl PHY Physical Layer QAM Quadrature Amplitude Modulation MIMO Multiple Input Multiple Output SISO Single Input Single Output CSMA/CA Carrier Sense Multiple Access with Collision Avoidance DIFS Distributed Interframe Space RTS Request To Send CTS Clear To Send ACK Acknowledgement QoS Quality of Service FCS Frame Check Sequence HT High Throughput VHT Very High Throughput HE High Efficiency EHT Extremely High Throughput PLCP Physical Layer Convergence Protocol PMD Physical Medium Dependent IFFT Inverse Fast Fourier Transform FFT Fast Fourier Transform PSK Phase Shift Keying ISI InterSymbol Interference OFDMA Orthogonal Frequency Division Multiple Access PSD Power Spectral Density ACPR Adjacent Channel Power Ratio PAPR Peak-to-Average Power Ratio EVM Error Vector Magnitude NMSE Normalised Mean Square Error MCS Modulation and Coding Scheme RU Resource Units CCDF Complementary Cumulative Distribution Function MPDU MAC Protocol Data Unit PSDU PLCP Service Data Unit XI 1 Introducción L a evolución de las comunicaciones inalámbricas ha transformado radicalmente la forma en que las personas y dispositivos interactúan con el entorno. Desde sus orígenes, estas tecnologías han buscado ofrecer conectividad flexible, eliminando la necesidad de conexiones físicas y permitiendo una transmisión de datos más ágil y ubicua. En este contexto, las redes WiFi, basadas en el estándar IEEE 802.11, se han convertido en una herramienta indispensable en la vida cotidiana, ofreciendo desde el acceso a Internet en hogares hasta aplicaciones avanzadas en entornos industriales, por ejemplo. El atractivo de las redes inalámbricas radica en su facilidad de despliegue, flexibilidad y bajo coste relativo frente a soluciones cableadas como la fibra óptica, cuyos altos costes de instalación y mantenimiento suponen una barrera importante en entornos rurales o de difícil acceso [ 11 ]. Por este motivo, el uso del espectro radioeléctrico para establecer enlaces de alta capacidad se ha convertido en una alternativa cada vez más relevante, permitiendo una conectividad ágil y escalable en escenarios donde antes resultaba inviable. Desde la publicación de su primera versión en 1997, el estándar IEEE 802.11 ha sido objeto de una evolución continua, incorporando mejoras en la modulación y codificación, en técnicas de acceso múltiple y el uso eficiente del espectro. La incorporación de modulación OFDM (Orthogonal Frequency Division Multiplexing) ha supuesto un salto cualititativo en términos de velocidad y robustez, especialmente en entornos con interferencia y multitrayecto. No obstante, esta complejidad también plantea nuevos retos en la etapa de transmisión. En particular, las señales OFDM presentan una alta PAPR (Peak-to-Average Power Ratio), lo que exige a los amplificadores de potencia a operar con márgenes amplios si se desea evitar la distorsión no lineal. Este dispositivo es el responsable de amplificar la señal, garantizando tanto la eficiencia energética como la fidelidad de la transmisión [ 14 ]. Pero cuando el amplificador opera cerca de su punto de saturación para maximizar la eficiencia, comienza a introducir efectos no lineales que degradan la señal y generan emisiones fuera de banda, lo que puede perjudicar a canales adyacentes e incumplir los límites establecidos. Este tipo de distorsión no lineal resulta especialmente problemático en sistemas inalámbricos modernos y para evaluar su comportamiento es necesario realizar un estudio detallado de las medidas experimentales. Por consiguiente, en este trabajo, se abordará el análisis de la distorsión no lineal introducida por un amplificador de potencia de clase J cuando es excitado con señales WiFi generadas conforme a distintas versiones del estándar. El dispositivo, diseñado para operar en las bandas ISM de 2.4 GHz y 5.8 GHz, frecuencias comunmente utilizadas en comunicaciones WiFi, ha sido cedido para este estudio por la profesora Mónica Fernández-Barciela, de la Universidad de Vigo. El objetivo es evaluar experimentalmente su comportamiento ante señales moduladas y analizar su impacto en la calidad de la transmisión. Para este estudio ha sido necesario generar las formas de onda en MATLAB ® , utilizando específicamente el WLAN Toolbox y la aplicación interactiva Wireless Waveform Generator. Una vez generadas, las señales se han transmitido y medido en el laboratorio mediante el uso de los equipos correspondientes, lo que ha permitido evaluar las respuestas del sistema en distintas condiciones. El análisis de los resultados se ha llevado a cabo a partir de las figuras de mérito, como el ACPR (Adjacent Channel Power Ratio), PAPR, NMSE (Normalised Mean Square Error), EVM (Error Vector Magnitude) y las curvas AM-AM y AM-PM, que permiten cuantificar los efectos de la distorsión no lineal. Para ello, se han comparado las señales en tres escenarios distintos: la señal ideal, la señal tras pasar por un cable coaxial y la señal tras pasar por el amplificador. 1 2Capítulo 1. Introducción 1.1 Estructura del trabajo Este trabajo se organiza en seis capítulos, estructurados de forma que permita una compresión de los conceptos técnicos y experimentales necesarios para el desarrollo del estudio: •Capítulo 1: presenta el contexto general del estudio y los objetivos que se quieren alcanzar. • Capítulo 2: describe las distintas versiones del estándar de comunicaciones inalámbricas IEEE 802.11, en especial a aquellas que emplean OFDM. Se explica tanto la capa de acceso al medio como la capa física, y se analizan los parametros técnicos relevantes para la generación de las señales utilizadas. • Capítulo 3: introduce los fundamentos teóricos de la distorsión no lineal en amplificadores de potencia, así como las figuras de mérito empleadas en este trabajo para evaluar dicho efecto. • Capítulo 4: detalla el procedimiento para generar las señales WiFi con diferentes configuraciones en MATLAB®y la forma de calcular las métricas utilizadas en esta herramienta. • Capítulo 5: presenta y analiza los resultados obtenidos en el laboratorio para cada una de las señales generadas, comparándolas en los tres escenarios estudiados, y dividiendo los resultados por estándar, destacando el impacto de la distorsión no lineal en cada caso. • Capítulo 6: resume las conclusiones extraídas del estudio, valorando el comportamiento del amplificador de potencia utilizado, y se proponen posibles líneas futuras de trabajo. 2 El estándar IEEE 802.11 E n la actualidad, las redes inalámbricas desempeñan un papel esencial en la vida cotidiana, permitiendo una conectividad ubicua y flexible que impulsa desde aplicaciones domésticas hasta infraestructuras críticas. Entre estas redes, la tecnología WiFi, basada en el estándar IEEE 802.11, se ha convertido en la principal vía de acceso a Internet para millones de dispositivos en todo el mundo. Su evolución constante ha permitido no solo una mejora en la velocidad y eficiencia de transmisión, sino también una adaptación a nuevas necesidades tecnológicas como el Internet de las Cosas (IoT, Internet of Things), las comunicaciones en entornos de alta densidad y la creciente demanda de movilidad. Este capítulo se centra en el análisis del estándar IEEE 802.11, fundamento técnico de las redes WiFi. En primer lugar, se presenta una visión general de las redes inalámbricas, clasificadas según su alcance y aplicación, para contextualizar el papel de las WLAN dentro del ecosistema de comunicaciones. A continuación, se introduce el estándar desde una perspectiva histórica y técnica, describiendo su estructura, evolución y principales versiones, con especial atención a aquellas que utilizan modulación OFDM, ya que serán objeto de análisis en este trabajo. También se describen en detalle las dos capas principales del estándar: la capa de acceso al medio (MAC), responsable de la regulación del acceso al canal compartido y del control de errores, y la capa física (PHY), encargada de la transmisión efectiva de las señales en el medio radioeléctrico. Finalmente, se profundiza en la técnica de modulación OFDM, clave en las últimas generaciones de WiFi, y se explican sus principios de funcionamiento, ventajas, desafíos y parámetros característicos. Este marco teórico resulta fundamental para comprender cómo se ve afectada la calidad de la señal al atravesar un amplificador de potencia, aspecto principal en los capítulos posteriores. 2.1 Redes inalambricas Las redes inalámbricas han cobrado una importancia fundamental en la sociedad actual, ya que permiten la transmisión de datos sin necesidad de conexiones físicas. Este tipo de redes ofrece una gran flexibilidad y facilidad de despliegue, lo que las hace ideales para una amplia variedad de entornos, desde el hogar y la oficina hasta espacios públicos, hospitales o zonas rurales. La movilidad, la escalabilidad y el acceso ubicuo que ofrecen han sido clave en el crecimiento de tecnologías como el IoT, la domótica y las comunicaciones móviles. Las redes inalámbricas pueden clasificarse según su cobertura y el alcance de sus señales. A continuación, se presentan las principales categorías [2]: • WBAN (Wireless Body Area Network): son redes inalámbricas de área corporal, con un alcence inferior a los 30 cm. Están diseñadas para conectar sensores o dispositivos electrónicos colocados sobre o alrededor del cuerpo humano. Su uso es común en aplicaciones médicas, como el monitoreo continuo de la salud en pacientes crónicos o personas mayores, mediante pulseras, sensores implantables o dispositivos portátiles. • WPAN (Wireless Personal Area Network): tienen un alcance aproximado de 10 m y se utilizan para conectar dispositivos cercanos a una persona, como teléfonos móviles, auriculares, teclados, etc. Suelen emplear tecnologías como Bluetooth o Zigbee. Estas redes permiten el intercambio de información de forma rápida, sencilla y sin necesidad de infraestructura compleja. 3 4Capítulo 2. El estándar IEEE 802.11 • WLAN (Wireless Local Area Network): las redes inalámbricas de área local, como las basadas en el estándar IEEE 802.11, permiten la conexión de dispositivos dentro de un área limitada, como un hogar, una oficina o un edificio. Su alcance típico ronda los 100 m o incluso varios kilómetros. Están diseñadas para proporcionar acceso a recursos compartidos, como impresoras o conexiones a Internet, y son gestionadas generalmente por los propios usuarios o entidades propietarias. • WMAN (Wireless Metropolitan Area Network): este tipo de redes cubren áreas urbanas extensas, conectando edificios o infraestructuras dentro de una ciudad. Se utilizan para interconectar varias redes LAN dispersas geográficamente y ofrecer servicios de red a nivel metropolitano. Son implementadas frecuentemente por operadores de telecomunicaciones y pueden utilizar tecnologías como WiMAX o redes de microondas. • WWAN (Wireless Wide Area Network) o WRAN (Wireless Regional Area Network): estas redes conectan dispositivos a gran escala, abarcando distancias que van desde varios kilómetros hasta los miles de kilómetros. Permiten la interconexión de ciudades, países e incluso continentes. Actualmente, se apoyan en tecnologías como la transmisión por satélite, la red móvil (3G, 4G y 5G) o enlaces inalámbricos de alta velocidad, siendo fundamentales para el funcionamiento global de Internet. Figura 2.1 Alcance de las redes inalámbricas. Fuente [22]. En los próximos apartados se analizará con más profundidad el estándar IEEE 802.11, abordando su evolución histórica, las distintas versiones que han surgido a lo largo del tiempo y las principales características técnicas. Se prestará especial atención a aquellos estándares que se han utilizado para el desarrollo de este trabajo. 2.2 Introducción al estándar IEEE 802.11 El estándar IEEE 802.11 define las bases teóricas para la comunicación en redes de área local inalámbricas (WLAN). Fue desarrollado por el Institute of Electrical and Electronics Engineers (IEEE) como parte de la familia de estándares IEEE 802, orientada al diseño y funcionamiento de redes de área local y metropolitana. Su propósito general es garantizar la interoperabilidad entre dispositivos de distintos fabricantes, definiendo un conjunto común de protocolos y especificaciones para la transmisión de datos a través del espectro radioeléctrico. Desde la publicación de su primera versión en 1997, el estándar ha sido objeto de constantes revisiones, ampliaciones y mejoras técnicas con el fin de adaptarse a las nuevas necesidades de conectividad, velocidad de transmisión, eficiencia energética y soporte para nuevos servicios. La revisión más reciente, IEEE Std 802.11-2024, incorpora todas las enmiendas aprobadas entre 2021 y 2024, incluyendo avances en áreas como servicios de localización, acceso vehicular (V2X) y comunicaciones por luz visible (LiFi), entre otras [9]. IEEE 802.11 define en detalle tanto el funcionamiento de la capa de acceso al medio (MAC, Medium Access Control), como el comportamiento de la capa física (PHY, Physical Layer). En este contexto, especifica el uso de tecnologías avanzadas, como OFDM, QAM o MIMO, lo que ha permitido una evolución constante en términos de capacidad y rendimiento de la red. Esta arquitectura proporciona la base tecnológica del sistema conocido comercialmente como WiFi, una marca registrada por la asociación internacional WiFi Alliance, formada por las principales compañías líderes en tecnología de redes inalámbricas con el objetivo de asegurar la compatibilidad e interoperabilidad de los distintos productos WLAN basados en el estándar IEEE 802.11, ampliamente adoptado en entornos domésticos, empresariales e industriales. En el presente trabajo se abordarán específicamente las versiones del estándar que emplean modulación OFDM, ya que sobre ellas se centrará el análisis de la distorsión no lineal introducida por el amplificador de potencia durante la transmisión de la señal. Los estándares considerados son: 802.11g, 802.11n, 802.11ac, 802.11ax y 802.11be, por ser los que incorporan dicha modulación en distintas generaciones de WiFi. 2.3 Capa de Acceso al Medio (MAC) 5 2.3 Capa de Acceso al Medio (MAC) La capa MAC (Medium Access Control) tiene como objetivo regular el acceso al medio de transmisión compartido, es decir, al canal radioeléctrico por el que se comunican los usuarios. A diferencia de las redes cableadas, donde las colisiones pueden detectarse físicamente, en un entorno inalámbrico esto no es posible, por lo que la capa MAC incorpora mecanismos específicos para evitar colisiones y garantizar una comunicación eficiente y ordenada. Además, esta capa se encarga de funciones como la fragmentación de tramas, el control de errores y la sincronización entre estaciones [16]. 2.3.1 Acceso múltiple CSMA/CA El mecanismo que se utiliza en el estándar IEEE 802.11 es el CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) y su funcionamiento se basa en "escuchar antes de hablar". Este está diseñado para evitar colisiones. El proceso funciona del siguiente modo: cuando una estación desea transmitir datos, primero escucha el canal para comprobar si está libre. Si no detecta ninguna transmisión en curso, espera un intervalo de tiempo denominado DIFS (Distributed Interframe Space), y si el canal continúa desocupado, inicia un contador de backoff, eligiendo un número aleatorio dentro de una ventana de contienda. Este contador disminuye mientras el canal permanezca libre; si durante este tiempo otra estación comienza a transmitir, el contador se detiene y se reanuda una vez que el medio vuelva a estar vacío. Cuando el contador llega a cero, la estación transmite su trama. Para mejorar la fiabilidad y evitar el problema del nodo oculto, se utiliza el intercambio de mensajes RTS (Request To Send) y CTS (Clear To Send) antes de enviar los datos. Si el receptor recibe correctamente la información, responde con un ACK (Acknowledgement). En caso contrario, el emisor entenderá que hubo una colisión y reiniciará el proceso, ampliando la ventana de contienda para reducir la probabilidad de nuevas colisiones. En la Figura 2.2 se puede observar un ejemplo del mecanismo de control de acceso con RTS/CTS para evitar colisiones. Figura 2.2 Mecanismos de acceso al medio. Fuente [2]. 2.3.2 Formato de las tramas MAC Las tramas MAC del estándar IEEE 802.11 constituyen la unidad básica de comunicación en redes inalámbricas. Su estructura está diseñada para permitir la transmisión de datos, y también el control del acceso al medio, la gestión de conexiones y la implementación de funciones avanzadas como la calidad de servicio (QoS) o transmisiones de alta eficiencia (HT, VHT, HE). Cada trama está compuesta por tres grandes bloques, como se muestra en la Figura 2.3: la cabecera MAC, el cuerpo de la trama y la secuencia de verificación (FCS) [24]. Cabecera de la trama MAC La cabecera MAC contiene la mayor parte de la información de control. Este se inicia con el campo Frame Control, de 2 octetos, que indica el tipo y subtipo de la trama, la versión del protocolo y diversos indicadores como la dirección (To Do / From DS), la presencia de más fragmentos, retransmisiones, control de energía, datos pendientes, tramas protegidas y la inclusión del campo HT Control. 6Capítulo 2. El estándar IEEE 802.11 Figura 2.3 Formato de la trama MAC. Fuente [9]. La estructura del campo Frame Control depende del tipo y subtipo de trama; por ejemplo, en tramas que no son de control (Type = 1), incluye subcampos como Retry, More Fragemnts y +HTC. En cambio, algunas tramas de control especializadas como RTS+HTC utilizan una estructura extendida a través de Control Wrapper. También incluye el campo Duration/ID, que indica el tiempo de ocupación del canal, y entre dos y cuatro campos de dirección. En IEEE 802.11 se contemplan hasta cuatro direcciones MAC por trama: la dirección 1 (Address 1) siempre identifica al receptor inmediato; la dirección 2 (Address 2) representa al emisor; la dirección 3 puede contener el BSSID o la dirección de destino final; y la dirección 4 se emplea únicamente en redes de distribución inalámbrica (WDS). Las direcciones pueden ser individuales, asignadas a una estación específica o grupales, como las direcciones multicast o broadcast, utilizadas para comunicar con múltiples dispositivos simultáneamente. En tramas que soportan calidad de servicio, como los QoS Data, se incorpora opcionalmente el campo QoS Control, de 2 octetos. Asimismo, tramas avanzadas pueden incluir el campo HT Control, de 4 octetos, cuya presencia se señala con el bit +HTC en el campo Frame Control. Este campo es utilizado en tramas de alto rendimiento conforme a los estándares IEEE 802.11n/ac/ax, y su formato varía según la variante (HT, High Throughput; VHT, Very High Throughput; HE, High Efficiency). Las funciones específicas de este campo incluyen control de agregación, respuesta a bloques y restricciones de categoría de acceso (AC Constraint) [9]. Cuerpo de la trama MAC El cuerpo de la trama, o Frame Body, contiene la información útil que se transmite. Puede tratarse de datos de usuario, información de gestión (por ejemplo, solicitudes de asociación) o instrucciones de control, dependiendo del tipo de trama. Este campo es de longitud variable y está precedido por todos los campos de encabezado. Frame Check Sequence (FCS) El campo FCS tiene como función la detección de errores mediante un CRC (Cyclic Redundancy Check) de 32 bits. El valor del FCS se calcula sobre todos los bits del encabezado MAC y del cuerpo de la trama, utilizando el polinomio generador de grado 32 definido por el estándar (Ecuación 2.1). El resultado es el complemento a uno del residuo de la división polinomial [ 9 ]. Al recibir una trama, el receptor realiza el mismo cálculo y verifica si el residuo coincide con el valor esperado; en caso contrario, la trama se descarta. G(x) = x32 +x26 +x23 +x22 +x16 +x12 +x11 +x10 +x8+x7+x5+x4+x2+x+1(2.1) 2.4 Capa Física (PHY) La capa física del estándar IEEE 802.11 define cómo se transmiten las señales a través del medio inalámbrico, transformando los datos digitales en señales electromagnéticas. Esta capa especifica aspectos como el formato de la señal, la modulación, la codificación, la potencia de transmisión y el uso del espectro. A lo largo del tiempo, el estándar IEEE 802.11 ha evolucionado para adaptarse a las nuevas demandas de velocidad, eficiencia y cobertura. En cuanto a su arquitectura, se organiza en dos subcapas: el PLCP (Physical Layer Convergence Protocol), que adapta los datos provenientes de la capa MAC al formato necesario para la transmisión física; y el PMD (Physical Medium Dependent), que se encarga de definir cómo se transmite y recibe la señal a través del medio físico, estableciendo las características técnicas como las frecuencias, modulaciones y potencias [ 15 ]. 2.5 Modulación OFDM 7 Esta estructura modular permite que múltiples variantes físicas puedan coexistir bajo una misma interfaz MAC, facilitando la evolución y compatibilidad entre versiones del estándar. A lo largo del tiempo, la capa física ha evolucionado a través de distintas versiones del estándar, adaptándose a nuevas tecnológicas: • 802.11 (1997): primera versión. Ofrece velocidades de 1-2 Mbps en la banda de 2.4 GHz usando espectro enchanchado DSSS (Direct Sequence Spead Spectrum) con modulaciones DBPSK/DQPSK o FHSS (Frequency Hopping Spead Spectrum) con modulación FSK. • 802.11b (1999): mejora la tasa hasta 11 Mbps usando DSSS con codificación CCK en la banda de 2.4 GHz. Popularizó el uso de WiFi. • 802.11a (1999): utiliza la banda de 5 GHz y modulación OFDM para alcanzar hasta 54 Mbps, aunque tuvo menor adopción debido a su menor alcance. • 802.11g (2003): combina la banda de 2.4 GHz con OFDM, alcanzando 54 Mbps y asegurando la compatibilidad con 802.11b. • 802.11n (WiFi 4, 2009): introduce MIMO y canales de 40 MHz en las bandas de 2.4 y 5 GHz, con velocidades teóricas de hasta 600 Mbps. Utiliza el formato de trama HT (High Throughput). • 802.11ac (WiFi 5, 2013): mejora el rendimiento con MU-MIMO (MIMO Multiusuario), canales de hasta 160 MHz y modulación 256-QAM en 5 GHz, superando los 6.9 Gbps. Introduce la variante del formato de la trama de la capa física VHT (Very High Throughput). • 802.11ax (WiFi 6, 2019): añade OFDMA (Acceso Múltiple basado en OFDM), mejora la eficiencia en entornos densos y utiliza hasta 1024-QAM, alcanzando 9.8 Gbps. Utiliza el formato de trama HE (High Efficiency). Además, se amplía al uso de la banda de 6 GHz con la modalidad de WiFi 6E. • 802.11be (WiFi 7, 2024): alcanza tasas de 46 Gbps funcionando en las bandas de 2.4, 5 y 6 GHz, utilizando OFDMA con hasta 16 flujos simultáneos, anchos de banda de hasta 320 MHz y modulación hasta 4096-QAM. Emplea el formato de trama EHT (Extremely High Throughput). •802.11ah (WiFi HaLow): usa bandas sub-GHz para IoT, ofreciendo bajo consumo y gran alcance. •802.11ad/ay (WiGig): opera en la banda de 60 GHz, con tasas de hasta 7 Gbps (ad) y 176 Gbps (ay) para aplicaciones de corto alcance como realidad virtual. Gracias a estas mejoras, la capa física ha permitido a la tecnología WiFi evolucionar desde redes básicas de bajo rendimiento hasta plataformas avanzadas capaces de satisfacer las exigencias de conectividad de hogares inteligentes, aplicaciones industriales, streaming en alta resolución y entornos IoT. Como ya se mencionó, el objetivo de este trabajo es estudiar las versiones del estándar IEEE 802.11 que utilizan la técnica de modulación OFDM, con el fin de determinar el comportamiento que tiene este tipo de señales cuando se hacen pasar por un amplificador de potencia. La elección de OFDM responde a su creciente protagonismo en las versiones más recientes del estándar, debido a su alta eficiencia espectral y robustez frente a interferencias y mutitrayecto. Sin embargo, su alta PAPR plantea desafíos importantes en la etapa de amplificación, que serán abordados en el desarrollo de este estudio. 2.5 Modulación OFDM La modulación por división de frecuencias ortogonales, conocida como OFDM, es una técnica que permite transmitir datos de manera eficiente y robusta en entornos donde la señal puede verse afectada por interferencias o múltiples trayectorias de propagación. A diferencia de los esquemas de modulación tradicionales, que transmiten un flujo de datos de alta velocidad por un único canal, OFDM divide ese flujo en múltiples subflujos de baja velocidad, enviándolos simultáneamente a través de subportadoras ortogonales, lo que hace que sea muy sencillo de ecualizar. Esta característica la hace especialmente adecuada para canales de alta dispersión, como los que se encuentran en entornos inalámbricos [17] [7]. 2.5.1 Principio de funcionamiento En OFDM, el canal total se divide en N subportadoras, cada una situada a una frecuencia diferente, espacidadas uniformemente. La clave está en que estas subportadoras son ortogonales entre sí, lo que significa que, aunque sus espectros se solapan, la interferencia mutua es nula. Esta ortogonalidad de logra seleccionando cuidadosamente la separación entre subportadoras: si cada símbolo tiene una duración T , la separación entre frecuencias debe ser de 1/T [ 23 ]. Además, se emplean pulsos rectangulares en el dominio del tiempo, lo que da lugar a pulsos de Nyquist sobre cada una de las subportadoras. Gracias a esto, cuando una subportadora 14 Capítulo 3. Distorsión no lineal. Figuras de mérito Estas emisiones no deseadas suelen generarse, entre otras causas, por el comportamiento no lineal del amplificador de potencia. En la Figura 3.4 se puede ver cómo la señal de entrada solo contiene un único canal, pero al pasar por el PA, da lugar a componentes adicionales en los canales adyacentes, pudiendo provocar interferencias sobre otros usuarios que estén utilizando el espectro. Figura 3.4 Efecto de la no linealidad del PA. Fuente [18]. 3.2.3 EVM (Error Vector Magnitude) La magnitud del vector error es otra medida que se suele utilizar para cuantificar la distorsión no lineal de los amplificadores de potencia. El EVM es la diferencia entre el punto de la constelación distorsionada de la señal de salida y el punto ideal de la señal de entrada, es decir, mide la alteración que sufre la constelacion de la señal debido a las no linealidades del sistema [ 4 ]. Esta métrica se puede expresar matemáticamente mediante la siguiente ecuación: EVM(%) = 100 ·v u u t ∑N−1 k=0|y(k)−yideal(k)|2 ∑N−1 k=0|y(k)|2.(3.2) La distorsión del transmisor pueden clasificarse en tres tipos principales: distorsiones de fase, de amplitud y la combinación de la distorsión de fase y de amplitud. Estas alteraciones afectan directamente a la calidad de la señal modulada y pueden observarse claramente en el diagrama de la constelación de una modulación QPSK (Figura 3.5). Cuando se produce una distorsión de fase, los puntos de la constelación se desplazan angularmente respecto a su posición ideal, generando un error de fase caracterizado por una rotación del conjunto de símbolos. Por otro lado, las distorsiones de amplitud provocan un cambio en la magnitud de los vectores que representan los símbolos, haciendo que algunos puntos aparezcan más alejados o más cercanos del origen respecto a lo esperado, sin modificar su ángulo. En situaciones más complejas, pueden presentarse simultáneamente errores tanto en la fase como en la amplitud, lo que resulta una desviación generalizada de los puntos respecto a su posición ideal [ 5 ]. Este tipo de distorsión combinada refleja de forma más severa el impacto sobre la calidad de la señal, ya que altera tanto la dirección como la intensidad de los símbolos recibidos. Todos estos efectos contribuyen al aumento del EVM. Figura 3.5 Efecto de la distorsión de fase y de amplitud en una constelación QPSK. (a) Efecto de la distorsión de fase. (b) Efecto de la distorsión de amplitud. (c) Efecto de la distorsión de fase y de amplitud. Fuente [5]. 3.2 Figuras de mérito 15 3.2.4 NMSE (Normalised Mean Square Error) El Error Cuadrático Medio Normalizado (NMSE, por sus siglas en inglés) es una figura de mérito empleada para cuantificar la precisión con la que un modelo o sistema reproduce la señal medida. Para ello, se calcula el error entre la señal de entrada (o predicha por el modelo) y la señal medida, normalizada con respecto a la potencia de la señal medida. En contextos como el modelado con series de Volterra, donde la salida del sistema puede representarse linealmente en función de sus coeficientes, el NMSE resulta especialmente útil para validar la fidelidad del modelo en el dominio temporal, al comparar directamente las muestras de la señal experimental con las estimadas por el modelo. Por otro lado, el NMSE también puede emplearse para evaluar rápidamente hasta qué punto el comportamiento del sistema real se desvía del ideal [ 4 ]. Con este último objetivo se empleará el NMSE en este trabajo, comparando las muestras de la señal experimental con las de la señal ideal generada. La fórmula matemática de esta expresión es: NMSE(dB) = 10 ·log10 ∑N−1 k=0|y(k)−yideal(k)|2 ∑N−1 k=0|y(k)|2!.(3.3) 3.2.5 Características AM/AM y AM/PM Una forma precisa de caracterizar el comportamiento no lineal de un PA cuando se excita con señales moduladas es mediante sus características AM/AM y AM/PM. Estas curvas permiten analizar cómo varían, respectivamente, la amplitud y la fase de la señal de salida en función de la amplitud de la señal de entrada. A diferenciade un sistema lineal, en el que la salida es proporcional a la entrada [ 5 ], los dispositivos no lineales presentan una respuesta más compleja, en la que tanto la ganancia como la fase se ven afectadas cuando atraviesan el PA. Esta información es fundamental para entender y mitigar los efectos de distorsión en sistemas de comunicaciones de alta eficiencia espectral. Característica AM/AM La característica AM/AM describe la relación entre la amplitud de la señal de entrada y la amplitud de la señal de salida. Muestra cómo evoluciona la ganancia en función de la potencia de entrada. A niveles bajos, el amplificador opera en la región lineal, pero al aumentar la potencia, se observa una compresión de ganancia, lo que significa que el incremento en la salida no es proporcional al aumento de la entrada. Esta no linealidad se vuelve evidente en la región cercana al punto de compresión de 1 dB, un valor de referencia ampliamente utilizado que indica cuándo la ganancia ha disminuido 1 dB respecto a su valor en pequeña señal [ 4 ]. En la Figura 3.6, se aprecia claramente esta transición desde el comportamiento lineal hasta la saturación del dispositivo, señalando además cómo se define el punto de compresión de 1 dB. Figura 3.6 Definición gráfica de punto de compresión de 1 dB en la característica AM/AM. Fuente [5]. Para facilitar el análisis, también es común representar la ganancia en función de la potencia de entrada. En la Figura 3.7, se contempla cómo la ganancia se mantiene constante en la región lineal y luego disminuye conforme se incrementa la potencia de entrada, lo que refleja el inicio de la no linealidad del amplificador. 16 Capítulo 3. Distorsión no lineal. Figuras de mérito Figura 3.7 Ganancia del sistema frente a la potencia de entrada. Fuente [5]. Característica AM/PM Por otro lado, la característica AM/PM representa la variación de la fase de salida en función de la amplitud de entrada. Esta distorsión de fase ocurre debido a la combinación vectorial de la componente fundamental con las componentes de distorsión generadas por el comportamiento no lineal. A diferencia de la conversión AM/AM, que puede observarse incluso en sistemas sin memoria, la conversión AM/PM es característica de sistemas dinámicos o con efectos de memoria [4]. En la Figura 3.8, se puede observar cómo la fase comienza a desviarse de su valor nominal a medida que se incrementa el nivel de entrada, lo cual puede tener un impacto importante en la calidad de la señal transmitida. Figura 3.8 Característica AM/PM. Fuente [5]. 3.2.6 PAPR (Peak-to-Average Power Ratio) La PAPR es un parámetro importante en la evaluación del rendimiento de un sistema de transmisión. Esta métrica mide la relación entre la potencia instantánea máxima de la señal y su potencia media [ 3 ]. Matemáticamente, se define como: PAPR (dB) =10log10 Pmáx(w) Pavg(w)!.(3.4) Las señales OFDM suelen presentar valores de PAPR elevados, típicamente en el rango de 10 a 13 dB [ 5 ], debido al número de subportadoras que pueden generar picos de amplitud elevados. Un valor alto de PAPR 3.2 Figuras de mérito 17 implica que el PA debe operar con un margen considerable en su zona lineal para evitar la distorsión [ 10 ]. Si el PA entra en saturación, se produce una distorsión no lineal que, aunque puede provocar una aparente reducción de la PAPR, no representa una mejora en el rendimiento del sistema. Esta disminución se debe a que los picos de la señal se recortan (clipping), alterando su forma original. En la Figura 3.9 se puede observar lo descrito anteriormente. La curva en color rojo representa la forma de onda en el tiempo de la señal transmitida y la curva de color azul muestra la señal recibida, una vez que ha pasado por el amplificador. Se puede apreciar cómo los picos de la señal original han sido recortados como consecuencia de la distorsión no lineal, lo que conllevará a una disminución de la PAPR, como se analizará en el Capítulo 5. Figura 3.9 Espectro de las señales en el dominio del tiempo. 4 Generación de formas de onda de señales WiFi con MATLAB® P ara la generación de las diferentes formas de onda utilizadas en este trabajo, correspondientes al estándar IEEE 802.11, se ha empleado la herramienta Wireless Waveform Generator de MATLAB ® . Esta aplicación permite generar las señales de forma interactiva y visual, lo que facilita la configuración precisa de los parámetros deseados. El primer paso en el uso de esta herramienta consiste en seleccionar el estándar IEEE con el que se va a trabajar, que será adoptado por la correspondiente generación WiFi. En este estudio se han diseñado un total de 16 formas de onda empleando diferentes estándares de la familia IEEE 802.11: 802.11a/g/j, 802.11n/ac, 802.11ax y 802.11be, cada uno configurado con distintos parámetros. Cabe destacar que todos estos estándares se basan en la técnica de modulación OFDM, conocida por su robustez frente a interferencias y efectos de multitrayecto. Una vez seleccionado el estándar correspondiente, se procede a configurar los principales parámetros de la señal, entre los cuales destacan: •Ancho de banda del canal. •MCS (Modulation and Coding Scheme). •Número de paquetes transmitidos. •Fuente de bits (aleatoria o definida). •Factor de sobremuestreo, que determina la tasa de muestreo de la señal transmitida. Este último parámetro está condicionado por la capacidad de los equipos de medida utilizados en el laboratorio, cuya tasa de muestreo máxima es de 100 MHz. Para garantizar que las señales generadas no superen esta limitación, se ajusta el factor de sobremuestro en función del ancho de banda de la señal: para un ancho de banda de 20 MHz, se emplea un factor de sobremuestreo de 5; para 40 MHz, el factor será de 2; y para un ancho de banda de 80 MHz, se reduce a 1 el factor de sobremuestreo. Esta configuración permite mantener la señal dentro de los márgenes permitidos por el hardware disponible. En las tablas que se muestran a continuación, se resumen las posibles configuraciones del parámetro MCS en cada uno de los estándares utilizados: IEEE 802.11a/g/j (Tabla 4.1), IEEE 802.11n (Tabla 4.2), IEEE 802.11ac (Tabla 4.3), IEEE 802.11ax (Tabla 4.4) y IEEE 802.11be (Tabla 4.5). En el caso de los estándares WiFi que permiten la transmisión simultánea de múltiples usuarios, como IEEE 802.11ax y 802.11be, se ha configurado la señal de manera que sólo un usuario esté activo en cada transmisión, ajustando los parámetros relacionados con el acceso múltiple, como es la asignación de recursos (RU, Resource Units); y sin hacer uso de múltiples flujos espaciales mediante MIMO, a pesar de que el estándar lo contemple, asegurando que toda la capacidad del canal esté destinada a un solo usuario en cada caso. Una vez definidos todos los parametros, se procede a la generación de la señal. La aplicación ofrece distintas opciones de visualización que resultan útiles para el análisis de la señal generada. Entre ellas, se encuentra la visualización del espectro en el dominio de la frecuencia, que permite analizar la distribución de potencia de la señal y comprobar que cumple con la máscara espectral establecida por cada especificación. Asimismo, es posible visualizar el espectro en el dominio temporal, lo cual facilita el estudio de la evolución temporal de la señal. También incluye la representación de la curva CCDF (Complementary Cumulative 19 20 Capítulo 4. Generación de formas de onda de señales WiFi con MATLAB® Tabla 4.1 Configuración MCS según el estándar IEEE 802.11a/g/j. MCS Modulación Tasa de código (r) 0 BPSK 1/2 1 BPSK 3/4 2 QPSK 1/2 3 QPSK 3/4 4 16-QAM 1/2 5 16-QAM 3/4 6 64-QAM 2/3 7 64-QAM 3/4 Tabla 4.2 Configuración MCS según el estándar IEEE 802.11n. MCS Modulación Tasa de código (r) 0 BPSK 1/2 1 QPSK 1/2 2 QPSK 3/4 3 16-QAM 1/2 4 16-QAM 3/4 5 64-QAM 2/3 6 64-QAM 3/4 7 64-QAM 5/6 Tabla 4.3 Configuración MCS según el estándar IEEE 802.11ac. MCS Modulación Tasa de código (r) 0 BPSK 1/2 1 QPSK 1/2 2 QPSK 3/4 3 16-QAM 1/2 4 16-QAM 3/4 5 64-QAM 2/3 6 64-QAM 3/4 7 64-QAM 5/6 8 256-QAM 3/4 9 256-QAM 5/6 Distribution Function), que aporta información estadística relevante sobre la amplitud de la señal. En el siguiente capítulo (Capítulo 5), dedicado a los resultados obtenidos, se mostrarán ejemplos de gráficas de este tipo. Por último, cada señal generada puede exportarse a un script de MATLAB ® , que al ejecutarse representa la misma señal y proporciona acceso a variables útiles en el Workspace, como el número de muestras generadas. Este número suele oscilar entre 300.000 y 700.000, y puede ajustarse modificando el número de paquetes transmitidos numPackets. Tener el código MATLAB ® asociado a cada señal generada permite calcular y representar las figuras de mérito descritas en el capítulo anterior para analizar detalladamente la distorsión no lineal en señales WiFi. En los apartados siguientes, se especificará cómo se ha llevado a cabo el cálculo de cada una de las métricas utilizadas, explicando su formulación y su aplicación sobre las señales generadas. 4.1 Configuración de la señal ideal 21 Tabla 4.4 Configuración MCS según el estándar IEEE 802.11ax. MCS Modulación Tasa de código (r) 0 BPSK 1/2 1 QPSK 1/2 2 QPSK 3/4 3 16-QAM 1/2 4 16-QAM 3/4 5 64-QAM 2/3 6 64-QAM 3/4 7 64-QAM 5/6 8 256-QAM 3/4 9 256-QAM 5/6 10 1024-QAM 3/4 11 1024-QAM 5/6 Tabla 4.5 Configuración MCS según el estándar IEEE 802.11be. MCS Modulación Tasa de código (r) 0 BPSK 1/2 1 QPSK 1/2 2 QPSK 3/4 3 16-QAM 1/2 4 16-QAM 3/4 5 64-QAM 2/3 6 64-QAM 3/4 7 64-QAM 5/6 8 256-QAM 3/4 9 256-QAM 5/6 10 1024-QAM 3/4 11 1024-QAM 5/6 12 4096-QAM 3/4 13 4096-QAM 5/6 15 BPSK-DCM 1/2 4.1 Configuración de la señal ideal En esta sección se describe el proceso de generación de una señal conforme al estándar IEEE 802.11n, la cual se emplea como referencia para evaluar la distorsión no lineal introducida por el amplificador de potencia utilizado en el laboratorio. En primer lugar se crea el objeto htCfg utilizando wlanHTConfig , que es una función para configurar el formato de paquete de alta velocidad HT, definido en el estándar IEEE 802.11. Este objeto inicializa los parámetros necesarios para generar una trama en dicho formato. En este caso, se configura un ancho de banda de 20 MHz, una sola antena transmisora y un único flujo espacio-temporal, lo que corresponde a una configuración SISO. También se establece el MCS en 1. Se selecciona un tiempo de guarda largo (800 ns), se desactiva la agregación de tramas MPDU y se aplica el suavizado espectral recomendado para mejorar el comportamiento en frecuencia de la señal. Se fija una longitud de PSDU de 1024 bytes, que representa la carga útil de los datos a transmitir. Esto se recoge en el Código 4.1. Código 4.1 Formato del paquete a transmitir. %% Generating 802.11n/ac (OFDM) waveform % 802.11n/ac (OFDM) configuration htCfg = wlanHTConfig(’ChannelBandwidth’, ’CBW20’, ... 22 Capítulo 4. Generación de formas de onda de señales WiFi con MATLAB® ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... ’SpatialMapping’, ’Direct’, ... ’MCS’, 1, ... ’GuardInterval’, ’Long’, ... ’ChannelCoding’, ’BCC’, ... ’AggregatedMPDU’, false, ... ’RecommendSmoothing’, true, ... ’PSDULength’, 1024); En el Código 4.2, se genera la secuencia de bits que se va a utilizar como entrada para generar la señal OFDM. Para ello, se crea una secuencia pseudoaleatoria binaria (PN) usando un polinomio generador de grado 15 y una condición inicial con un único bit ‘1’. La longitud de la secuencia se calcula multiplicando el número de bits por paquetes (8 bits por cada uno de los 1024 bytes de la PSDU) por el número de paquetes que se desean transmitir. Código 4.2 Generación secuencia de bits. % input bit source: pn = comm.PNSequence(’Polynomial’, ’x15+x14+1’, ’InitialConditions’, [zeros(1, 14) 1]); pn.SamplesPerFrame = 8*htCfg.PSDULength*numPackets; in = pn(); Finalmente, en el Código 4.3 se genera la forma de onda OFDM correspondiente a la transmisión 802.11n (WiFi 4) utilizando la función de MATLAB ®wlanWaveformGenerator . Esta función recibe como entrada la secuencia de bits in y el objeto de configuración del paquete htCfg . Además, se especifica que deben generarse 6 paquetes consecutivos sin tiempo de inactividad entre ellos, utilizando un factor de sobremuestreo de 5 para obtener una mayor resolución temporal de la señal. La señal generada se guarda en la variable wf_wifi4_BW20_MCS1 . Finalmente, se calcula la frecuencia de muestreo utilizando la función wlanSampleRate, que tiene en cuenta tanto la configuración HT como el factor de sobremuestreo. Código 4.3 Generación forma de onda. ovs = 5; numPackets = 6; % Generation wf_wifi4_BW20_MCS1 = wlanWaveformGenerator(in, htCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(htCfg, ’OversamplingFactor’, ovs); Cuando ya se tiene la señal ideal creada con los parámetros seleccionados, se procede a realizar las medidas correspondientes en el laboratorio. El montaje utilizado se describe con detalle en el siguiente capítulo. Mediante el uso del generador vectorial de señal y del analizador vectorial de señal, conectados a un PC, se ha obtenido y almacenado en estructuras de MATLAB ® la información relativa a la potencia de entrada y salida del sistema, así como las señales transmitida y recibida. La señal transmitida ha sido previamente ajustada en amplitud para igualarla a la potencia que el equipamiento de laboratorio aplica durante el proceso de medida. Por otro lado, la señal recibida corresponde con la que ha sido medida directamente por el analizador de señal, a la que se le realiza un escalado para restar el efecto de las pérdidas en el camino que va desde el dispositivo hasta el equipo en los casos en que es necesario. En el Código 4.4 se muestran las instrucciones para cargar las medidas asociadas a una configuración en la que la señal se transmite a través de un cable coaxial, y una segunda configuración en la que se emplea un amplificador de potencia. 4.2 Figuras de mérito 23 Código 4.4 Medidas recogidas por los equipos del laboratorio. medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi4_BW20_MCS1.mat’); medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi4_BW20_MCS1.mat’); 4.2 Figuras de mérito En esta sección se detallan las métricas utilizadas para caracterizar la distorsión no lineal y que no se limita únicamente a las señales generadas idealmente en MATLAB ® . Estas mismas técnicas se aplican también cuando se realiza el análisis de las señales medidas experimentalmente, tanto tras el paso por el cable coaxial como a la salida del amplificador de potencia. 4.2.1 Máscara espectral Una vez generada la forma de onda correspondiente a un determinado estándar WiFi, se analiza su espectro para verificar que cumple con los requísitos regulatorios en cuanto a emisión fuera de banda. Para ello se construye una máscara espectral basada en los límites definidos por la especificación correspondiente, y se superpone sobre el espectro de la señal. Esta operación se realiza a partir del script generado por la herramienta Wireless Waveform Generator, activando en primer lugar el detector de picos en el analizador de espectro para localizar el valor máximo de potencia de la señal. Este valor, expresado en dBm, sirve como referencia para definir los niveles de potencia permitidos en diferentes rangos de frecuencia. A continuación, se crea una máscara simétrica centrada en la frecuencia portadora, estableciendo las frecuencias límite y sus correspondientes niveles máximos de potencia. En el Código 4.5 se muestra en los vectores llamados mask_freq y mask_power que significan, respectivamente, los desplazamientos en frecuencia (en Hz) y los niveles máximos admitidos de potencia (en dBm). Finalmente, se aplica la máscara al analizador de espectro activando la opción UpperMask , lo que permite representar visualmente los límites espectrales sobre el espectro de la señal generada. Código 4.5 Implementación de la máscara espectral sobre la señal ideal. spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi4_BW20_MCS1); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; 4.2.2 ACPR El ACPR es una métrica para evaluar el nivel de interferencia que una señal puede generar en los canales adyacentes, como se explica en el Capítulo 3. 30 Capítulo 5. Resultados experimentales el PA, el espectro se expande como consecuencia de la distorsión no lineal introducida por el dispositivo. No obstante, la señal continúa cumpliendo los límites establecidos por la máscara espectral del estándar. Figura 5.2 Espectro de la señal ideal. IEEE 802.11g BW20 MCS0. Figura 5.3 Espectro de la señal tras pasar por el cable. IEEE 802.11g BW20 MCS0. Figura 5.4 Espectro de la señal tras pasar por el amplificador. IEEE 802.11g BW20 MCS0. 5.3 Resultados experimentales 31 El mismo análisis se ha realizado para el caso de MCS =7 , cuyos resultados se muestran en la Figura 5.5, la Figura 5.6 y la Figura 5.7. En este caso también se observa el cumplimiento con la máscara espectral, a pesar del mayor orden de modulación. Figura 5.5 Espectro de la señal ideal. IEEE 802.11g BW20 MCS7. Figura 5.6 Espectro de la señal tras pasar por el cable. IEEE 802.11g BW20 MCS7. Figura 5.7 Espectro de la señal tras pasar por el amplificador. IEEE 802.11g BW20 MCS7. 32 Capítulo 5. Resultados experimentales Al analizar conjuntamente ambas configuraciones, se concluye que el orden del MCS no afecta significativamente a la distribución espectral de la señal. Es decir, tanto los esquemas de baja como de alta complejidad cumplen con la máscara espectral impuesta por la normativa, incluso tras el paso por el amplificador. Por tanto, con el objetivo de simplificar la presentación de resultados en los siguientes estándares, se reducirá el número de figuras mostradas, ya que en todos los casos se observa el mismo comportamiento espectral y se garantiza el cumplimiento de los requisitos reglamentarios. Se mostrarán solo figuras correspondientes a distintos anchos de banda utilizados, con el fin de ofrecer una visión representativa de las diferentes señales. Para las señales que utilizan un ancho de banda de 20 MHz, se ha calculado el ACPR, que cuantifica la relación entre la potencia que se produce en los canales adyacentes y la potencia del canal principal. Estos resultados se recogen en la Tabla 5.1 y en la Tabla 5.2, que representa la relación entre las potencias, expresada en dBc, para cada uno de los escenarios analizados. Tabla 5.1 ACPR de la señal IEEE 802.11g BW=20 MHz y MCS = 0. Escenario Canales −40 MHz −20 MHz 20 MHz 40 MHz Ideal −75.40 dBc −47.25 dBc −47.80 dBc −75.32 dBc Tras el cable −67.34 dBc −47.21 dBc −47.93 dBc −67.75 dBc Tras el amplificador −55.79 dBc −33.56 dBc −33.24 dBc −55.61 dBc Tabla 5.2 ACPR de la señal IEEE 802.11g BW = 20 MHz y MCS = 7. Escenario Canales −40 MHz −20 MHz 20 MHz 40 MHz Ideal −76.15 dBc −49.80 dBc −47.15 dBc −75.24 dBc Tras el cable −67.56 dBc −49.80 dBc −47.36 dBc −68.13 dBc Tras el amplificador −53.37 dBc −33.01 dBc −32.47 dBc −54.31 dBc Los resultados de PAPR para las distintas configuraciones se recogen en la Tabla 5.3. Se puede observar una reducción significativa del valor de esta métrica tras el paso por el PA, indicando la compresión de los picos. Tabla 5.3 PAPR. IEEE 802.11g. BW MCS PAPR de la señal ideal (dB) PAPR de la señal tras el cable (dB) PAPR de la señal tras el PA (dB) 20 MHz 0 11.82 11.56 4.91 20 MHz 7 11.43 11.60 5.73 Otro aspecto relevante en los resultados es la sincronización de las señales. En la Figura 5.8 se muestra un caso en el que las señales están correctamente sincronizadas, evidenciado por la coincidencia muestra a muestra. Además, en la subfigura (b), se puede observar claramente la compresión de los picos mencionada anteriormente, responsable de la reducción en el valor del PAPR. Sin embargo, en la Figura 5.9 (b) se observa cómo las señales no están completamente sincronizadas. En este caso, se han mostrado todos los resultados obtenidos para ilustrar cómo afecta este desajuste a las métricas de calidad. No obstante, a partir de este punto, se excluirán del análisis aquellas señales que no estén correctamente alineadas. Los valores obtenidos para el NMSE en las dos configuraciones, se muestran en la Tabla 5.4. Para el caso del MCS =0 , se obtiene un NMSE =−18.70 dB, un valor elevado que refleja claramente la distorsión no lineal introducida al atravesar el PA. En cambio, para MCS =7 , se obtiene un NMSE de −13.02 dB, también elevado, pero en este caso es debido principalmente a la desincronización entre la señal transmitida y la recibida, lo que invalida la interpretación de este resultado. 5.3 Resultados experimentales 33 (a) (b) Figura 5.8 Sincronización de las señales. IEEE 802.11g BW20 MCS0. (a) (b) Figura 5.9 Sincronización de las señales. IEEE 802.11g BW20 MCS7. Tabla 5.4 NMSE. IEEE 802.11g. BW MCS NMSE de la señal tras el cable (dB) NMSE de la señal tras el PA (dB) 20 MHz 0 −30.29 −18.69 20 MHz 7 −30.34 −13.02 Tabla 5.5 EVM. IEEE 802.11g. BW MCS EVM de la señal ideal (%) EVM de la señal tras el cable (%) EVM de la señal tras el PA (%) 20 MHz 0 0.16 4.22 11.13 20 MHz 7 0.17 4.26 10.69 Para evaluar el EVM en estas configuraciones, los resultados se recogen en la Tabla 5.5. Como puede observarse, el valor de EVM aumenta de forma significativa tras el paso por el PA, reflejando la degradación de la señal. Además, en la Figura 5.10 se muestran las constelaciones de las señales correspondientes a MCS =0 en dos de los escenarios estudiados: tras el cable y tras el amplificador. En dicha figura, que corresponde a una modulación BPSK, también se incluye en color rojo y con el símbolo ‘+’, la constelación ideal como referencia. Se observa cómo los puntos de la constelación están perfectamente definidos en el escenario ideal, 34 Capítulo 5. Resultados experimentales y apenas sufren alteraciones tras pasar por el cable, aunque es posible que se haya introducido un ligero offset en frecuencia. Sin embargo, tras el paso por el amplificador, los puntos muestran una dispersión similar al efecto del ruido AWGN, como resultado de la distorsión no lineal introducida por el mismo. (a) (b) Figura 5.10 Constelación de la señal en los escenarios experimentales. IEEE 802.11g BW20 MCS0. Por último, en la Figura 5.11 y la Figura 5.12 se representan las características AM-AM y AM-PM para ambas configuraciones analizadas de IEEE 802.11g. Cada figura incluye cuatro subgráficas: la subfigura (a) muestra la característica AM-AM, donde se representa la amplitud de la potencia de salida en función de la amplitud de la potencia de entrada; la subfigura (b) representa la característica AM-AM normalizada; (a) (b) (c) (d) Figura 5.11 Características AM-AM y AM-PM. IEEE 802.11g BW20 MCS0. 5.3 Resultados experimentales 35 la subfigura (c) muestra la potencia de entrada frente a la ganancia del sistema, lo que permite identificar visualmente el punto de compresión; y la subfigura (d) representa la característica AM-PM, es decir, la variación de fase introducida por el amplificador en función de la potencia de entrada. En el caso MCS =0 (Figura 5.11), se observa en las subfiguras (a) y (b) una compresión progresiva conforme aumenta la potencia de la señal de entrada, indicativa del régimen no lineal del amplificador. La subfigura (c) confirma este efecto con una caída de ganancia. Gracias a estas figuras se puede identificar el punto de saturación aproximadamente cuando la potencia de entrada alcanza los −15 dBm y la de salida los 35 dBm. A partir de este punto, para el resto de señales estudiadas en este trabajo, estas figuras presentarán una forma similar, siempre que las señales estén correctamente sincronizadas. Por otro lado, para la configuración MCS =7 (Figura 5.12), las señales no se encuentran sincronizadas, por lo que los resultados no reflejan con fiabilidad la respuesta real del sistema. La dispersión observada en las cuatro gráficas no puede atribuirse con certeza a la distorsión no lineal del PA, sino que es resultado de la falta de alineación temporal entre la señal transmitida y la recibida. Dado este problema, los resultados obtenidos para esta configuración deben considerarse no representativos. Las figuras confirman que, en estas condiciones, el sistema no está funcionando correctamente. (a) (b) (c) (d) Figura 5.12 Características AM-AM y AM-PM. IEEE 802.11g BW20 MCS7. 5.3.2 IEEE 802.11n Para este estándar IEEE 802.11n, se han generado y analizado señales con anchos de banda de 20 MHz y 40 MHz, utilizando distintas configuraciones de MCS. Se ha incluido el espectro de la señal con un ancho de banda de 20 MHz, ya que la definición de la máscara espectral cambia con respecto al estándar anterior. Este caso, se muestra en la Figura 5.13 y en la Figura 5.14. Asimismo, en la Figura 5.15 y la Figura 5.16 se representa el espectro de la señal con un ancho de banda de 40 MHz y MCS = 2, tanto en condiciones ideales como tras atravesar el amplificador. En la figura ideal, la ocupación espectral es clara y se ajusta a lo esperado para este tipo de señal. Sin embargo, tras el paso 36 Capítulo 5. Resultados experimentales por el PA, se aprecia una expansión notable del espectro, especialmente en los bordes, como resultado de la distorsión no lineal, pero sin sobrepasar los límites establecidos para la máscara espectral. Figura 5.13 Espectro de la señal ideal. IEEE 802.11n BW20 MCS7. Figura 5.14 Espectro de la señal tras pasar por el amplificador. IEEE 802.11n BW20 MCS7. Figura 5.15 Espectro de la señal ideal. IEEE 802.11n BW40 MCS2. 5.3 Resultados experimentales 37 Figura 5.16 Espectro de la señal tras pasar por el amplificador. IEEE 802.11n BW40 MCS2. En la Tabla 5.6 y en la Tabla 5.7 se presentan los resultados de ACPR para las señales que emplean el ancho de banda de 20 MHz y configuraciones MCS =1 y MCS =7 , respectivamente. En ambos casos, se puede observar un aumento significativo de potencia en los canales adyacentes tras el paso por el amplificador, en comparación con los escenarios ideal y con el cable. Tabla 5.6 ACPR de la señal WiFi 4 BW = 20 MHz y MCS = 1. Escenario Canales −40 MHz −20 MHz 20 MHz 40 MHz Ideal −74.90 dBc −47.07 dBc −46.03 dBc −74.36 dBc Tras el cable −68.15 dBc −47.00 dBc −46.16 dBc −68.48 dBc Tras el amplificador −52.72 dBc −31.27 dBc −31.84 dBc −53.52 dBc Tabla 5.7 ACPR de la señal WiFi 4 BW = 20 MHz y MCS = 7. Escenario Canales −40 MHz −20 MHz 20 MHz 40 MHz Ideal −75.11 dBc −46.67 dBc −46.34 dBc −75.18 dBc Tras el cable −67.06 dBc −46.82 dBc −46.58 dBc −67.42 dBc Tras el amplificador −53.16 dBc −32.06 dBc −31.82 dBc −54.09 dBc Los valores de PAPR obtenidos para este estándar se recogen en la Tabla 5.8. Al igual que en el estándar anterior, se observa una reducción significativa del valor de PAPR tras el paso por el PA, indicando la compresión de los picos de la señal. Además, este efecto se aprecia también a nivel numérico, ya que los valores estimados de PAPR en condiciones ideales suele situarse entre los 10 y 13 dB, mientras que tras la amplificación descienden a un rango medio comprendido entre los 5 y 6 dB, confirmando así que el amplificador limita la dinámica de la señal. Tabla 5.8 PAPR. IEEE 802.11n. BW MCS PAPR de la señal ideal (dB) PAPR de la señal tras el cable (dB) PAPR de la señal tras el PA (dB) 20 MHz 1 10.38 10.33 4.84 20 MHz 7 10.95 10.85 5.01 40 MHz 2 11.47 11.72 5.40 40 MHz 7 10.92 10.88 6.36 38 Capítulo 5. Resultados experimentales Los resultados de NMSE obtenidos para las distintas configuraciones del estándar IEEE 802.11n se recogen en la Tabla 5.9. De forma general, se observa una degradación significativa del valor de NMSE tras el paso por el amplificador, en comparación con el escenario intermedio (tras el cable). Esta tendencia se mantiene tanto para señales con anchos de banda de 20 MHz como de 40 MHz, siendo el valor de esta figura de mérito aproximadamente de −18 dB. Tabla 5.9 NMSE. IEEE 802.11n. BW MCS NMSE de la señal tras el cable (dB) NMSE de la señal tras el PA (dB) 20 MHz 1 -30.26 -18.79 20 MHz 7 -24.49 -17.98 40 MHz 2 -29.84 -18.11 Del mismo modo, en la Tabla 5.10 se muestran los valores de EVM correspondientes. Al igual que con el NMSE, se observa un aumento considerable del EVM después de la amplificación, lo que refleja una pérdida de precisión en la representación de los símbolos modulados. Tabla 5.10 EVM. IEEE 802.11n. BW MCS EVM de la señal ideal (%) EVM de la señal tras el cable (%) EVM de la señal tras el PA (%) 20 MHz 1 0.40 4.21 11.69 20 MHz 7 0.44 4.23 11.00 40 MHz 2 0.02 4.32 11.79 5.3.3 IEEE 802.11ac En esta sección se analizan los resultados obtenidos para las señales correspondientes al estándar IEEE 802.11ac. este estándar introduce mejoras en el rendimiento mediante la utilización de anchos de banda mayores, como 80 MHz, y esquemas de modulación más avanzados. Al igual que en los casos anteriores, se han evaluado distinas combinaciones de anchos de banda y MCS, con el objetivo de estudiar cómo se ven afectadas por la distorsión no lineal producida por el PA. En la Figura 5.17 y en la Figura 5.18 se representa el espectro de una señal de WiFi 5 con un ancho de banda de 80 MHz y MCS =9 , tanto en condiciones ideales como tras pasar por el amplificador. En estos casos en los que el ancho de banda es mayor de 20 MHz, no es posible observar los canales adyacentes en el espectro, ya que la máxima tasa de muestreo del analizador vectorial de señal, de 100 MHz, no lo permite. Por ello, tampoco es posible calcular el ACPR en estos casos. Los valores de PAPR obtenidos para las distintas configuraciones se recogen en la Tabla 5.11. Al igual que en los estándares anteriores y por el mismo motivo, se observa una reducción de esta métrica tras el paso por el PA. Tabla 5.11 PAPR. IEEE 802.11ac. BW MCS PAPR de la señal ideal (dB) PAPR de la señal tras el cable (dB) PAPR de la señal tras el PA (dB) 40 MHz 3 10.99 11.01 5.50 40 MHz 9 11.06 10.99 5.60 80 MHz 4 10.69 10.67 7.30 80 MHz 9 10.49 10.58 6.71 En cuanto a los resultados de NMSE, que se presentan en la Tabla 5.12, se observa un aumento generalizado del error tras la amplificación. Las configuraciones con modulación de orden superior y mayor ancho de 5.3 Resultados experimentales 39 Figura 5.17 Espectro de la señal ideal. IEEE 802.11ac BW80 MCS9. Figura 5.18 Espectro de la señal tras pasar por el amplificador. IEEE 802.11ac BW80 MCS9. banda muestran los mayores niveles de error, lo que confirma la mayor vulnerabilidad de estas señales ante efectos no lineales. Tabla 5.12 NMSE. IEEE 802.11ac. BW MCS NMSE de la señal tras el cable (dB) NMSE de la señal tras el PA (dB) 40 MHz 3 -29.84 -17.79 40 MHz 9 -29.84 -17.81 80 MHz 9 -19.78 -16.91 En la Tabla 5.13 se recogen los valores de EVM obtenidos experimentalmente para distintas configuraciones de este estándar. A modo de ejemplo, para interpretar adecuadamente estos resultados, se deben considerar los límites máximos de error relativo de la constelación definidos por la normativa del estándar [ 8 ], los cuales varían en función del tipo de modulación y esquema de codificación utilizado. Esta métrica es equivalente al EVM, ya que ambas cuantifican el mismo efecto, la dispersión de los símbolos recibidos respecto a sus posiciones ideales en la constelación [19]. Apéndice A Códigos utilizados Para complementar la información de los capítulos anteriores, se incluyen los códigos de las 16 señales generadas en MATLAB®. Código A.1 wifi802_11ag_BW20_MCS0.m. clear, close all %% Generating 802.11a/g/j (OFDM) waveform % 802.11a/g/j (OFDM) configuration nonHTCfg = wlanNonHTConfig(’Modulation’, ’OFDM’, ... ’ChannelBandwidth’, ’CBW20’, ... ’MCS’, 0, ... ’PSDULength’, 1000); ovs = 5; numPackets = 3; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*nonHTCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi802_11ag_BW20_MCS0 = wlanWaveformGenerator(in, nonHTCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(nonHTCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz % save(’formas de onda/wf_wifi802_11ag_BW20_MCS0.mat’, ’ wf_wifi802_11ag_BW20_MCS0’) % SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi802_11ag_BW20_MCS0); % % MÁSCARA ESPECTRAL 47 48 Appendix A. Códigos utilizados % spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_ideal); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9; 11; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; % spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % % ACPR spectrum_ideal.ChannelMeasurements.Type = "acpr"; spectrum_ideal.ChannelMeasurements.Enabled = true; spectrum_ideal.ChannelMeasurements.NumOffsets = 2; spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_ideal); acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper; spectrum_ideal.Name = ’Espectro de la señal 802.11a/g ideal. BW = 20 MHz. MCS = 0.’; spectrum_ideal.Title = ’Espectro de la señal 802.11a/g ideal. BW = 20 MHz. MCS = 0.’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi802_11ag_BW20_MCS0))/rms( wf_wifi802_11ag_BW20_MCS0)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi802_11ag_BW20_MCS0.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL % spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_cable); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9; 11; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; 49 % spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; % %ACPR spectrum_cable.ChannelMeasurements.Type = "acpr"; spectrum_cable.ChannelMeasurements.Enabled = true; spectrum_cable.ChannelMeasurements.NumOffsets = 2; spectrum_cable.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_cable); acprvaluesLower_cable = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_cable = data.ChannelMeasurements.ACPRUpper; spectrum_cable.Name = ’Espectro de la señal 802.11a/g tras el cable. BW = 20 MHz. MCS = 0’; spectrum_cable.Title = ’Espectro de la señal 802.11a/g tras el cable. BW = 20 MHz. MCS = 0’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi802_11ag_BW20_MCS0.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL % spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los m áximos de la señal % data = getMeasurementsData(spectrum_amplif); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9; 11; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; % spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; % %ACPR 50 Appendix A. Códigos utilizados spectrum_amplif.ChannelMeasurements.Type = "acpr"; spectrum_amplif.ChannelMeasurements.Enabled = true; spectrum_amplif.ChannelMeasurements.NumOffsets = 2; spectrum_amplif.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_amplif); acprvaluesLower_amplif = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_amplif = data.ChannelMeasurements.ACPRUpper; fprintf(’ACPR ideal: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_ideal(1), acprvaluesLower_ideal(2), ... acprvaluesUpper_ideal(1), acprvaluesUpper_ideal(2)); fprintf(’ACPR cable: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_cable(1), acprvaluesLower_cable(2), ... acprvaluesUpper_cable(1), acprvaluesUpper_cable(2)); fprintf(’ACPR amplificador: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz = %.4f\n ’, ... acprvaluesLower_amplif(1), acprvaluesLower_amplif(2), ... acprvaluesUpper_amplif(1), acprvaluesUpper_amplif(2)); spectrum_amplif.Name = ’Espectro de la señal 802.11a/g tras el amplificador. BW = 20 MHz. MCS = 0’; spectrum_amplif.Title = ’Espectro de la señal 802.11a/g tras el amplificador. BW = 20 MHz. MCS = 0’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) 51 % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(nonHTCfg); LenSymbol = str_index.NonHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi802_11ag_BW20_MCS0(1+((i-1)*LenSymbol):(i*LenSymbol )),chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) 52 Appendix A. Códigos utilizados figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5, 1.5]); % % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(nonHTCfg); LenSymbol = str_index.NonHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); 53 end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5, 1.5]); % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(nonHTCfg); LenSymbol = str_index.NonHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; 54 Appendix A. Códigos utilizados [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5, 1.5]); Código A.2 wifi802_11ag_BW20_MCS7.m. clear, close all %% Generating 802.11a/g/j (OFDM) waveform % 802.11a/g/j (OFDM) configuration nonHTCfg = wlanNonHTConfig(’Modulation’, ’OFDM’, ... ’ChannelBandwidth’, ’CBW20’, ... ’MCS’, 7, ... ’PSDULength’, 1000); ovs = 5; numPackets = 24; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*nonHTCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi802_11ag_BW20_MCS7 = wlanWaveformGenerator(in, nonHTCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(nonHTCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz %save(’formas de onda/wf_wifi802_11ag_BW20_MCS7.mat’, ’ wf_wifi802_11ag_BW20_MCS7’) %% SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); 55 spectrum_ideal(wf_wifi802_11ag_BW20_MCS7); % MÁSCARA ESPECTRAL % spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_ideal); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9; 11; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; % spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_ideal.ChannelMeasurements.Type = "acpr"; spectrum_ideal.ChannelMeasurements.Enabled = true; spectrum_ideal.ChannelMeasurements.NumOffsets = 2; spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_ideal); acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper; spectrum_ideal.Name = ’Espectro de la señal 802.11a/g ideal. BW = 20 MHz. MCS = 7’; spectrum_ideal.Title = ’Espectro de la señal 802.11a/g ideal. BW = 20 MHz. MCS = 7’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi802_11ag_BW20_MCS7))/rms( wf_wifi802_11ag_BW20_MCS7)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) % % SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi802_11ag_BW20_MCS7.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL % spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_cable); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9; 11; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; 62 Appendix A. Códigos utilizados %% SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi4_BW20_MCS1); % % MÁSCARA ESPECTRAL % spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_ideal); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % % Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; % spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_ideal.ChannelMeasurements.Type = "acpr"; spectrum_ideal.ChannelMeasurements.Enabled = true; spectrum_ideal.ChannelMeasurements.NumOffsets = 2; spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_ideal); acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper; spectrum_ideal.Name = ’Espectro de la señal WiFi 4 ideal. BW = 20 MHz. MCS = 1’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 4 ideal. BW = 20 MHz. MCS = 1 ’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi4_BW20_MCS1))/rms(wf_wifi4_BW20_MCS1)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi4_BW20_MCS1.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL % spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_cable); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; 63 % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; % spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_cable.ChannelMeasurements.Type = "acpr"; spectrum_cable.ChannelMeasurements.Enabled = true; spectrum_cable.ChannelMeasurements.NumOffsets = 2; spectrum_cable.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_cable); acprvaluesLower_cable = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_cable = data.ChannelMeasurements.ACPRUpper; spectrum_cable.Name = ’Espectro de la señal WiFi 4 tras el cable. BW = 20 MHz. MCS = 1’; spectrum_cable.Title = ’Espectro de la señal WiFi 4 tras el cable. BW = 20 MHz. MCS = 1’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi4_BW20_MCS1.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); %MÁSCARA ESPECTRAL % spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los m áximos de la señal % data = getMeasurementsData(spectrum_amplif); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % 64 Appendix A. Códigos utilizados % spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; % spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; %ACPR spectrum_amplif.ChannelMeasurements.Type = "acpr"; spectrum_amplif.ChannelMeasurements.Enabled = true; spectrum_amplif.ChannelMeasurements.NumOffsets = 2; spectrum_amplif.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_amplif); acprvaluesLower_amplif = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_amplif = data.ChannelMeasurements.ACPRUpper; fprintf(’ACPR ideal: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_ideal(1), acprvaluesLower_ideal(2), ... acprvaluesUpper_ideal(1), acprvaluesUpper_ideal(2)); fprintf(’ACPR cable: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_cable(1), acprvaluesLower_cable(2), ... acprvaluesUpper_cable(1), acprvaluesUpper_cable(2)); fprintf(’ACPR amplificador: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz = %.4f\n ’, ... acprvaluesLower_amplif(1), acprvaluesLower_amplif(2), ... acprvaluesUpper_amplif(1), acprvaluesUpper_amplif(2)); spectrum_amplif.Name = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 20 MHz. MCS = 1’; spectrum_amplif.Title = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 20 MHz. MCS = 1’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) %Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador 65 NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi4_BW20_MCS1(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); 66 Appendix A. Códigos utilizados valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); 67 IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); 68 Appendix A. Códigos utilizados % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.4 wifi4_BW20_MCS7.m. clear, close all %% Generating 802.11n/ac (OFDM) waveform % 802.11n/ac (OFDM) configuration htCfg = wlanHTConfig(’ChannelBandwidth’, ’CBW20’, ... ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... ’SpatialMapping’, ’Direct’, ... ’MCS’, 7, ... ’GuardInterval’, ’Long’, ... ’ChannelCoding’, ’BCC’, ... ’AggregatedMPDU’, false, ... ’RecommendSmoothing’, true, ... ’PSDULength’, 1024); ovs = 5; numPackets = 30; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x15+x14+1’, ’InitialConditions’, [zeros(1, 14) 1]); pn.SamplesPerFrame = 8*htCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi4_BW20_MCS7 = wlanWaveformGenerator(in, htCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); 69 Fs = wlanSampleRate(htCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz %save(’formas de onda/wf_wifi4_BW20_MCS7.mat’, ’wf_wifi4_BW20_MCS7’) %% SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi4_BW20_MCS7); % MÁSCARA ESPECTRAL % spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_ideal); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % % Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; % spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_ideal.ChannelMeasurements.Type = "acpr"; spectrum_ideal.ChannelMeasurements.Enabled = true; spectrum_ideal.ChannelMeasurements.NumOffsets = 2; spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_ideal); acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper; spectrum_ideal.Name = ’Espectro de la señal WiFi 4 ideal. BW = 20 MHz. MCS = 7’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 4 ideal. BW = 20 MHz. MCS = 7 ’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi4_BW20_MCS7))/rms(wf_wifi4_BW20_MCS7)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi4_BW20_MCS7.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL % spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_cable); 70 Appendix A. Códigos utilizados % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % % Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; % spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_cable.ChannelMeasurements.Type = "acpr"; spectrum_cable.ChannelMeasurements.Enabled = true; spectrum_cable.ChannelMeasurements.NumOffsets = 2; spectrum_cable.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_cable); acprvaluesLower_cable = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_cable = data.ChannelMeasurements.ACPRUpper; spectrum_cable.Name = ’Espectro de la señal WiFi 4 tras el cable. BW = 20 MHz. MCS = 7’; spectrum_cable.Title = ’Espectro de la señal WiFi 4 tras el cable. BW = 20 MHz. MCS = 7’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi4_BW20_MCS7.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL % spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los m áximos de la señal % data = getMeasurementsData(spectrum_amplif); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda 71 % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; % spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; %ACPR spectrum_amplif.ChannelMeasurements.Type = "acpr"; spectrum_amplif.ChannelMeasurements.Enabled = true; spectrum_amplif.ChannelMeasurements.NumOffsets = 2; spectrum_amplif.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_amplif); acprvaluesLower_amplif = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_amplif = data.ChannelMeasurements.ACPRUpper; fprintf(’ACPR ideal: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_ideal(1), acprvaluesLower_ideal(2), ... acprvaluesUpper_ideal(1), acprvaluesUpper_ideal(2)); fprintf(’ACPR cable: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_cable(1), acprvaluesLower_cable(2), ... acprvaluesUpper_cable(1), acprvaluesUpper_cable(2)); fprintf(’ACPR amplificador: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz = %.4f\n ’, ... acprvaluesLower_amplif(1), acprvaluesLower_amplif(2), ... acprvaluesUpper_amplif(1), acprvaluesUpper_amplif(2)); spectrum_amplif.Name = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 20 MHz. MCS = 7’; spectrum_amplif.Title = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 20 MHz. MCS = 7’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) %Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); 78 Appendix A. Códigos utilizados PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets 79 % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi4_BW40_MCS2(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; 80 Appendix A. Códigos utilizados evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; 81 sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.6 wifi4_BW40_MCS7.m. clear, close all %% Generating 802.11n/ac (OFDM) waveform % 802.11n/ac (OFDM) configuration htCfg = wlanHTConfig(’ChannelBandwidth’, ’CBW40’, ... ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... 82 Appendix A. Códigos utilizados ’SpatialMapping’, ’Direct’, ... ’MCS’, 7, ... ’GuardInterval’, ’Long’, ... ’ChannelCoding’, ’BCC’, ... ’AggregatedMPDU’, false, ... ’RecommendSmoothing’, true, ... ’PSDULength’, 1024); ovs = 2; numPackets = 66; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x15+x14+1’, ’InitialConditions’, [zeros(1, 14) 1]); pn.SamplesPerFrame = 8*htCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi4_BW40_MCS7 = wlanWaveformGenerator(in, htCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(htCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz %save(’formas de onda/wf_wifi4_BW40_MCS7.mat’, ’wf_wifi4_BW40_MCS7’) % SENAL IDEAL %Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi4_BW40_MCS7); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_ideal.Name = ’Espectro de la señal WiFi 4 ideal. BW = 40 MHz. MCS = 7’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 4 ideal. BW = 40 MHz. MCS = 7 ’; show(spectrum_ideal) 83 % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi4_BW40_MCS7))/rms(wf_wifi4_BW40_MCS7)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi4_BW40_MCS7.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_cable); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_cable.Name = ’Espectro de la señal WiFi 4 tras el cable. BW = 40 MHz. MCS = 7’; spectrum_cable.Title = ’Espectro de la señal WiFi 4 tras el cable. BW = 40 MHz. MCS = 7’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi4_BW40_MCS7.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL 84 Appendix A. Códigos utilizados spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_amplif); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_amplif.Name = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 40 MHz. MCS = 7’; spectrum_amplif.Title = ’Espectro de la señal WiFi 4 tras el amplificador. BW = 40 MHz. MCS = 7’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform 85 % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi4_BW40_MCS7(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) 86 Appendix A. Códigos utilizados % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) 87 figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(htCfg); LenSymbol = str_index.HTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end 94 Appendix A. Códigos utilizados for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.8 wifi5_BW40_MCS9.m. clear, close all %% Generating 802.11n/ac (OFDM) waveform % 802.11n/ac (OFDM) configuration vhtCfg = wlanVHTConfig(’ChannelBandwidth’, ’CBW40’, ... ’NumUsers’, 1, ... ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... ’SpatialMapping’, ’Direct’, ... ’STBC’, false, ... ’MCS’, 9, ... ’ChannelCoding’, ’BCC’, ... ’APEPLength’, 1024, ... ’GuardInterval’, ’Long’, ... ’GroupID’, 63, ... ’PartialAID’, 275); ovs = 2; 95 numPackets = 70; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*vhtCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi5_BW40_MCS9 = wlanWaveformGenerator(in, vhtCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(vhtCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz %save(’formas de onda/wf_wifi5_BW40_MCS9.mat’, ’wf_wifi5_BW40_MCS9’) %% SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi5_BW40_MCS9); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_ideal.Name = ’Espectro de la señal WiFi 5 ideal. BW = 40 MHz. MCS = 9’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 5 ideal. BW = 40 MHz. MCS = 9 ’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi5_BW40_MCS9))/rms(wf_wifi5_BW40_MCS9)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi5_BW40_MCS9.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); 96 Appendix A. Códigos utilizados spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_cable); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_cable.Name = ’Espectro de la señal WiFi 5 tras el cable. BW = 40 MHz. MCS = 9’; spectrum_cable.Title = ’Espectro de la señal WiFi 5 tras el cable. BW = 40 MHz. MCS = 9’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi5_BW40_MCS9.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_amplif); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; 97 mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_amplif.Name = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 40 MHz. MCS = 9’; spectrum_amplif.Title = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 40 MHz. MCS = 9’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); 98 Appendix A. Códigos utilizados chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi5_BW40_MCS9(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); 99 % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador 100 Appendix A. Códigos utilizados %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; 101 plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.9 wifi5_BW80_MCS4.m. clear, close all %% Generating 802.11n/ac (OFDM) waveform % 802.11n/ac (OFDM) configuration vhtCfg = wlanVHTConfig(’ChannelBandwidth’, ’CBW80’, ... ’NumUsers’, 1, ... ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... ’SpatialMapping’, ’Direct’, ... ’STBC’, false, ... ’MCS’, 4, ... ’ChannelCoding’, ’BCC’, ... ’APEPLength’, 1024, ... ’GuardInterval’, ’Long’, ... ’GroupID’, 63, ... ’PartialAID’, 275); ovs = 1; numPackets = 75; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*vhtCfg.PSDULength*numPackets; in = pn(); % Generation wf_wifi5_BW80_MCS4 = wlanWaveformGenerator(in, vhtCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(vhtCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz %save(’formas de onda/wf_wifi5_BW80_MCS4.mat’, ’wf_wifi5_BW80_MCS4’) % SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi5_BW80_MCS4); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; 102 Appendix A. Códigos utilizados Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 39.5; 40.5; 80; 120] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_ideal.Name = ’Espectro de la señal WiFi 5 ideal. BW = 80 MHz. MCS = 4’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 5 ideal. BW = 80 MHz. MCS = 4 ’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi5_BW80_MCS4))/rms(wf_wifi5_BW80_MCS4)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi5_BW80_MCS4.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_cable); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 39.5; 40.5; 80; 120] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_cable.Name = ’Espectro de la señal WiFi 5 tras el cable. BW = 80 MHz. MCS = 4’; spectrum_cable.Title = ’Espectro de la señal WiFi 5 tras el cable. BW = 80 MHz. MCS = 4’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; 103 yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi5_BW80_MCS4.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_amplif); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 39.5; 40.5; 80; 120] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_amplif.Name = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 80 MHz. MCS = 4’; spectrum_amplif.Title = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 80 MHz. MCS = 4’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); 110 Appendix A. Códigos utilizados spectrum_amplif.Name = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 80 MHz. MCS = 9’; spectrum_amplif.Title = ’Espectro de la señal WiFi 5 tras el amplificador. BW = 80 MHz. MCS = 9’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW80’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); 111 LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi5_BW80_MCS9(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); 112 Appendix A. Códigos utilizados chanBW = ’CBW80’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); 113 % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW80’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(vhtCfg); LenSymbol = str_index.VHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) 114 Appendix A. Códigos utilizados Código A.11 wifi6_BW40_MCS8.m. clear, close all %% Generating 802.11ax waveform % 802.11ax configuration heSUCfg = wlanHESUConfig(’ChannelBandwidth’, ’CBW40’, ... ’NumTransmitAntennas’, 1, ... ’NumSpaceTimeStreams’, 1, ... ’SpatialMapping’, ’Direct’, ... ’PreHESpatialMapping’, false, ... ’MCS’, 8, ... ’ChannelCoding’, ’LDPC’, ... ’APEPLength’, 100, ... ’GuardInterval’, 3.2, ... ’HELTFType’, 4, ... ’UplinkIndication’, false, ... ’BSSColor’, 0, ... ’SpatialReuse’, 0, ... ’TXOPDuration’, 127, ... ’HighDoppler’, false, ... ’NominalPacketPadding’, 0); ovs = 2; numPackets = 76; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x15+x14+1’, ’InitialConditions’, [zeros(1, 14) 1]); pn.SamplesPerFrame = 8*getPSDULength(heSUCfg)*numPackets; in = pn(); % Generation wf_wifi6_BW40_MCS8 = wlanWaveformGenerator(in, heSUCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(heSUCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz % RU Assignment and Allocated Subcarriers %showAllocation(heSUCfg); %save(’formas de onda/wf_wifi6_BW40_MCS8.mat’, ’wf_wifi6_BW40_MCS8’) %% SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi6_BW40_MCS8); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; 115 Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_ideal.Name = ’Espectro de la señal WiFi 6 ideal. BW = 40 MHz. MCS = 8’ ; spectrum_ideal.Title = ’Espectro de la señal WiFi 6 ideal. BW = 40 MHz. MCS = 8 ’; show(spectrum_ideal) % PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi6_BW40_MCS8))/rms(wf_wifi6_BW40_MCS8)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi6_BW40_MCS8.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_cable); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_cable.Name = ’Espectro de la señal WiFi 6 tras el cable. BW = 40 MHz. MCS = 8’; spectrum_cable.Title = ’Espectro de la señal WiFi 6 tras el cable. BW = 40 MHz. MCS = 8’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; 116 Appendix A. Códigos utilizados yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight %% SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi6_BW40_MCS8.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % MÁSCARA ESPECTRAL spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_amplif); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 19.5; 20.5; 40; 60] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; spectrum_amplif.Name = ’Espectro de la señal WiFi 6 tras el amplificador. BW = 40 MHz. MCS = 8’; spectrum_amplif.Title = ’Espectro de la señal WiFi 6 tras el amplificador. BW = 40 MHz. MCS = 8’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); 117 % NMSE cable NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(heSUCfg); LenSymbol = str_index.HEData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi6_BW40_MCS8(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); 118 Appendix A. Códigos utilizados IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’); hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’, 1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(heSUCfg); LenSymbol = str_index.HEData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; 119 detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(heSUCfg); LenSymbol = str_index.HEData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); 126 Appendix A. Códigos utilizados % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW40’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(heSUCfg); LenSymbol = str_index.HEData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, 127 plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.13 wifi7_BW20_MCS10.m. clear, close all %% Generating 802.11be waveform % 802.11be configuration ehtSUCfg = wlanEHTMUConfig(’CBW20’, ’NumUsers’, 1, ’PuncturedChannelFieldValue’ , 0, ’EHTDUPMode’, 0, ... ’NumTransmitAntennas’, 1, ... ’GuardInterval’, 1.6, ... ’EHTLTFType’, 2, ... ’NumExtraEHTLTFSymbols’, 0, ... ’EHTSIGMCS’, 0, ... ’UplinkIndication’, 0, ... ’BSSColor’, 0, ... ’SpatialReuse’, 0, ... ’TXOPDuration’, []); % RU config object(s) ehtSUCfg.RU{1}.PowerBoostFactor = 1; ehtSUCfg.RU{1}.SpatialMapping = ’direct’; % User config object(s) ehtSUCfg.User{1}.APEPLength = 100; ehtSUCfg.User{1}.MCS = 10; ehtSUCfg.User{1}.NumSpaceTimeStreams = 1; ehtSUCfg.User{1}.ChannelCoding = ’ldpc’; ehtSUCfg.User{1}.STAID = 0; ehtSUCfg.User{1}.NominalPacketPadding = 0; ovs = 5; numPackets = 55; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*psduLength(ehtSUCfg)*numPackets; in = pn(); % Generation wf_wifi7_BW20_MCS10 = wlanWaveformGenerator(in, ehtSUCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(ehtSUCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz % RU Assignment and Allocated Subcarriers 128 Appendix A. Códigos utilizados showAllocation(ehtSUCfg); %save(’formas de onda/wf_wifi7_BW20_MCS10.mat’, ’wf_wifi7_BW20_MCS10’) % SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi7_BW20_MCS10); % % MÁSCARA ESPECTRAL % spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_ideal); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; % spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_ideal.ChannelMeasurements.Type = "acpr"; spectrum_ideal.ChannelMeasurements.Enabled = true; spectrum_ideal.ChannelMeasurements.NumOffsets = 2; spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_ideal); acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper; spectrum_ideal.Name = ’Espectro de la señal WiFi 7 ideal. BW = 20 MHz. MCS = 10 ’; spectrum_ideal.Title = ’Espectro de la señal WiFi 7 ideal. BW = 20 MHz. MCS = 10’; show(spectrum_ideal) %PAPR PAPR_ideal = 20*log10(max(abs(wf_wifi7_BW20_MCS10))/rms(wf_wifi7_BW20_MCS10)); fprintf(’El valor de PAPR es %.4f\n’, PAPR_ideal) % %% SENAL TRAS EL CABLE medidas_cable = load(’Maria Jesus/measurements/ cable_RMSin_20_wf_wifi7_BW20_MCS10.mat’); % Spectrum Analyzer spectrum_cable = spectrumAnalyzer(’SampleRate’, Fs); spectrum_cable(medidas_cable.y); % MÁSCARA ESPECTRAL % spectrum_cable.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal % data = getMeasurementsData(spectrum_cable); % peakvalues = data.PeakFinder(end).Value; 129 % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % %Definición máscara espectral según el estándar y el ancho de banda % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_cable.SpectralMask.EnabledMasks = ’Upper’; % spectrum_cable.SpectralMask.UpperMask = [mask_freq, mask_power]; %ACPR spectrum_cable.ChannelMeasurements.Type = "acpr"; spectrum_cable.ChannelMeasurements.Enabled = true; spectrum_cable.ChannelMeasurements.NumOffsets = 2; spectrum_cable.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_cable); acprvaluesLower_cable = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_cable = data.ChannelMeasurements.ACPRUpper; spectrum_cable.Name = ’Espectro de la señal WiFi 7 tras el cable. BW = 20 MHz. MCS = 10’; spectrum_cable.Title = ’Espectro de la señal WiFi 7 tras el cable. BW = 20 MHz. MCS = 10’; show(spectrum_cable) % PAPR PAPR_cable = 20*log10(max(abs(medidas_cable.y))/rms(medidas_cable.y)); fprintf(’El valor de PAPR tras el cable es %.4f\n’, PAPR_cable) % Sincronización de las señales cable y_sync_cable = coarse_sync(medidas_cable.y,medidas_cable.x); y_sync_cable = (fine_sync(y_sync_cable,medidas_cable.x)).’; yn = y_sync_cable/norm(y_sync_cable) * norm(medidas_cable.x); figure() plot(129776:130671, real(medidas_cable.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el cable’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % SENAL TRAS EL AMPLIFICADOR medidas_amplif = load(’Maria Jesus/measurements/ amplificador_RMSin_16_wf_wifi7_BW20_MCS10.mat’); % Spectrum Analyzer spectrum_amplif = spectrumAnalyzer(’SampleRate’, Fs); spectrum_amplif(medidas_amplif.y); % % MÁSCARA ESPECTRAL % spectrum_amplif.PeakFinder.Enabled = true; %Activamos los marcadores en los m áximos de la señal % data = getMeasurementsData(spectrum_amplif); % peakvalues = data.PeakFinder(end).Value; % Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral % % %Definición máscara espectral según el estándar y el ancho de banda 130 Appendix A. Códigos utilizados % mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; % mask_freq = [-flipud(mask_freq); mask_freq]; % mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia % mask_power = [flipud(mask_power); mask_power]; % % spectrum_amplif.SpectralMask.EnabledMasks = ’Upper’; % spectrum_amplif.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR spectrum_amplif.ChannelMeasurements.Type = "acpr"; spectrum_amplif.ChannelMeasurements.Enabled = true; spectrum_amplif.ChannelMeasurements.NumOffsets = 2; spectrum_amplif.ChannelMeasurements.ACPROffsets = [20 40]*1e6; data = getMeasurementsData(spectrum_amplif); acprvaluesLower_amplif = data.ChannelMeasurements.ACPRLower; acprvaluesUpper_amplif = data.ChannelMeasurements.ACPRUpper; fprintf(’ACPR ideal: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_ideal(1), acprvaluesLower_ideal(2), ... acprvaluesUpper_ideal(1), acprvaluesUpper_ideal(2)); fprintf(’ACPR cable: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz= %.4f\ n ’, ... acprvaluesLower_cable(1), acprvaluesLower_cable(2), ... acprvaluesUpper_cable(1), acprvaluesUpper_cable(2)); fprintf(’ACPR amplificador: -20 MHz= %.4f, -40 MHz= %.4f, 20 MHz= %.4f y 40 MHz = %.4f\n ’, ... acprvaluesLower_amplif(1), acprvaluesLower_amplif(2), ... acprvaluesUpper_amplif(1), acprvaluesUpper_amplif(2)); spectrum_amplif.Name = ’Espectro de la señal WiFi 7 tras el amplificador. BW = 20 MHz. MCS = 10’; spectrum_amplif.Title = ’Espectro de la señal WiFi 7 tras el amplificador. BW = 20 MHz. MCS = 10’; show(spectrum_amplif) % PAPR PAPR_amplificador = 20*log10(max(abs(medidas_amplif.y))/rms(medidas_amplif.y)); fprintf(’El valor de PAPR tras el amplificador es %.4f\n’, PAPR_amplificador) % Sincronización de las señales y_sync_amplif = coarse_sync(medidas_amplif.y,medidas_amplif.x); y_sync_amplif = (fine_sync(y_sync_amplif,medidas_amplif.x)).’; yn = y_sync_amplif/norm(y_sync_amplif) * norm(medidas_amplif.x); figure() plot(129776:130671, real(medidas_amplif.x(129776:130671)), ’r’), hold on, plot(129776:130671, real(yn(129776:130671)),’b’) title(’Sincronización de las señales tras el amplificador’) xlabel(’Número de muestras’), ylabel(’Amplitud’) legend(’Señal TX’, ’Señal RX’) axis tight % Característica AM-AM dibuja_AMAM_AMPM(medidas_amplif.x, y_sync_amplif); % NMSE cable 131 NMSE_cable = 20*log10(norm(medidas_cable.x/norm(medidas_cable.x)- y_sync_cable/ norm(y_sync_cable))/norm(y_sync_cable/norm(y_sync_cable))); fprintf(’El valor de NMSE tras el cable es %.4f\n’, NMSE_cable) % NMSE amplificador NMSE_amplif = 20*log10(norm(medidas_amplif.x/norm(medidas_amplif.x)- y_sync_amplif/norm(y_sync_amplif))/norm(y_sync_amplif/norm(y_sync_amplif))) ; fprintf(’El valor de NMSE tras el amplificador es %.4f\n’, NMSE_amplif) % EVM ideal %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(ehtSUCfg); %start_data = str_index.EHTData(1)*ovs; LenSymbol = str_index.EHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)), chanBW,sr); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; 132 Appendix A. Códigos utilizados % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_ideal = 100*10.^(evmdB/20); valor_medio_EVM_ideal = mean(evm_ideal); fprintf(’El valor medio de EVM de la señal ideal %.4f\n’, valor_medio_EVM_ideal ) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal ideal’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM cable %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(ehtSUCfg); LenSymbol = str_index.EHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_cable(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr) ; detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) 133 % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_cable = 100*10.^(evmdB/20); valor_medio_EVM_cable = mean(evm_cable); fprintf(’El valor medio de EVM de la señal tras pasar por el cable %.4f\n’, valor_medio_EVM_cable) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el cable’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) % EVM amplificador %% Receiver % BBR = comm.BasebandFileReader(’wlanWaveform.bb’); % Create a baseband file reader object % chanBW = ’CBW20’; % Channel bandwidth of all packets within the waveform % bbrInfo = info(BBR); % BBR.SamplesPerFrame = bbrInfo.NumSamplesInData; % Number of samples in the waveform % rxWaveform = BBR(); % Load the I&Q sample from a binary file % sr = BBR.SampleRate; % Sampling rate of the input signal % release(BBR); %load(’formas de onda/wf_wifi7_BW20_MCS10.mat’); chanBW = ’CBW20’; sr = Fs; analyzer = WaveformAnalyzer; str_index = wlanFieldIndices(ehtSUCfg); LenSymbol = str_index.EHTData(2)*ovs; evmdB = []; IQ_completo = []; SNR = linspace(65,25,numPackets); for i = 1:numPackets % n = randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))))+1 i*randn(size(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol)))); % n = scale_dBm(n,dBm(wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol) ))-SNR(i)); 134 Appendix A. Códigos utilizados % process(analyzer,wf_wifi7_BW20_MCS10(1+((i-1)*LenSymbol):(i*LenSymbol))+n ,chanBW,sr); process(analyzer,y_sync_amplif(1+((i-1)*LenSymbol):(i*LenSymbol)),chanBW,sr ); detSummary = detectionSummary(analyzer); % plotWaveform(analyzer,1) % plotEVM(analyzer,1); evmdB = [evmdB, getEVM(analyzer,1)]; [IQ_pack,ref_constellation] = getConstellation(analyzer,1); IQ_completo = [IQ_completo, IQ_pack]; % NMSE = 20*log10((norm(ymedn-xsw)./norm(xsw))); end evm_amplif = 100*10.^(evmdB/20); valor_medio_EVM_amplif = mean(evm_amplif); fprintf(’El valor medio de EVM de la señal tras pasar por el amplificador es %.4f\n’, valor_medio_EVM_amplif) figure, plot(IQ_completo(:),’.b’);hold on; plot(ref_constellation,’+’,’Color’,’r’, ’LineWidth’,1.5) title(’Constelación de la señal tras pasar por el amplificador’) xlabel(’I (In phase)’), ylabel(’Q (Quadrature)’) axis([-1.5 1.5 -1.5 1.5]) Código A.14 wifi7_BW20_MCS13.m. clear, close all %% Generating 802.11be waveform % 802.11be configuration ehtSUCfg = wlanEHTMUConfig(’CBW20’, ’NumUsers’, 1, ’PuncturedChannelFieldValue’ , 0, ’EHTDUPMode’, 0, ... ’NumTransmitAntennas’, 1, ... ’GuardInterval’, 1.6, ... ’EHTLTFType’, 2, ... ’NumExtraEHTLTFSymbols’, 0, ... ’EHTSIGMCS’, 0, ... ’UplinkIndication’, 0, ... ’BSSColor’, 0, ... ’SpatialReuse’, 0, ... ’TXOPDuration’, []); % RU config object(s) ehtSUCfg.RU{1}.PowerBoostFactor = 1; ehtSUCfg.RU{1}.SpatialMapping = ’direct’; % User config object(s) ehtSUCfg.User{1}.APEPLength = 100; ehtSUCfg.User{1}.MCS = 13; ehtSUCfg.User{1}.NumSpaceTimeStreams = 1; ehtSUCfg.User{1}.ChannelCoding = ’ldpc’; 135 ehtSUCfg.User{1}.STAID = 0; ehtSUCfg.User{1}.NominalPacketPadding = 0; ovs = 5; numPackets = 60; % input bit source: pn = comm.PNSequence(’Polynomial’, ’x9+x5+1’, ’InitialConditions’, [zeros(1, 8) 1]); pn.SamplesPerFrame = 8*psduLength(ehtSUCfg)*numPackets; in = pn(); % Generation wf_wifi7_BW20_MCS13 = wlanWaveformGenerator(in, ehtSUCfg, ... ’NumPackets’, numPackets, ... ’IdleTime’, 0, ... ’OversamplingFactor’, ovs, ... ’ScramblerInitialization’, 93, ... ’WindowTransitionTime’, 1e-07); Fs = wlanSampleRate(ehtSUCfg, ’OversamplingFactor’, ovs); % Specify the sample rate of the waveform in Hz % RU Assignment and Allocated Subcarriers showAllocation(ehtSUCfg); %save(’formas de onda/wf_wifi7_BW20_MCS13.mat’, ’wf_wifi7_BW20_MCS13’) % SENAL IDEAL % Spectrum Analyzer spectrum_ideal = spectrumAnalyzer(’SampleRate’, Fs); spectrum_ideal(wf_wifi7_BW20_MCS13); % MÁSCARA ESPECTRAL spectrum_ideal.PeakFinder.Enabled = true; %Activamos los marcadores en los má ximos de la señal data = getMeasurementsData(spectrum_ideal); peakvalues = data.PeakFinder(end).Value; Pmax = max(peakvalues); %(dBm) A partir del valor máximo definimos la máscara espectral %Definición máscara espectral según el estándar y el ancho de banda mask_freq = [0; 9.75; 10.5; 20; 30; Inf] * 1e6; mask_freq = [-flipud(mask_freq); mask_freq]; mask_power = (Pmax+0.1)+[0; 0; -20; -28; -40; -40]; % Límites de potencia mask_power = [flipud(mask_power); mask_power]; spectrum_ideal.SpectralMask.EnabledMasks = ’Upper’; spectrum_ideal.SpectralMask.UpperMask = [mask_freq, mask_power]; % ACPR % spectrum_ideal.ChannelMeasurements.Type = "acpr"; % spectrum_ideal.ChannelMeasurements.Enabled = true; % spectrum_ideal.ChannelMeasurements.NumOffsets = 2; % spectrum_ideal.ChannelMeasurements.ACPROffsets = [20 40]*1e6; % data = getMeasurementsData(spectrum_ideal); % acprvaluesLower_ideal = data.ChannelMeasurements.ACPRLower; % acprvaluesUpper_ideal = data.ChannelMeasurements.ACPRUpper;