ESCUELA POLITÉCNICA NACIONAL
LABORATORIO DE TRANSMISIÓN DIGITAL
Integrantes: Patricio Sánchez, Francisco Imbaquinga
Curso: Gr3
Fecha: 24/05/2024
INFORME Nº3
USO DE MATLAB EN LOS SISTEMAS DE COMUNICACIÓN
1. Presentar los resultados más relevantes obtenidos en la práctica, los códigos de los programas
debidamente comentados y las capturas solicitadas por el instructor con la debida explicación.
En la práctica se realizó las simulaciones de generación de señales. En la cual se pudo evidenciar el
funcionamiento de algunas de las funciones. En el desarrollo de la práctica se realizaron los siguientes
códigos:
Ejercicio 5.1
En este programa se genera y grafica la señal: y(t) = -3 + sen(2πft) + 4cos(4πft), luego se submuestrear
(usando la función decimate) con frecuencia de 7khz con frecuencia de submuestreo de 30khz en un intervalo
de tiempo de 0 a 5ms con un factor de muestreo de 4 y un factor de submuestreo 2 de 8.
Código 1
%% PROGRAMA CREADO POR PATRICIO SANCHEZ Y FRANCISCO IMBAQUINGA.
% Submuestrear la señal
factor_muestreo = 4;
factor_submuestreo = 2;
fs_submuestreo = fs_original / factor_muestreo;
y_submuestreada = decimate(y, factor_muestreo, 'fir');
% Remuestrear por interpolación
y_submuestreada2 = resample(y_submuestreada, 1, factor_submuestreo);
% Calcular el nuevo intervalo de tiempo después del segundo submuestreo
t_submuestreo2 = linspace(0, 5e-3, length(y_submuestreada2));
% Graficar la señal original y la señal submuestreada en la misma figura
figure;
subplot(2,1,1);
plot(t, y);
title('Señal original');
xlabel('Tiempo (s)');
ylabel('Amplitud');
grid on;
%
subplot(2,1,2);
plot(t_submuestreo2, y_submuestreada2);
title('Segundo submuestreo (interpolación)');
xlabel('Tiempo (s)');
ylabel('Amplitud');
grid on;
Figura 1. Código en Matlab de la señal y el Grafico comparativo de la señal original y la muestreada
A partir de dicha señal aplicamos la fft para encontrar las frecuencias en el dominio de la frecuencia.
Código 1 modificado
%% PROGRAMA CREADO POR PATRICIO SANCHEZ Y FRANCISCO IMBAQUINGA.
% Calcular la Transformada de Fourier de la señal
Y = fft(y);
% Calcular la magnitud del espectro de frecuencia
Y_mag = abs(Y);
% Calcular el vector de frecuencias correspondiente
N = length(y); % Número de puntos de datos
frequencies = (0:N-1) * (fs_original / N);
% Graficar el espectro de frecuencia
figure;
plot(frequencies, Y_mag);
title('Espectro de frecuencia de la señal');
xlabel('Frecuencia (Hz)');
ylabel('Magnitud');
grid on;
% Encontrar las principales componentes frecuenciales
[~, idx] = max(Y_mag);
main_frequency = frequencies(idx);
fprintf('Frecuencia dominante en la señal: %.2f Hz\n', main_frequency);
% Encontrar las frecuencias más significativas
threshold = max(Y_mag) * 0.1; % Umbral del 10% de la máxima magnitud
significant_frequencies = frequencies(Y_mag > threshold);
fprintf('Principales componentes frecuenciales presentes en la señal:\n');
disp(significant_frequencies);
% Observar si hay armónicos o frecuencias adicionales
if length(significant_frequencies) > 1
fprintf('Se observan armónicos o frecuencias adicionales en el espectro de
frecuencia.\n');
else
fprintf('No se observan armónicos o frecuencias adicionales en el espectro de
frecuencia.\n');
end
Figura 2. Código en Matlab de fft de la señal y el Grafico en el dominio de la frecuencia.
Preguntas
¿Cuáles son las principales componentes frecuenciales presentes en la señal?
Las principales componentes frecuenciales son aquellas frecuencias en el espectro de frecuencia que tienen
una magnitud significativa en comparación con el resto en este ejemplo la frecuencia más significativa de
7khz. Estas frecuencias son los picos más altos en el espectro. Puedes identificarlas observando los picos en el
espectro de frecuencia y determinando cuáles tienen una magnitud considerable.
¿Cuál es la frecuencia dominante en la señal?
En este ejemplo la frecuencia dominante es de más o menos 3.5KHz ya que con esta frecuencia fue generada
la señal y a partir de ella se van generando otros armónicos en múltiplos de ella.
¿Se observan armónicos o frecuencias adicionales en el espectro de frecuencia?
Como se puede evidenciar si existe otro pico a diferencia de la frecuencia fundamental esto quiere decir que si
existe armónicos en la señal.
Ejercicio 5.2
Por otra parte, en el desarrollo de la práctica se realizó el código de la grafica y(t) = 5/8 - 2 cos (2πft ± Ø) con
una frecuencia de 200Hza una frecuencia de muestreo de 1kHz en un periodo de tiempo de 0 a 150ms con un
Angulo de desfase de 150 grados
Código 2
% Parámetros
f = 200; % Frecuencia de la señal en Hz
Fs = 1000; % Frecuencia de muestreo en Hz
theta = 150; % Desfase en grados
% Calcular el período de la señal
T = 1 / f;
% Vector de tiempo para 3 periodos de la señal original
t = 0:1/Fs:3*T;
% Señal original y(t)
y_original = 3/5 - 1.5*cos(2*pi*f*t);
% Señal con desfase y_desfase(t)
y_desfase = 3/5 - 1.5*cos(2*pi*f*t + deg2rad(theta));
% Graficar ambas señales
figure;
plot(t, y_original, 'b', t, y_desfase, 'r--');
title('Señal original y desfasada');
xlabel('Tiempo (s)');
ylabel('Amplitud');
legend('Original','Con Desfase');
Figura 3. Código implementado en Matlab
Ejercicio 5.3
Para este literal que se realizó en la práctica se utilizó la función linspace y se represento en n muestras
utilizando la función decímate con una frecuencia de 400Hz con una frecuencia de muestreo de 3kHz en un
intervalo de 0 a 25ms con un m de 18000 y un n de 500.
Código 3
%% PROGRAMA CREADO POR PATRICIO SANCHEZ Y FRANCISCO IMBAQUINAGA.
% Parámetros de la señal
f = 400; % Frecuencia en Hz
fs = 3000; % Frecuencia de muestreo en Hz
t = linspace(0, 0.025, 18000); % Intervalo de tiempo de 0 a 25 ms con 18000 puntos
% Generar señales originales
x_original_senoidal = sin(2 * pi * f * t);
x_original_cuadrada = square(2 * pi * f * t);
x_original_diente_sierra = sawtooth(2 * pi * f * t);
% Factor de decimación
m = 1; % Factor de decimación
n = 4; % Número de muestras a mantener después de la decimación
% Decimación de las señales originales
x_decimated_senoidal = decimate(x_original_senoidal, n); % Decimación a n muestras
x_decimated_cuadrada = decimate(x_original_cuadrada, n); % Decimación a n muestras
x_decimated_diente_sierra = decimate(x_original_diente_sierra, n); % Decimación a n
muestras
t_decimated = decimate(t, n); % Actualizar el tiempo después de la decimación
% Graficar señales originales y decimadas
figure;
% Senoidal
subplot(3,1,1);
plot(t, x_original_senoidal, 'r', t_decimated, x_decimated_senoidal, 'b');
title('Senoidal');
xlabel('Tiempo [s]');
ylabel('Amplitud [U]');
grid on;
legend('Original', 'Muestreada');
% Cuadrada
subplot(3,1,2);
plot(t, x_original_cuadrada, 'r', t_decimated, x_decimated_cuadrada, 'b');
title('Cuadrada');
xlabel('Tiempo [s]');
ylabel('Amplitud [U]');
grid on;
legend('Original', 'Muestreada');
% Diente de sierra
subplot(3,1,3);
plot(t, x_original_diente_sierra, 'r', t_decimated, x_decimated_diente_sierra, 'b');
title('Diente de Sierra');
xlabel('Tiempo [s]');
ylabel('Amplitud [U]');
grid on;
legend('Original', 'Muestreada');
1
Figura 4. Gráfica obtenida con ayuda de Matlab
Ejercicio 5.4
En este último apartado utilizamos un generador de funciones para obtener una señal senoidal de 1 Hz con 2
Vpp y un offset de 2.5 V, implementamos un código de Arduino sumado al código de Matlab que nos permite
realizar una comunicación serial entre la placa y el software. Obtenemos los valores de la señal analógica que
lee la placa de Arduino y con ayuda de Matlab graficamos dichos valores teniendo en cuenta la relación de
frecuencia de la señal y el tiempo transcurrido en segundos. A continuación, se presentan los códigos y
gráficas obtenidas.
Código 4 Arduino
int analogPin = A0;
int val = 0;
void setup() {
[Link](9600);
}
void loop() {
val = analogRead(analogPin);
[Link](val);
delay(100);
}
Código 4 Matlab
% Cierra todas las figuras y limpia la ventana de comandos
close all;
clc;
% Configuración del puerto serial
puerto = serialport('COM6', 9600);
% Frecuencia de muestreo (Hz)
frecuencia_muestreo = 10; % Hz
% Número de muestras por segundo
muestras_por_segundo = frecuencia_muestreo
% Duración de un segundo en segundos
duracion_segundo = 1;
% Número total de muestras
muestras_total = muestras_por_segundo * duracion_segundo;
% Intervalo de tiempo entre muestras
intervalo_tiempo = 1 / frecuencia_muestreo;
% Configuración de la figura
hFig = figure('Name', 'Gráfica de voltaje');
title('Gráfica de voltaje');
xlabel('Tiempo (s)');
ylabel('Voltaje (V)');
grid on;
hold on;
% Bucle principal
for segundo = 1:10
% Bucle para tomar muestras durante un segundo
for contador = 1:muestras_por_segundo
valor = str2double(readline(puerto));
if ~isnan(valor)
% Calcula el tiempo transcurrido
tiempo_transcurrido = (segundo - 1) * duracion_segundo + (contador - 1) *
intervalo_tiempo;
% Calcula el voltaje y almacena en el vector
voltaje = valor * 5 / 1024;
% Actualiza la gráfica
plot(tiempo_transcurrido, voltaje, 'o');
ylim([0 6]);
xlim([0 10 * duracion_segundo]); % Ajusta el límite del eje x
drawnow;
% Espera para mantener la frecuencia de muestreo
pause(intervalo_tiempo);
end
end
end
% Cierra el puerto
fclose(puerto);
clear puerto;
Figura 5. Gráfica obtenida con ayuda de Matlab
Figura 6. Implementación del circuito
2. Consultar el uso de variables simbólicas en Matlab y como realizar operaciones matemáticas.
En cuanto al uso de variables simbólicas en Matlab, se puede mencionar que estas trabajan bajo el uso de
expresiones matemáticas simbólicas en lugar de expresiones numéricas. Asimismo, se puede mencionar que
estas facilitan la realización de operaciones matemáticas tales como: cálculos algebraicos, resolución de
ecuaciones, simplificación de expresiones, entre otras. [1]
Por tanto, para poder emplear estas variables simbólicas se debe de seguir los siguientes pasos:
1. Definir las variables como tipo sym.
Ilustración 1 Definición de variables
2. Crear variables simbólicas, este paso es importante debido a que estas permitirán realizar operaciones
matemáticas con las variables previamente declaras.
Crea la expresión simbólica.
En este caso, se toma por ejemplo la operación de simplificación de la expresión.
Es importante mencionar que los dos anteriores pasos, se deben de repetir para cada operación matemática que
se requiera resolver.
3. Consultar las instrucciones que se utilizan para la generación de gráficas 2D y 3D en Matlab.
Por lo que concierne a las instrucciones para generar gráficas del tipo 2D y 3D se presenta lo siguiente:
Gráficas 2D
Función básica de línea
En el caso de una función básica de línea se deben seguir los siguientes pasos:
a. Definir los datos para el eje x empleando “linspace”.
b. Calcular los valores correspondientes en el eje y.
c. Usar la función “plot” para trazar la gráfica.
Ejemplo de código:
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y);
title('Gráfica de y = sin(x)');
xlabel('Eje X');
ylabel('Eje Y');
Gráfica de dispersión
En el caso de una gráfica de dispersión se deben seguir los siguientes pasos:
a. Generar datos de manera aleatoria o utilizar datos existentes.
b. Usar la función “scatter” para crear la gráfica de dispersión. [1]
Ejemplo de código:
x = randn(1, 100);
y = randn(1, 100);
scatter(x, y);
title('Gráfica de dispersión');
xlabel('Eje X');
ylabel('Eje Y');
Gráficas 3D
Gráfica de superficies
En el caso de una gráfica de superficies se deben seguir los siguientes pasos:
a. Crear una malla 2D utilizando “meshgrid”.
b. Calcular los valores de la función en la malla.
c. Utilizar la función “surf” para visualizar la superficie 3D. [1]
Ejemplo en código:
x = randn(1, 100);
y = randn(1, 100);
scatter(x, y);
title('Gráfica de dispersión');
xlabel('Eje X');
ylabel('Eje Y');
Gráfica de contorno 3D
En el caso de una gráfica de contorno 3D se deben seguir los siguientes pasos:
a. Similar el paso 1 de la función de superficie.
b. Usar la función “contour 3” para trazar las líneas de contorno en 3D. [1]
Ejemplo en código:
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.^2 + Y.^2;
contour3(X, Y, Z, 20);
title('Contorno en 3D de la superficie cuadrática');
xlabel('Eje X');
ylabel('Eje Y');
zlabel('Eje Z');
4. Consultar ¿Qué son los Toolbox de Matlab y cómo pueden ser utilizados en comunicaciones?
Communications Toolbox proporciona algoritmos y apps para análisis, diseño, simulación de extremo a
extremo y verificación de sistemas de comunicaciones. Esta toolbox incluye una app basada en gráficos que
permite generar formas de onda personalizadas o estándar. Puede crear vectores de prueba para verificar el
rendimiento de un receptor o para crear conjuntos de datos destinados a aplicaciones de inteligencia artificial
(IA) agregando distorsiones de RF a formas de onda. La toolbox permite modelar canales de propagación
estadísticamente o con soluciones de trazado de rayos que incluyen terreno y edificios. Puede compensar los
efectos de las degradaciones del canal y utilizar SDR para verificar diseños con pruebas OTA (inalámbricas).
Communications Toolbox facilita el modelado de enlaces de comunicaciones desde la antena hasta la cadena
de RF y el procesamiento de bits con Antenna Toolbox y RF Blockset. Puede acelerar simulaciones de BER
utilizando la nube o un cluster local con Parallel Computing Toolbox. La toolbox ayuda a solucionar
problemas de comunicaciones utilizando técnicas de IA con Deep Learning Toolbox. [2]
5. Generar señales aleatorias utilizando las funciones rand y randn, y obtener su valor máximo, valor
mínimo y desviación estándar.
% PROGRAMA CREADO POR PATRICIO SANCHEZ Y FRANCISCO IMBAQUINAGA.
% Generar una señal aleatoria utilizando la función rand
signal_rand = rand(1, 1000); % Genera 1000 muestras aleatorias entre 0 y 1
% Calcular el valor máximo, valor mínimo y desviación estándar de la señal aleatoria
generada con rand
max_rand = max(signal_rand);
min_rand = min(signal_rand);
std_dev_rand = std(signal_rand);
% Generar una señal aleatoria utilizando la función randn
signal_randn = randn(1, 1000); % Genera 1000 muestras aleatorias con distribución
normal estándar (media 0, desviación estándar 1)
% Calcular el valor máximo, valor mínimo y desviación estándar de la señal aleatoria
generada con randn
max_randn = max(signal_randn);
min_randn = min(signal_randn);
std_dev_randn = std(signal_randn);
% Graficar las señales aleatorias generadas
figure;
% Gráfico de la señal generada con rand
subplot(2, 1, 1);
plot(signal_rand);
title('Señal Aleatoria Generada con rand');
xlabel('Muestras');
ylabel('Amplitud');
% Gráfico de la señal generada con randn
subplot(2, 1, 2);
plot(signal_randn);
title('Señal Aleatoria Generada con randn');
xlabel('Muestras');
ylabel('Amplitud');
% Mostrar los resultados
disp('Resultados para la señal generada con rand:');
fprintf('Valor máximo: %.4f\n', max_rand);
fprintf('Valor mínimo: %.4f\n', min_rand);
fprintf('Desviación estándar: %.4f\n\n', std_dev_rand);
disp('Resultados para la señal generada con randn:');
fprintf('Valor máximo: %.4f\n', max_randn);
fprintf('Valor mínimo: %.4f\n', min_randn);
fprintf('Desviación estándar: %.4f\n', std_dev_randn);
Figura 6. Figura de las señales aleatorias.
6. Conclusiones y Recomendaciones
Conclusiones
Francisco Imbaquinga
1. En el apartado 5.5 observamos la utilidad de la placa Arduino dentro de la recolección de señales
analógicas utilizando la lectura analógica de datos, además de su versatilidad para ser combinada con
una herramienta de análisis y procesamiento de datos como MATLAB, dado que esta herramienta nos
facilita la compresión de datos obtenidos al permitirnos visualizar en formato de gráficas 2D o 3D y
así lograr un análisis profundo de un sistema de comunicaciones.
2. Concluimos que la transformación matemática de una señal en el dominio del tiempo al dominio de
la frecuencia es fundamental en esta práctica, es necesario conocer los conceptos básicos con el fin de
encontrar la correcta relación entre el tiempo y la frecuencia en el caso de necesitar graficar de forma
efectiva los valores obtenidos por una señal analógica con ayuda de la placa Arduino.
Patricio Sánchez
1. Es esencial aprender las funciones principales de MATLAB para realizar gráficas de manera eficiente
y comprender su funcionamiento. Además, es fundamental reconocer qué parámetros acepta cada
función, ya que proporcionar los parámetros incorrectos puede generar errores y dificultar la
obtención de resultados precisos.
2. Matlab es una herramienta poderosa para la creación de gráficas de señales, gracias a su variedad de
funciones y opciones, incluyendo la transformada de Fourier. Su amplia gama de funciones simplifica
la creación de código y su entorno amigable facilita la programación y la creación de gráficas de
manera sencilla.
Recomendaciones
Francisco Imbaquinga
1. Es recomendable, investigar más acerca de la transformación matemática de una señal en el dominio
del tiempo al dominio de la frecuencia, con el fin de comprender la relación existente entre ellas y
poder crear códigos con ayuda de MATLAB que nos permitan simplificar los diferentes cálculos
matemáticos que dicha conversión requiere.
Patricio Sánchez
1. Se recomienda, reconocer qué parámetros acepta cada una de las funciones de MATLAB. Si
proporcionamos los parámetros incorrectos o con un número incorrecto de datos, el software puede
generar errores y dificultar la obtención de gráficas o resultados precisos. Es fundamental
comprender los parámetros
2. que necesita cada función para garantizar un uso adecuado y efectivo de MATLAB.
7. Bibliografía
[1]. MathWorks, «MathWorks Help Center,» 17 Junio 2023. [En línea]. Available:
[Link] [Último acceso: 03 Diciembre 2023].
[2]. MathWorks, «MathWorks Communication Toolbox,» [En línea]. Available:
[Link] [Último acceso: 03 Diciembre 2023].