Análisis de Dispositivo No Lineal con MATLAB
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:
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
0 comentarios:
Publicar un comentario