Código MATLAB - Dispositivo No Lineal

Análisis de Dispositivo No Lineal con MATLAB

👤 Autor: Samuel Ramsbott

📚 Materia: Comunicaciones

Este código MATLAB simula el comportamiento de un dispositivo no lineal cuando se le aplican dos señales senoidales. El dispositivo se modela como un sistema polinomial:

y(t) = a₁·x(t) + a₂·x²(t) + a₃·x³(t)

El análisis muestra cómo la no linealidad genera nuevas componentes de frecuencia a través de intermodulación.

Código MATLAB Completo

%% ANÁLISIS DE DISPOSITIVO NO LINEAL CON DOS SEÑALES SENOIDALES
% Este código muestra los efectos de la distorsión no lineal
% en la combinación de dos señales senoidales

%% Parámetros de simulación
fs = 200e3;           % Frecuencia de muestreo 200 kHz
t = 0:1/fs:0.001;     % Vector de tiempo (1 ms de duración)

f1 = 10e3;            % Frecuencia senoidal 1: 10 kHz
f2 = 15e3;            % Frecuencia senoidal 2: 15 kHz
A1 = 1.0;             % Amplitud señal 1
A2 = 1.0;             % Amplitud señal 2

% Coeficientes del modelo polinomial no lineal
a1 = 1.0;             % Coeficiente lineal
a2 = 0.1;             % Coeficiente cuadrático
a3 = 0.05;            % Coeficiente cúbico

%% Generación de señales de entrada
x1 = A1*cos(2*pi*f1*t);
x2 = A2*cos(2*pi*f2*t);
x = x1 + x2;          % Señal compuesta

%% Modelado del dispositivo no lineal
y = a1*x + a2*x.^2 + a3*x.^3;  % Característica no lineal

%% Análisis espectral
N = length(y);        % Número de muestras
f = (-fs/2:fs/N:fs/2-fs/N);  % Vector de frecuencias

% Transformada de Fourier
Y = fftshift(fft(y)/N);
P = abs(Y);           % Espectro de amplitud

%% Visualización gráfica
figure('Position', [100, 100, 900, 700])

% 1. Señales de entrada en dominio de tiempo
subplot(3,1,1)
plot(t*1000, x1, 'b', 'LineWidth', 1.5)
hold on
plot(t*1000, x2, 'r', 'LineWidth', 1.5)
title('Señales de Entrada (Dominio del Tiempo)')
xlabel('Tiempo (ms)')
ylabel('Amplitud')
legend(['f1 = ', num2str(f1/1000), ' kHz'], ...
       ['f2 = ', num2str(f2/1000), ' kHz'])
xlim([0 0.2])
grid on
box on

% 2. Señal de salida distorsionada
subplot(3,1,2)
plot(t*1000, y, 'm', 'LineWidth', 1.5)
title('Señal de Salida (Dispositivo No Lineal)')
xlabel('Tiempo (ms)')
ylabel('Amplitud')
xlim([0 0.2])
grid on
box on

% 3. Espectro de frecuencias
subplot(3,1,3)
stem(f/1000, P, 'LineWidth', 1.5, 'Marker', 'none', 'Color', [0.5 0.5 0.5])
title('Espectro de Frecuencias de Salida')
xlabel('Frecuencia (kHz)')
ylabel('Magnitud')
xlim([0 50])
grid on
box on
hold on

% Destacar componentes importantes
% Señales originales
stem([f1/1000 f2/1000], [P(find(f>=f1,1)) P(find(f>=f2,1))], ...
     'b', 'LineWidth', 2, 'Marker', 'none')
 
% Productos de 2do orden (IM2)
im2_freqs = [abs(f1-f2) f1+f2 2*f1 2*f2]/1000;
for fk = im2_freqs
    idx = find(f >= fk*1000, 1);
    stem(fk, P(idx), 'r', 'LineWidth', 2, 'Marker', 'none')
end

% Productos de 3er orden (IM3)
im3_freqs = [2*f1-f2 2*f2-f1 2*f1+f2 2*f2+f1 3*f1 3*f2]/1000;
for fk = im3_freqs
    idx = find(f >= fk*1000, 1);
    stem(fk, P(idx), 'g', 'LineWidth', 2, 'Marker', 'none')
end

% Componente DC
stem(0, P(find(f>=0,1)), 'k', 'LineWidth', 2, 'Marker', 'none')

% Leyenda
legend('Espectro completo', 'Señales originales (f1, f2)', ...
       'Productos IM2 (2do orden)', 'Productos IM3 (3er orden)', ...
       'DC', 'Location', 'northeast')

%% Añadir tabla de frecuencias
freq_table = {
    'DC', 0;
    '|f1-f2|', abs(f1-f2)/1000;
    'f1', f1/1000;
    'f2', f2/1000;
    '2f1', 2*f1/1000;
    '2f2', 2*f2/1000;
    'f1+f2', (f1+f2)/1000;
    '2f1-f2', (2*f1-f2)/1000;
    '2f2-f1', (2*f2-f1)/1000;
    '2f1+f2', (2*f1+f2)/1000;
    '2f2+f1', (2*f2+f1)/1000;
    '3f1', 3*f1/1000;
    '3f2', 3*f2/1000;
};

annotation('textbox', [0.15, 0.02, 0.3, 0.1], 'String', ...
    'Componentes de Frecuencia Generadas:', 'FontWeight', 'bold', ...
    'EdgeColor', 'none');

annotation('textbox', [0.15, 0.02, 0.3, 0.1], 'String', ...
    sprintf('%s\n', freq_table{:,1}), ...
    'Position', [0.15 0.02 0.1 0.1], 'EdgeColor', 'none');

annotation('textbox', [0.25, 0.02, 0.3, 0.1], 'String', ...
    sprintf('%.1f kHz\n', freq_table{:,2}), ...
    'Position', [0.25 0.02 0.1 0.1], 'EdgeColor', 'none');

Resultado Esperado al Ejecutar el Código

Al ejecutar este código en MATLAB, obtendrás una figura con 3 gráficos:

Resultados esperados

Imagen representativa: El resultado real mostrará señales de entrada, salida distorsionada y espectro de frecuencias

Nota: La imagen anterior es un marcador de posición. Al ejecutar el código en MATLAB, verás:
  • Gráfico superior: Dos señales senoidales puras (10 kHz y 15 kHz)
  • Gráfico medio: Señal distorsionada con componentes adicionales
  • Gráfico inferior: Espectro de frecuencias con componentes identificadas por colores

Componentes de Frecuencia Generadas

El dispositivo no lineal produce las siguientes componentes de frecuencia:

  • Señales originales: f1 = 10 kHz, f2 = 15 kHz
  • Productos de 2do orden (IM2): |f1-f2| (5 kHz), f1+f2 (25 kHz), 2f1 (20 kHz), 2f2 (30 kHz)
  • Productos de 3er orden (IM3): 2f1-f2 (5 kHz), 2f2-f1 (20 kHz), 2f1+f2 (35 kHz), 2f2+f1 (40 kHz)
  • Componente DC: 0 kHz
  • Armónicos: 3f1 (30 kHz), 3f2 (45 kHz)
Consejo: Puedes modificar estos parámetros para experimentar:
f1 = 8e3;    % Cambiar frecuencia de primera señal
f2 = 12e3;   % Cambiar frecuencia de segunda señal
a2 = 0.2;    % Aumentar distorsión cuadrática
a3 = 0.1;    % Aumentar distorsión cúbica
Share on Google Plus

About Samuel Ramsbott

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario