commit - 3a1a479850af3cb443dd4d7f0c1d8f7ee1c80a8d
commit + b0b0f591a7862aba7e436d256748ac56b62fe329
blob - /dev/null
blob + 940000ce00347f0a2d5f73413e97ebde8e3203d0 (mode 644)
Binary files /dev/null and Imagenes/Analisis SVD — Espacios Vectoriales.png differ
blob - /dev/null
blob + 14e2c929ca8a665f7a8239907a4729d9889fbc8f (mode 644)
Binary files /dev/null and Imagenes/Diagrama de Circuito — Microfono Laser.png differ
blob - /dev/null
blob + 28beba0d6099ee0a7b02352a09857dd33d6d915e (mode 644)
Binary files /dev/null and Imagenes/Reconstruccion FFT.png differ
blob - /dev/null
blob + 67a68f4fea96a5bef94bed41e9eaa45c0997f144 (mode 644)
Binary files /dev/null and Imagenes/Simulacion 3D — Microfono Laser.png differ
blob - /dev/null
blob + fe2d1897d5993de457b1c66529cd12d61afc5f35 (mode 644)
Binary files /dev/null and Imagenes/Sistema Laser-Fotosensor — Resultados Completos.png differ
blob - ba7b58a6c20319e468009bdeaa92466a6b03cc26
blob + 8000f5d970a843c31e286e72f761d8a241eaee3c
--- README.md
+++ README.md
-# Proyecto-Fisica-2do
+# 🔬 Microfono Laser — Reconstruccion de Sonido por Vibracion de Vidrio
-Proyecto, en MATLAB para la decodificación de ondas con un foto-sensor
\ No newline at end of file
+**Fisica 2do Semestre · Ondas, Oscilaciones y Espacios Vectoriales**
+**Autor:** Bernal Estrada Alejandro
+
+---
+
+## Descripcion
+
+Sistema optico-electronico que captura el sonido dentro de una caja insonorizada **sin contacto fisico**, usando la vibracion que el audio imprime sobre un vidrio. Un laser de 650 nm apunta al vidrio; el reflejo modulado por las vibraciones es capturado por un fotodiodo BPW34, amplificado por un TIA LM358 y un MAX9814, y digitalizado via el jack de microfono de la PC. MATLAB aplica la Transformada de Fourier para reconstruir el audio original.
+
+```
+Bocina → vibra vidrio → laser reflejado → BPW34 → TIA LM358 → MAX9814 → jack PC → MATLAB FFT
+```
+
+---
+
+## Resultados
+
+### Sistema completo — pipeline BPW34 → TIA → MAX9814 → FFT
+
+
+
+| Señal | Frec. base | Error RMS | SNR (dB) | Correlacion |
+|---|---|---|---|---|
+| Tono puro | 1000 Hz | 2.79 × 10⁻⁶ | **102.1 dB** | 1.0000 |
+| Acorde Do Mayor | 262 Hz | 2.87 × 10⁻⁴ | **62.1 dB** | 1.0000 |
+| Barrido chirp | 100–1000 Hz | 1.06 × 10⁻² | **30.5 dB** | 0.9996 |
+| Compleja (5 armonicos) | 262 Hz | 3.00 × 10⁻⁴ | **63.1 dB** | 1.0000 |
+
+---
+
+### Analisis SVD — Espacios Vectoriales
+
+
+
+La descomposicion en valores singulares revela la estructura del espacio vectorial de cada senal. El tono puro concentra el 99% de su energia en 1 modo; el acorde en 3 modos (uno por nota); la senal compleja en 5 modos (uno por armonico).
+
+---
+
+### Reconstruccion FFT
+
+
+
+---
+
+### Simulacion 3D del montaje experimental
+
+
+
+Escena 3D animada del montaje completo: caja insonorizada, vidrio vibrante, laser KY-008, BPW34 en tubo negro, circuito TIA + MAX9814 en protoboard, y laptop con MATLAB.
+
+---
+
+### Diagrama de circuito
+
+
+
+---
+
+## Hardware
+
+| Componente | Funcion | Valor clave |
+|---|---|---|
+| Laser KY-008 (650 nm) | Fuente de luz | P = 0.5 mW |
+| BPW34 (fotodiodo PIN) | Luz → corriente | R = 0.3 A/W @ 650 nm |
+| LM358 (TIA) | Corriente → voltaje | Rf = 10 kΩ, Cf = 100 pF |
+| Capacitor C_ac | Bloqueo DC | 10 µF |
+| MAX9814 HiLetgo | Amplificador AGC | Av = 40 dB (GAIN flotante) |
+| Capacitor C_sal | Bloqueo offset salida | 47 µF |
+| Jack 3.5 mm | Interfaz PC | Entrada microfono |
+
+**Alimentacion:** +5V + GND
+**Costo estimado:** ~$150–230 MXN (sin componentes ya disponibles)
+
+---
+
+## Software
+
+### Estructura del repositorio
+
+```
+Proyecto-Fisica-2do/
+├── Scripts/
+│ ├── script_prueba_demostracion.m # Simulacion completa del sistema
+│ ├── simulacion_3d_laser.m # Visualizacion 3D animada
+│ └── diagrama_circuito.m # Esquematico del circuito
+├── Imagenes/
+│ ├── Sistema Laser-Fotosensor — Resultados Completos.png
+│ ├── Analisis SVD — Espacios Vectoriales.png
+│ ├── Reconstruccion FFT.png
+│ ├── Simulacion 3D — Microfono Laser.png
+│ └── Diagrama de Circuito — Microfono Laser.png
+└── LICENSE
+```
+
+### Uso
+
+```matlab
+% 1. Simulacion matematica completa (no requiere hardware)
+run('Scripts/script_prueba_demostracion.m')
+
+% 2. Simulacion 3D animada del montaje (presionar Q para detener)
+run('Scripts/simulacion_3d_laser.m')
+
+% 3. Diagrama de circuito esquematico
+run('Scripts/diagrama_circuito.m')
+% Guardar en alta resolucion:
+print(gcf, '-dpng', '-r300', 'diagrama_circuito.png')
+```
+
+**Requisitos:** MATLAB (base) + Signal Processing Toolbox
+No requiere Simulink ni Simscape.
+
+---
+
+## Metodo
+
+### Pipeline optico-electronico
+
+```
+1. Audio dentro de la caja → vibra el vidrio (Δx ~ µm)
+2. Vidrio vibrante modula la intensidad del reflejo del laser
+ P_luz(t) = P_laser × [1 + m × audio(t)] (m = profundidad de modulacion)
+3. BPW34 convierte luz en corriente:
+ I_foto = R × P_luz (R = 0.3 A/W)
+4. TIA LM358 convierte corriente en voltaje:
+ V_TIA = I_foto × Rf (Rf = 10 kΩ)
+5. C_ac elimina el offset DC
+6. MAX9814 amplifica con AGC automatico (40 dB)
+7. Jack PC → MATLAB captura la senal digitalizada
+```
+
+### Reconstruccion por FFT
+
+```matlab
+Y = fft(senal_capturada);
+umbral = max(abs(Y)) * 0.1; % conservar componentes > 10%
+mascara = abs(Y) > umbral; % filtro espectral
+mascara = mascara | flipud(mascara); % simetria hermitiana
+senal_rec = real(ifft(Y .* mascara)); % reconstruccion
+```
+
+### Analisis SVD
+
+La matriz de trayectoria M ∈ ℝ^(ventana × cols) captura la estructura temporal de la senal. Su descomposicion M = UΣVᵀ revela cuantos modos son necesarios para representar el contenido espectral — directamente relacionado con el numero de frecuencias presentes.
+
+---
+
+## Licencia
+
+Distribuido bajo los terminos del archivo [LICENSE](LICENSE).
+
+---
+
+*Proyecto integrador — Fisica 2do Semestre · Ondas, Oscilaciones y Espacios Vectoriales*
\ No newline at end of file
blob - c578a92abb852e7ed90dbc89daf0ec4004ff5b1c (mode 644)
blob + /dev/null
--- diagrama_circuito.m
+++ /dev/null
-%% DIAGRAMA DE CIRCUITO — Microfono Laser
-% BPW34 → TIA (LM358) → C_ac → MAX9814 → Jack PC
-%
-% Autor: Alejandro B. E. — Fisica 2do Semestre
-
-clear; close all; clc;
-
-fig = figure('Name','Diagrama de Circuito — Microfono Laser', ...
- 'NumberTitle','off','Position',[40 40 1600 900], ...
- 'Color',[0.07 0.07 0.10]);
-
-ax = axes('Position',[0 0 1 1],'Color',[0.07 0.07 0.10]);
-hold(ax,'on'); axis(ax,'off');
-xlim(ax,[0 160]); ylim(ax,[0 95]);
-
-%% ─── HELPERS ────────────────────────────────────────────────────
-
- function wire(ax,x1,y1,x2,y2,col,lw)
- if nargin<6, col=[0.85 0.85 0.85]; end
- if nargin<7, lw=1.4; end
- plot(ax,[x1 x2],[y1 y2],'Color',col,'LineWidth',lw);
- end
-
- function node(ax,x,y,col)
- if nargin<4, col=[0.85 0.85 0.85]; end
- plot(ax,x,y,'o','MarkerFaceColor',col,'MarkerEdgeColor',col,'MarkerSize',5);
- end
-
- function dibujar_R(ax,xc,yc,W,H,lbl_txt,val_txt)
- xs = xc - W/2;
- xx = linspace(xs, xs+W, 9);
- yy = yc + H/2 * [0 1 -1 1 -1 1 -1 1 0];
- plot(ax,xx,yy,'Color',[0.9 0.6 0.2],'LineWidth',1.5);
- plot(ax,[xc-W/2-1.5 xc-W/2],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
- plot(ax,[xc+W/2 xc+W/2+1.5],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
- text(ax,xc,yc+H*0.9+0.3,lbl_txt,'Color',[0.9 0.7 0.3],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
- text(ax,xc,yc-H*0.9-0.5,val_txt,'Color',[0.65 0.65 0.65],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
- end
-
- function dibujar_C(ax,xc,yc,gap,H,lbl_txt,val_txt)
- g = gap/2;
- plot(ax,[xc-g xc-g],[yc-H/2 yc+H/2],'Color',[0.3 0.75 1.0],'LineWidth',2.2);
- plot(ax,[xc+g xc+g],[yc-H/2 yc+H/2],'Color',[0.3 0.75 1.0],'LineWidth',2.2);
- plot(ax,[xc-g-2 xc-g],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
- plot(ax,[xc+g xc+g+2],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
- text(ax,xc,yc+H/2+0.9,lbl_txt,'Color',[0.3 0.85 1.0],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
- text(ax,xc,yc-H/2-1.2,val_txt,'Color',[0.55 0.55 0.65],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
- end
-
- function gnd(ax,x,y)
- plot(ax,[x x],[y y-1.2],'Color',[0.55 0.55 0.55],'LineWidth',1.3);
- w = [2.2 1.5 0.7];
- for i=1:3
- plot(ax,[x-w(i) x+w(i)],[y-1.2-(i-1)*0.7 y-1.2-(i-1)*0.7], ...
- 'Color',[0.55 0.55 0.55],'LineWidth',1.2);
- end
- end
-
- function vcc(ax,x,y,lbl_txt)
- if nargin<4, lbl_txt='+5V'; end
- plot(ax,[x x],[y y+1.5],'Color',[0.9 0.35 0.35],'LineWidth',1.3);
- plot(ax,[x-1.2 x+1.2],[y+1.5 y+1.5],'Color',[0.9 0.35 0.35],'LineWidth',2);
- text(ax,x,y+2.8,lbl_txt,'Color',[0.95 0.4 0.4],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
- end
-
-%% ─── LAYOUT: el circuito ocupa y=30..92, tabla y=2..17 ─────────
-% GND rail en y=30 (antes 18) — deja espacio para tabla abajo
-Y_GND = 30; % rail GND
-Y_VCC = 82; % rail +5V
-Y_UP = 12; % desplazamiento vertical respecto a version anterior (+12)
-
-%% ═══════════════════════════════════════════════════════════════
-% TITULO
-%% ═══════════════════════════════════════════════════════════════
-text(ax,80,93,'Diagrama de Circuito — Microfono Laser', ...
- 'Color',[1 0.75 0.15],'FontSize',14,'HorizontalAlignment','center', ...
- 'FontWeight','bold','FontName','Courier New');
-text(ax,80,90,'BPW34 → TIA LM358 → C_{ac} → MAX9814 → Jack PC → MATLAB FFT', ...
- 'Color',[0.6 0.6 0.6],'FontSize',9,'HorizontalAlignment','center', ...
- 'FontName','Courier New');
-plot(ax,[3 157],[87.5 87.5],'Color',[0.25 0.25 0.3],'LineWidth',0.8);
-
-%% ═══════════════════════════════════════════════════════════════
-% RAILS
-%% ═══════════════════════════════════════════════════════════════
-plot(ax,[5 155],[Y_VCC Y_VCC],'Color',[0.7 0.2 0.2],'LineWidth',1,'LineStyle','--');
-text(ax,4,Y_VCC+0.6,'+5V','Color',[0.9 0.4 0.4],'FontSize',7,'FontName','Courier New');
-plot(ax,[5 155],[Y_GND Y_GND],'Color',[0.4 0.4 0.4],'LineWidth',1,'LineStyle','--');
-text(ax,4,Y_GND-0.8,'GND','Color',[0.55 0.55 0.55],'FontSize',7,'FontName','Courier New');
-
-% Separador entre circuito y tabla
-plot(ax,[3 157],[27.5 27.5],'Color',[0.2 0.2 0.25],'LineWidth',1.2);
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 1: SENSOR OPTICO (y += 12 respecto a version anterior)
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[5 42 28 30],'EdgeColor',[0.4 0.4 0.5], ...
- 'LineWidth',0.8,'LineStyle',':');
-text(ax,19,73.5,'SENSOR OPTICO','Color',[0.5 0.5 0.6],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-% Laser KY-008
-rectangle(ax,'Position',[7 44 8 6],'EdgeColor',[0.3 0.9 0.3], ...
- 'FaceColor',[0.05 0.15 0.05],'LineWidth',1.3,'Curvature',0.2);
-text(ax,11,47.2,'LASER','Color',[0.3 1.0 0.3],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,11,45.8,'KY-008','Color',[0.3 0.7 0.3],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,11,44.6,'650 nm','Color',[0.5 0.5 0.5],'FontSize',6, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-% Haz laser
-x_beam = linspace(15,25,60);
-y_beam = 47 + 0.15*sin(linspace(0,6*pi,60));
-plot(ax,x_beam,y_beam,'Color',[1 0.2 0.2],'LineWidth',1.8);
-text(ax,20,48.3,'haz 650nm','Color',[1 0.4 0.4],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-% Vidrio
-plot(ax,[26 26],[40 56],'Color',[0.4 0.75 1.0],'LineWidth',3);
-plot(ax,[26.8 26.8],[40 56],'Color',[0.3 0.6 0.9],'LineWidth',1);
-text(ax,26,57.2,'VIDRIO','Color',[0.4 0.85 1.0],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
-text(ax,26,56.0,'(vibra con','Color',[0.4 0.7 0.85],'FontSize',6.2, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,26,55.0,'el sonido)','Color',[0.4 0.7 0.85],'FontSize',6.2, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-% Reflexion
-x_ref = linspace(27,22,30);
-y_ref = linspace(47,62,30);
-plot(ax,x_ref,y_ref,'Color',[1 0.4 0.4],'LineWidth',1.5,'LineStyle','--');
-text(ax,23.5,56,'reflexion','Color',[1 0.5 0.5],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-% BPW34
-xd = 20; yd = 65;
-patch(ax,[xd-1.5 xd+1.5 xd-1.5],[yd-1.8 yd yd+1.8], ...
- [0.2 0.2 0.2],'FaceColor',[0.15 0.15 0.25], ...
- 'EdgeColor',[1 0.8 0.2],'LineWidth',1.5);
-plot(ax,[xd+1.5 xd+1.5],[yd-1.8 yd+1.8],'Color',[1 0.8 0.2],'LineWidth',2);
-plot(ax,[xd-3 xd-1.5],[yd yd],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
-plot(ax,[xd+1.5 xd+3],[yd yd],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
-for ang = [-25 0 25]
- dx_p = 1.8*cosd(ang+180); dy_p = 1.8*sind(ang+180);
- plot(ax,[xd+dx_p xd-0.2],[yd+dy_p yd], ...
- 'Color',[1 0.9 0.3],'LineWidth',1,'LineStyle','--');
-end
-text(ax,xd,yd+4.2,'BPW34','Color',[1.0 0.85 0.15],'FontSize',8.5, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,xd,yd+2.8,'Fotodiodo PIN','Color',[0.7 0.7 0.0],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,xd-3.8,yd+0.3,'K','Color',[0.65 0.65 0.65],'FontSize',7,'FontName','Courier New');
-text(ax,xd+2.5,yd+0.3,'A','Color',[0.65 0.65 0.65],'FontSize',7,'FontName','Courier New');
-
-wire(ax,xd-3,yd,xd-3,Y_VCC); vcc(ax,xd-3,Y_VCC,'+5V');
-wire(ax,xd+3,yd,xd+3,Y_GND); gnd(ax,xd+3,Y_GND);
-text(ax,xd,yd-3.5,'polariz. inversa','Color',[0.5 0.5 0.5],'FontSize',6, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-wire(ax,xd+3,yd,35,yd);
-node(ax,35,yd);
-text(ax,32,yd+1.5,'I_{foto}','Color',[1.0 0.85 0.2],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 2: TIA — LM358
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[35 40 42 36],'EdgeColor',[0.3 0.5 0.8], ...
- 'LineWidth',0.8,'LineStyle',':');
-text(ax,56,77.5,'TIA — LM358','Color',[0.4 0.6 0.9],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-xop=58; yop=56; sz=7;
-patch(ax,[xop-sz xop-sz xop+sz],[yop-sz yop+sz yop], ...
- [0.1 0.1 0.2],'FaceColor',[0.08 0.08 0.18], ...
- 'EdgeColor',[0.4 0.6 1.0],'LineWidth',1.8);
-text(ax,xop-1,yop,'LM358','Color',[0.5 0.7 1.0],'FontSize',7, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-
-xin=xop-sz; yin_n=yop+3.5; yin_p=yop-3.5; yout=yop;
-text(ax,xin-0.6,yin_n,'−','Color',[0.7 0.7 0.9],'FontSize',10,'FontName','Courier New');
-text(ax,xin-0.6,yin_p,'+','Color',[0.7 0.7 0.9],'FontSize',10,'FontName','Courier New');
-
-xout_node = xop+sz+2;
-wire(ax,xop+sz,yout,xout_node,yout);
-
-wire(ax,35,yd,35,yin_n);
-wire(ax,35,yin_n,xin,yin_n);
-node(ax,35,yin_n);
-
-% Retroalimentacion Rf
-wire(ax,xout_node,yout,xout_node,yop+12);
-wire(ax,xout_node,yop+12,xin-2,yop+12);
-wire(ax,xin-2,yop+12,xin-2,yin_n);
-node(ax,xin-2,yin_n);
-node(ax,xout_node,yout);
-dibujar_R(ax,(xout_node+xin-2)/2,yop+12,14,1.8,'R_f','1 MOhm');
-
-% Cf paralelo con Rf
-wire(ax,xout_node,yop+15.5,xin-2,yop+15.5);
-wire(ax,xout_node,yop+12,xout_node,yop+15.5);
-wire(ax,xin-2,yop+12,xin-2,yop+15.5);
-dibujar_C(ax,(xout_node+xin-2)/2,yop+15.5,1.5,2.5,'C_f','100pF');
-
-% Divisor Vref
-wire(ax,xin,yin_p,xin-4,yin_p);
-dibujar_R(ax,xin-8,yin_p,6,1.5,'R1','100k');
-wire(ax,xin-11,yin_p,xin-11,Y_VCC); vcc(ax,xin-11,Y_VCC,'+5V');
-wire(ax,xin-4,yin_p,xin-4,yin_p-3);
-dibujar_R(ax,xin-4,yin_p-6,6,1.5,'R2','100k');
-wire(ax,xin-4,yin_p-9,xin-4,Y_GND); gnd(ax,xin-4,Y_GND);
-node(ax,xin-4,yin_p);
-text(ax,xin-5.5,yin_p+2,'V_{ref}','Color',[0.8 0.5 0.5],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,xin-5.5,yin_p+0.7,'2.5V','Color',[0.6 0.4 0.4],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-wire(ax,xop,yop+sz,xop,Y_VCC); vcc(ax,xop,Y_VCC,'+5V');
-wire(ax,xop,yop-sz,xop,Y_GND); gnd(ax,xop,Y_GND);
-
-text(ax,xout_node+1,yout+1.5,'V_{TIA}','Color',[0.4 0.7 1.0],'FontSize',7.5, ...
- 'HorizontalAlignment','left','FontName','Courier New','FontWeight','bold');
-text(ax,xout_node+1,yout-1.5,'= I x R_f','Color',[0.35 0.55 0.8],'FontSize',6.5, ...
- 'HorizontalAlignment','left','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 3: ACOPLAMIENTO AC
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[78 48 18 16],'EdgeColor',[0.3 0.6 0.6], ...
- 'LineWidth',0.8,'LineStyle',':');
-text(ax,87,65.5,'C_{ac} (bloqueo DC)','Color',[0.35 0.7 0.7],'FontSize',6.8, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-wire(ax,xout_node,yout,79,yout);
-wire(ax,79,yout,79,56);
-wire(ax,79,56,82,56);
-dibujar_C(ax,87,56,1.8,3.5,'C_{ac}','10 uF');
-wire(ax,89,56,93,56);
-wire(ax,93,56,93,52);
-dibujar_R(ax,93,49,5,1.5,'R_{in}','10k');
-wire(ax,93,46,93,Y_GND); gnd(ax,93,Y_GND);
-node(ax,93,56);
-wire(ax,93,56,96,56);
-text(ax,87,53.5,'elimina V_{DC}','Color',[0.35 0.65 0.65],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,87,52.3,'pasa V_{AC}','Color',[0.35 0.65 0.65],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 4: MAX9814
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[96 42 30 36],'EdgeColor',[0.7 0.3 0.9], ...
- 'FaceColor',[0.08 0.04 0.12],'LineWidth',1.8,'Curvature',0.08);
-text(ax,111,79.5,'MAX9814','Color',[0.9 0.5 1.0],'FontSize',10, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,111,77.5,'HiLetgo Module','Color',[0.65 0.35 0.75],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-pins_y = [74 69 64 59 54 49 44];
-pins_lbl = {'VCC','GND','OUT','GAIN','AR','MIC\_IN','MIC\_BIAS'};
-pins_col = {[0.9 0.35 0.35],[0.55 0.55 0.55],[0.3 0.9 0.6], ...
- [0.8 0.8 0.3],[0.7 0.6 0.5],[0.9 0.6 0.3],[0.6 0.5 0.7]};
-for i = 1:length(pins_y)
- plot(ax,[96 99],[pins_y(i) pins_y(i)],'Color',pins_col{i},'LineWidth',1.5);
- plot(ax,97,pins_y(i),'s','MarkerFaceColor',pins_col{i}, ...
- 'MarkerEdgeColor',pins_col{i},'MarkerSize',5);
- text(ax,100.5,pins_y(i),pins_lbl{i},'Color',pins_col{i},'FontSize',7, ...
- 'VerticalAlignment','middle','FontName','Courier New','FontWeight','bold');
-end
-
-wire(ax,96,74,88,74); wire(ax,88,74,88,Y_VCC); vcc(ax,88,Y_VCC,'+5V');
-wire(ax,96,69,88,69); wire(ax,88,69,88,Y_GND); gnd(ax,88,Y_GND);
-wire(ax,96,56,96,49); node(ax,96,56);
-wire(ax,96,59,94,59);
-text(ax,93,59,'NC','Color',[0.5 0.5 0.5],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,91,57.5,'(float=40dB)','Color',[0.55 0.55 0.35],'FontSize',6.2, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-wire(ax,96,54,94,54);
-dibujar_C(ax,92,54,1.5,2.5,'C_{AR}','4.7uF');
-wire(ax,89.5,54,89.5,Y_GND); gnd(ax,89.5,Y_GND);
-plot(ax,[123 127],[64 64],'Color',[0.3 0.9 0.6],'LineWidth',1.8);
-plot(ax,126.5,64,'s','MarkerFaceColor',[0.3 0.9 0.6], ...
- 'MarkerEdgeColor',[0.3 0.9 0.6],'MarkerSize',5);
-text(ax,122,64,'OUT','Color',[0.3 0.9 0.6],'FontSize',7, ...
- 'HorizontalAlignment','right','FontName','Courier New','FontWeight','bold');
-wire(ax,126,64,131,64);
-
-text(ax,113,59,'AGC','Color',[0.8 0.5 0.9],'FontSize',8.5, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,113,57.5,'auto-ganancia','Color',[0.6 0.35 0.7],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,113,56.2,'40 / 50 / 60 dB','Color',[0.6 0.35 0.7],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 5: CAPACITOR DE SALIDA
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[130 56 12 14],'EdgeColor',[0.3 0.5 0.6], ...
- 'LineWidth',0.8,'LineStyle',':');
-text(ax,136,71,'C_{sal}','Color',[0.35 0.6 0.7],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-wire(ax,131,64,133,64);
-dibujar_C(ax,136,64,1.8,3.5,'C_{sal}','47 uF');
-wire(ax,139,64,142,64);
-wire(ax,139,64,139,60);
-dibujar_R(ax,139,57,5,1.5,'R_L','10k');
-wire(ax,139,54,139,Y_GND); gnd(ax,139,Y_GND);
-node(ax,139,64);
-text(ax,136,61.5,'bloquea offset','Color',[0.35 0.55 0.65],'FontSize',6.2, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,136,60.3,'1.25V MAX9814','Color',[0.35 0.55 0.65],'FontSize',6.2, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 6: JACK 3.5mm
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[142 56 16 16],'EdgeColor',[0.3 0.7 0.4], ...
- 'FaceColor',[0.04 0.1 0.06],'LineWidth',1.5,'Curvature',0.1);
-xj=150; yj=64;
-th=linspace(0,2*pi,60);
-plot(ax,xj+2*cos(th),yj+2*sin(th),'Color',[0.4 0.8 0.4],'LineWidth',1.5);
-plot(ax,xj+1*cos(th),yj+1*sin(th),'Color',[0.6 0.9 0.6],'LineWidth',1);
-plot(ax,[xj-2 xj+2],[yj yj],'Color',[0.4 0.8 0.4],'LineWidth',1.5);
-plot(ax,[xj xj],[yj-2 yj+2],'Color',[0.4 0.8 0.4],'LineWidth',1.5);
-wire(ax,142,64,148,64);
-text(ax,150,69.8,'JACK 3.5mm','Color',[0.35 0.85 0.45],'FontSize',7.5, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,150,68.5,'Microfono PC','Color',[0.3 0.65 0.35],'FontSize',6.8, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-wire(ax,150,yj-2,150,Y_GND); gnd(ax,150,Y_GND);
-
-%% ═══════════════════════════════════════════════════════════════
-% BLOQUE 7: PC + MATLAB
-%% ═══════════════════════════════════════════════════════════════
-rectangle(ax,'Position',[154 47 5 26],'EdgeColor',[0.2 0.6 0.8], ...
- 'FaceColor',[0.03 0.08 0.12],'LineWidth',1.5,'Curvature',0.05);
-wire(ax,152,64,154,64);
-plot(ax,[153.5 154.5],[64.4 64],'Color',[0.3 0.75 0.95],'LineWidth',1.5);
-plot(ax,[153.5 154.5],[63.6 64],'Color',[0.3 0.75 0.95],'LineWidth',1.5);
-text(ax,156.5,67,'PC','Color',[0.3 0.75 0.95],'FontSize',8, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-text(ax,156.5,63,'+','Color',[0.25 0.6 0.8],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,156.5,60,'MAT','Color',[0.25 0.6 0.8],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,156.5,58,'LAB','Color',[0.25 0.6 0.8],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-text(ax,156.5,55,'FFT','Color',[0.2 0.5 0.7],'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% FLUJO DE SENAL — debajo del separador (y < 27)
-%% ═══════════════════════════════════════════════════════════════
-y_flow = 23.5;
-puntos_x = [20 35 58 87 111 136 150 156];
-nombres = {'I_{foto}','->V_{TIA}','V_{TIA}','V_{AC}','V_{amp}','V_{out}','V_{PC}','AUDIO'};
-colores = {[1.0 0.85 0.2],[0.4 0.7 1.0],[0.4 0.7 1.0],[0.3 0.8 0.8], ...
- [0.85 0.5 1.0],[0.85 0.5 1.0],[0.35 0.85 0.45],[0.3 0.75 0.95]};
-for i = 1:length(puntos_x)-1
- plot(ax,[puntos_x(i)+0.5 puntos_x(i+1)-0.5],[y_flow y_flow], ...
- 'Color',[0.3 0.3 0.35],'LineWidth',1.2);
- plot(ax,[puntos_x(i+1)-1.2 puntos_x(i+1)-0.3 puntos_x(i+1)-1.2], ...
- [y_flow+0.5 y_flow y_flow-0.5], ...
- 'Color',[0.3 0.3 0.35],'LineWidth',1.2);
-end
-for i = 1:length(puntos_x)
- plot(ax,puntos_x(i),y_flow,'o','MarkerFaceColor',colores{i}, ...
- 'MarkerEdgeColor',colores{i},'MarkerSize',4);
- text(ax,puntos_x(i),y_flow+1.5,nombres{i},'Color',colores{i},'FontSize',6.5, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-end
-text(ax,80,y_flow-1.2,'← Flujo de senal →','Color',[0.4 0.4 0.45],'FontSize',7, ...
- 'HorizontalAlignment','center','FontName','Courier New');
-
-%% ═══════════════════════════════════════════════════════════════
-% TABLA DE VALORES — bien separada abajo del flujo
-%% ═══════════════════════════════════════════════════════════════
-xT = 20; yT = 11; % y=10..21, debajo del flujo (y=23.5)
-rectangle(ax,'Position',[xT yT-1 120 11],'EdgeColor',[0.25 0.25 0.3], ...
- 'FaceColor',[0.07 0.07 0.09],'LineWidth',0.8);
-text(ax,xT+60,yT+9.5,'Valores del circuito','Color',[0.75 0.75 0.8],'FontSize',8.5, ...
- 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
-
-datos = {
- 'BPW34', 'Responsividad:', '0.3 A/W @ 650 nm', [1.0 0.85 0.2];
- 'LM358 TIA', 'Rf = 1 MOhm,', 'Cf = 100 pF', [0.4 0.7 1.0];
- 'C_ac', '10 uF fc =', '1.6 Hz (paso AC)', [0.3 0.8 0.8];
- 'MAX9814', 'Av = 40 dB,', 'AGC automatico', [0.85 0.5 1.0];
- 'C_sal', '47 uF fc =', '0.34 Hz', [0.35 0.7 0.45];
- 'Alimentacion', '+5V + GND,', 'VCC LM358 + laser', [0.9 0.4 0.4];
-};
-col_x = [xT+2, xT+28, xT+60];
-for i = 1:size(datos,1)
- yi = yT + 8.0 - (i-1)*1.55;
- text(ax,col_x(1),yi,datos{i,1},'Color',datos{i,4},'FontSize',7.5, ...
- 'FontWeight','bold','FontName','Courier New');
- text(ax,col_x(2),yi,datos{i,2},'Color',[0.65 0.65 0.65],'FontSize',7.5,'FontName','Courier New');
- text(ax,col_x(3),yi,datos{i,3},'Color',[0.5 0.5 0.55],'FontSize',7.5,'FontName','Courier New');
-end
-
-%% ─── Pie ──────────────────────────────────────────────────────
-plot(ax,[3 157],[9.5 9.5],'Color',[0.2 0.2 0.25],'LineWidth',0.8);
-text(ax,80,1.8, ...
- 'Fisica 2do Semestre | Ondas y Oscilaciones | BPW34 + LM358 + MAX9814 + MATLAB FFT', ...
- 'Color',[0.35 0.35 0.4],'FontSize',7.5,'HorizontalAlignment','center', ...
- 'FontName','Courier New');
-
-fprintf(' Diagrama generado.\n');
-fprintf(' Para guardar: print(gcf,''-dpng'',''-r300'',''diagrama_circuito.png'')\n');
\ No newline at end of file
blob - 72cd55127b1234dc0d40605c3807500ef7cb728e (mode 644)
blob + /dev/null
--- script_prueba_demostracion.m
+++ /dev/null
-%% SCRIPT DE PRUEBA Y DEMOSTRACIÓN
-% Proyecto: Microfono Laser — Reconstruccion de Sonido por Vibracion de Vidrio
-% Hardware: Laser KY-008 → vidrio vibrante → BPW34 → TIA LM358 → MAX9814 → PC
-% Metodo: FFT + filtrado espectral + IFFT
-%
-% Fisica 2do Semestre — Ondas, Oscilaciones y Espacios Vectoriales
-% Autor: Alejandro B. E.
-
-clear all; close all; clc;
-
-fprintf('╔════════════════════════════════════════════════════════════════╗\n');
-fprintf('║ SISTEMA DE RECONSTRUCCIÓN DE SONIDO CON LÁSER Y FOTOSENSOR ║\n');
-fprintf('║ Fisica 2do Semestre - Ondas, Oscilaciones y Espacios Vect. ║\n');
-fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
-
-%% ========================================================================
-% PARÁMETROS DEL SISTEMA
-%% ========================================================================
-fprintf('CONFIGURANDO PARÁMETROS DEL SISTEMA...\n');
-
-fs = 44100; % Hz — frecuencia de muestreo
-duracion = 3; % s
-t = (0:1/fs:duracion-1/fs)';
-
-% ── Parámetros del pipeline optico-electronico ───────────────────────────
-% BPW34 (fotodiodo PIN, 650 nm)
-R_bpw34 = 0.3; % A/W — responsividad @ 650 nm
-P_laser = 0.5e-3; % W — potencia laser KY-008
-
-% Profundidad de modulacion del vidrio vibrante
-% El sonido dentro de la caja hace vibrar el vidrio, que modula el reflejo
-mod_depth = 0.15; % — — 15% (vidrio de ~2mm, bocina a ~10cm)
-
-% TIA LM358
-Rf_TIA = 10e3; % Ω — resistencia de retroalimentacion
-
-% MAX9814 (GAIN flotante = 40 dB = Av~100, pero con AGC activo
-% la ganancia efectiva baja para señales grandes — usamos Av=3 ~10dB)
-Av_MAX = 3; % V/V
-
-% Ruido del BPW34 (shot noise — mucho menor que un LDR)
-% BPW34 tiene I_dark ~ 2nA — ruido RMS equivalente en voltaje << 1 mV
-ruido_fotosensor = 0.008; % fraccion de la señal (0.8%)
-
-% Ganancia total del sistema
-G_sistema = mod_depth * R_bpw34 * P_laser * Rf_TIA * Av_MAX;
-
-fprintf(' Frecuencia de muestreo : %d Hz\n', fs);
-fprintf(' Duracion : %.1f s\n', duracion);
-fprintf(' Muestras : %d\n', length(t));
-fprintf(' BPW34 responsividad : %.1f A/W @ 650nm\n', R_bpw34);
-fprintf(' Laser potencia : %.1f mW\n', P_laser*1e3);
-fprintf(' TIA Rf : %.0f kOhm\n', Rf_TIA/1e3);
-fprintf(' MAX9814 ganancia : %.0f V/V (~%.0f dB)\n', Av_MAX, 20*log10(Av_MAX));
-fprintf(' Profundidad modulacion : %.0f%%\n', mod_depth*100);
-fprintf(' Ganancia total sistema : %.4f V/V\n', G_sistema);
-fprintf(' Ruido (BPW34+TIA) : %.1f%% de la senal\n\n', ruido_fotosensor*100);
-
-%% ========================================================================
-% FUNCIÓN: simular pipeline BPW34 → TIA → MAX9814
-%% ========================================================================
-% Modela la cadena completa de transduccion optico-electronica.
-% Entrada: señal de audio normalizada (-1 a 1)
-% Salida: voltaje a la salida del MAX9814 (como llegaría al jack del PC)
-
- function v_out = pipeline_sensor(audio, P_laser, mod_depth, ...
- R_bpw34, Rf_TIA, Av_MAX, ruido)
- % 1. Modulacion optica: el vidrio vibrante modula el reflejo del laser
- P_luz = P_laser * (1 + mod_depth * audio);
-
- % 2. BPW34: fotocorriente = responsividad × potencia + ruido shot
- I_foto = R_bpw34 * P_luz + ruido * 1e-4 * randn(size(audio));
-
- % 3. TIA (LM358): I → V, luego eliminar offset DC
- % En hardware el capacitor C_ac bloquea el DC
- V_tia = I_foto * Rf_TIA;
- V_tia = V_tia - mean(V_tia);
-
- % 4. MAX9814: amplificar y saturar (±1.65V, alimentado a 3.3V)
- V_max = Av_MAX * V_tia;
- v_out = max(-1.65, min(1.65, V_max));
- end
-
-%% ========================================================================
-% PRUEBA 1: GENERACIÓN DE SEÑALES ACÚSTICAS
-%% ========================================================================
-fprintf('╭─ PRUEBA 1: GENERACIÓN DE SEÑALES ACÚSTICAS\n');
-
-fprintf(' Generando tono puro (1000 Hz)...\n');
-f_puro = 1000;
-senial_pura = 0.5 * sin(2*pi*f_puro*t);
-senial_pura_ruidosa = pipeline_sensor(senial_pura, P_laser, mod_depth, ...
- R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
-
-fprintf(' Generando acorde musical (Do Mayor: 262-330-392 Hz)...\n');
-f_do = 262; f_mi = 330; f_sol = 392;
-senial_acorde = 0.3*sin(2*pi*f_do*t) + ...
- 0.3*sin(2*pi*f_mi*t) + ...
- 0.3*sin(2*pi*f_sol*t);
-senial_acorde_ruidosa = pipeline_sensor(senial_acorde, P_laser, mod_depth, ...
- R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
-
-fprintf(' Generando barrido de frecuencia (100-1000 Hz)...\n');
-senial_chirp = chirp(t, 100, duracion, 1000, 'linear') * 0.5;
-senial_chirp_ruidosa = pipeline_sensor(senial_chirp, P_laser, mod_depth, ...
- R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
-
-fprintf(' Generando senal compleja (multiples armonicos)...\n');
-senial_compleja = zeros(size(t));
-for k = 1:5
- senial_compleja = senial_compleja + (1/k) * sin(2*pi*f_do*k*t);
-end
-senial_compleja = senial_compleja * 0.5;
-senial_compleja_ruidosa = pipeline_sensor(senial_compleja, P_laser, mod_depth, ...
- R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
-
-fprintf('╰─ Completado: 4 tipos de senales generadas con pipeline BPW34→TIA→MAX9814\n\n');
-
-%% ========================================================================
-% PRUEBA 2: ANÁLISIS ESPECTRAL (FFT)
-%% ========================================================================
-fprintf('╭─ PRUEBA 2: ANÁLISIS ESPECTRAL (TRANSFORMADA DE FOURIER)\n');
-
-[f1, mag1, ~] = calcular_fft_sistema(senial_pura_ruidosa, fs);
-[f2, mag2, ~] = calcular_fft_sistema(senial_acorde_ruidosa, fs);
-[f3, mag3, ~] = calcular_fft_sistema(senial_chirp_ruidosa, fs);
-[f4, mag4, ~] = calcular_fft_sistema(senial_compleja_ruidosa, fs);
-
-fprintf(' Identificando componentes principales:\n\n');
-
-[~, idx] = findpeaks(mag1, 'MinPeakHeight', max(mag1)*0.2);
-fprintf(' Tono puro (1000 Hz):\n');
-fprintf(' Picos detectados: %s Hz\n', sprintf('%.0f ', f1(idx)));
-
-[~, idx] = findpeaks(mag2, 'MinPeakHeight', max(mag2)*0.2);
-fprintf(' Acorde (262, 330, 392 Hz):\n');
-fprintf(' Picos detectados: %s Hz\n', sprintf('%.0f ', f2(idx)));
-
-fprintf('╰─ Completado: FFT calculado para todas las senales\n\n');
-
-%% ========================================================================
-% PRUEBA 3: DESCOMPOSICIÓN EN VALORES SINGULARES (SVD)
-%% ========================================================================
-fprintf('╭─ PRUEBA 3: ANÁLISIS SVD (ESPACIOS VECTORIALES)\n');
-
-[U1, S1, V1, var1] = analizar_svd(senial_pura_ruidosa);
-[U2, S2, V2, var2] = analizar_svd(senial_acorde_ruidosa);
-[U3, S3, V3, var3] = analizar_svd(senial_chirp_ruidosa);
-[U4, S4, V4, var4] = analizar_svd(senial_compleja_ruidosa);
-
-fprintf(' Rangos numericos de matrices de trayectoria:\n\n');
-fprintf(' Tono puro: rango = %d, varianza en 5 modos = %.1f%%\n', ...
- rank(U1*S1*V1'), var1(min(5, length(var1))));
-fprintf(' Acorde: rango = %d, varianza en 5 modos = %.1f%%\n', ...
- rank(U2*S2*V2'), var2(min(5, length(var2))));
-fprintf(' Barrido: rango = %d, varianza en 5 modos = %.1f%%\n', ...
- rank(U3*S3*V3'), var3(min(5, length(var3))));
-fprintf(' Compleja: rango = %d, varianza en 5 modos = %.1f%%\n', ...
- rank(U4*S4*V4'), var4(min(5, length(var4))));
-
-fprintf('\n Interpretacion:\n');
-fprintf(' - Mayor rango = mas informacion, menor redundancia\n');
-fprintf(' - Tono puro: bajo rango (senal simple)\n');
-fprintf(' - Acorde: rango moderado (3 componentes)\n');
-fprintf(' - Barrido: alto rango (contenido variante)\n');
-fprintf(' - Compleja: alto rango (muchos armonicos)\n');
-fprintf('╰─ Completado: Analisis SVD realizado\n\n');
-
-%% ========================================================================
-% PRUEBA 4: FILTRADO Y RECONSTRUCCIÓN
-%% ========================================================================
-fprintf('╭─ PRUEBA 4: FILTRADO Y RECONSTRUCCIÓN DE SEÑALES\n');
-
-fprintf(' Reconstruyendo senales usando filtrado FFT...\n');
-senial_pura_rec = reconstruir_por_fft(senial_pura_ruidosa);
-senial_acorde_rec = reconstruir_por_fft(senial_acorde_ruidosa);
-senial_chirp_rec = reconstruir_por_fft(senial_chirp_ruidosa);
-senial_compleja_rec = reconstruir_por_fft(senial_compleja_ruidosa);
-
-fprintf(' Calculando metricas de error:\n\n');
-
-[err1, snr1, cor1] = calcular_metricas(senial_pura, senial_pura_rec);
-[err2, snr2, cor2] = calcular_metricas(senial_acorde, senial_acorde_rec);
-[err3, snr3, cor3] = calcular_metricas(senial_chirp, senial_chirp_rec);
-[err4, snr4, cor4] = calcular_metricas(senial_compleja, senial_compleja_rec);
-
-fprintf(' Tono puro: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err1, snr1, cor1);
-fprintf(' Acorde: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err2, snr2, cor2);
-fprintf(' Barrido: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err3, snr3, cor3);
-fprintf(' Compleja: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err4, snr4, cor4);
-fprintf('╰─ Completado: Reconstruccion y validacion\n\n');
-
-%% ========================================================================
-% PRUEBA 5: VISUALIZACIÓN INTEGRAL
-%% ========================================================================
-fprintf('╭─ PRUEBA 5: VISUALIZACIÓN DE RESULTADOS\n');
-
-figure('Name','Sistema Laser-Fotosensor — Resultados Completos', ...
- 'Position',[100 100 1400 1000]);
-
-t_zoom = t(1:2000);
-
-% ── TONO PURO ─────────────────────────────────────────────────────────────
-subplot(4,4,1);
-plot(t_zoom, senial_pura(1:2000), 'b-', 'LineWidth', 1.5);
-title('Tono Puro — Senal Ideal','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,2);
-h = plot(t_zoom, senial_pura_ruidosa(1:2000), 'b-', 'LineWidth', 0.8);
-h.Color(4) = 0.6;
-title('Tono Puro — Sensor (BPW34→MAX9814)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
-
-subplot(4,4,3);
-plot(t_zoom, senial_pura_rec(1:2000), 'g-', 'LineWidth', 1.5);
-title('Tono Puro — Reconstruido (IFFT)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,4);
-rango_f = f1 <= 2000;
-stem(f1(rango_f), mag1(rango_f), 'filled', 'MarkerSize', 4);
-title(sprintf('FFT Tono Puro\nSNR = %.1f dB', snr1),'FontWeight','bold');
-xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
-
-% ── ACORDE ────────────────────────────────────────────────────────────────
-subplot(4,4,5);
-plot(t_zoom, senial_acorde(1:2000), 'r-', 'LineWidth', 1.5);
-title('Acorde — Senal Ideal','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,6);
-h = plot(t_zoom, senial_acorde_ruidosa(1:2000), 'r-', 'LineWidth', 0.8);
-h.Color(4) = 0.6;
-title('Acorde — Sensor (BPW34→MAX9814)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
-
-subplot(4,4,7);
-plot(t_zoom, senial_acorde_rec(1:2000), 'g-', 'LineWidth', 1.5);
-title('Acorde — Reconstruido (IFFT)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,8);
-rango_f = f2 <= 1000;
-stem(f2(rango_f), mag2(rango_f), 'filled', 'MarkerSize', 4);
-title(sprintf('FFT Acorde (Do Mayor)\nSNR = %.1f dB', snr2),'FontWeight','bold');
-xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
-
-% ── BARRIDO ───────────────────────────────────────────────────────────────
-subplot(4,4,9);
-plot(t_zoom, senial_chirp(1:2000), 'm-', 'LineWidth', 1.5);
-title('Barrido — Senal Ideal','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,10);
-h = plot(t_zoom, senial_chirp_ruidosa(1:2000), 'm-', 'LineWidth', 0.8);
-h.Color(4) = 0.6;
-title('Barrido — Sensor (BPW34→MAX9814)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
-
-subplot(4,4,11);
-plot(t_zoom, senial_chirp_rec(1:2000), 'g-', 'LineWidth', 1.5);
-title('Barrido — Reconstruido (IFFT)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,12);
-rango_f = f3 <= 2000;
-stem(f3(rango_f), mag3(rango_f), 'filled', 'MarkerSize', 4);
-title(sprintf('FFT Barrido 100-1000Hz\nSNR = %.1f dB', snr3),'FontWeight','bold');
-xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
-
-% ── SEÑAL COMPLEJA ────────────────────────────────────────────────────────
-subplot(4,4,13);
-plot(t_zoom, senial_compleja(1:2000), 'c-', 'LineWidth', 1.5);
-title('Compleja — Senal Ideal','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,14);
-h = plot(t_zoom, senial_compleja_ruidosa(1:2000), 'c-', 'LineWidth', 0.8);
-h.Color(4) = 0.6;
-title('Compleja — Sensor (BPW34→MAX9814)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
-
-subplot(4,4,15);
-plot(t_zoom, senial_compleja_rec(1:2000), 'g-', 'LineWidth', 1.5);
-title('Compleja — Reconstruido (IFFT)','FontWeight','bold');
-xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
-
-subplot(4,4,16);
-rango_f = f4 <= 2000;
-stem(f4(rango_f), mag4(rango_f), 'filled', 'MarkerSize', 4);
-title(sprintf('FFT Compleja (5 armonicos)\nSNR = %.1f dB', snr4),'FontWeight','bold');
-xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
-
-sgtitle('Sistema Microfono Laser: BPW34 → TIA LM358 → MAX9814 → MATLAB FFT', ...
- 'FontWeight','bold','FontSize',12);
-
-fprintf(' Visualizacion generada\n');
-fprintf('╰─ Completado: Graficos de resultados\n\n');
-
-%% ========================================================================
-% PRUEBA 6: ANÁLISIS SVD DETALLADO
-%% ========================================================================
-fprintf('╭─ PRUEBA 6: ANÁLISIS DETALLADO SVD — ESPACIOS VECTORIALES\n');
-
-figure('Name','Analisis SVD — Espacios Vectoriales');
-
-subplot(2,2,1);
-semilogy(diag(S1), 'bo-', 'LineWidth', 2, 'MarkerSize', 6);
-xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
-title('SVD — Tono Puro (bajo rango)','FontWeight','bold'); grid on;
-
-subplot(2,2,2);
-semilogy(diag(S2), 'ro-', 'LineWidth', 2, 'MarkerSize', 6);
-xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
-title('SVD — Acorde (3 componentes)','FontWeight','bold'); grid on;
-
-subplot(2,2,3);
-semilogy(diag(S3), 'mo-', 'LineWidth', 2, 'MarkerSize', 6);
-xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
-title('SVD — Barrido (alto rango)','FontWeight','bold'); grid on;
-
-subplot(2,2,4);
-semilogy(diag(S4), 'co-', 'LineWidth', 2, 'MarkerSize', 6);
-xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
-title('SVD — Compleja (muchos armonicos)','FontWeight','bold'); grid on;
-
-sgtitle('Descomposicion SVD de la Matriz de Trayectoria', ...
- 'FontWeight','bold','FontSize',12);
-
-fprintf(' Analisis SVD visualizado\n');
-fprintf('╰─ Completado: Estudio de descomposicion matricial\n\n');
-
-%% ========================================================================
-% RESUMEN FINAL
-%% ========================================================================
-fprintf('╔════════════════════════════════════════════════════════════════╗\n');
-fprintf('║ RESUMEN DE RESULTADOS ║\n');
-fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
-
-tabla = array2table(...
- [1000, err1, snr1, cor1; ...
- 262, err2, snr2, cor2; ...
- 100, err3, snr3, cor3; ...
- 262, err4, snr4, cor4], ...
- 'VariableNames', {'Frecuencia_Hz','Error_RMS','SNR_dB','Correlacion'}, ...
- 'RowNames', {'Tono Puro','Acorde','Barrido','Compleja'});
-
-disp(tabla);
-
-fprintf('\nINTERPRETACION:\n');
-fprintf(' Error RMS : diferencia entre original y reconstruida\n');
-fprintf(' SNR (dB) : razon senal-ruido en la reconstruccion\n');
-fprintf(' Correlacion : 1.0 = perfecta, 0.0 = sin relacion\n');
-fprintf('\n Pipeline simulado: Laser KY-008 → vidrio vibrante → BPW34\n');
-fprintf(' → TIA LM358 (Rf=%.0fkOhm) → MAX9814 (Av=%.0f)\n', ...
- Rf_TIA/1e3, Av_MAX);
-fprintf(' → jack PC → MATLAB FFT\n');
-
-fprintf('\n╔════════════════════════════════════════════════════════════════╗\n');
-fprintf('║ PRUEBAS COMPLETADAS EXITOSAMENTE ║\n');
-fprintf('║ ║\n');
-fprintf('║ Sistema listo para usar con datos reales del fotosensor ║\n');
-fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
-
-fprintf('Archivos generados:\n');
-fprintf(' %d figuras con resultados\n', length(findobj('Type','figure')));
-fprintf(' Datos de prueba en memoria (variables: senial_*)\n');
-fprintf(' Metricas de validacion calculadas\n');
-
-%% ========================================================================
-% FUNCIONES LOCALES (siempre al final del script)
-%% ========================================================================
-
-function [f, mag, Y] = calcular_fft_sistema(senial, fs)
- N = length(senial);
- Y = fft(senial);
- mag = abs(Y(1:N/2)) / N;
- f = fs * (0:N/2-1) / N;
-end
-
-function [U, S, V, varianza_ac] = analizar_svd(senial)
- ventana = max(2, round(length(senial) / 100));
- cols = length(senial) - ventana + 1;
- M = zeros(ventana, cols);
- for i = 1:ventana
- M(i,:) = senial(i : i + cols - 1)';
- end
- [U, S, V] = svd(M, 'econ');
- sv = diag(S);
- varianza_ac = cumsum(sv.^2) / sum(sv.^2) * 100;
-end
-
-function senial_rec = reconstruir_por_fft(senial_ruidosa)
- N = length(senial_ruidosa);
- Y = fft(senial_ruidosa);
- mag_pos = abs(Y(1 : floor(N/2) + 1));
- umbral = max(mag_pos) * 0.1;
-
- mascara_pos = double(mag_pos > umbral);
- mascara = zeros(N, 1);
- mascara(1:floor(N/2)+1) = mascara_pos;
- mascara(floor(N/2)+2:N) = flipud(mascara_pos(2:floor(N/2)));
-
- senial_rec = real(ifft(Y .* mascara));
-end
-
-function [error_rms, snr_val, correlacion] = calcular_metricas(original, reconstruida)
- factor = (original' * reconstruida) / (reconstruida' * reconstruida);
- rec_scaled = reconstruida * factor;
-
- error_rms = sqrt(mean((original - rec_scaled).^2));
- pot = mean(original.^2);
-
- if pot > 0 && error_rms > 0
- snr_val = 10 * log10(pot / error_rms^2);
- else
- snr_val = Inf;
- end
-
- correlacion = (original' * rec_scaled) / (norm(original) * norm(rec_scaled));
-end
\ No newline at end of file
blob - /dev/null
blob + c578a92abb852e7ed90dbc89daf0ec4004ff5b1c (mode 644)
--- /dev/null
+++ Scripts/diagrama_circuito.m
+%% DIAGRAMA DE CIRCUITO — Microfono Laser
+% BPW34 → TIA (LM358) → C_ac → MAX9814 → Jack PC
+%
+% Autor: Alejandro B. E. — Fisica 2do Semestre
+
+clear; close all; clc;
+
+fig = figure('Name','Diagrama de Circuito — Microfono Laser', ...
+ 'NumberTitle','off','Position',[40 40 1600 900], ...
+ 'Color',[0.07 0.07 0.10]);
+
+ax = axes('Position',[0 0 1 1],'Color',[0.07 0.07 0.10]);
+hold(ax,'on'); axis(ax,'off');
+xlim(ax,[0 160]); ylim(ax,[0 95]);
+
+%% ─── HELPERS ────────────────────────────────────────────────────
+
+ function wire(ax,x1,y1,x2,y2,col,lw)
+ if nargin<6, col=[0.85 0.85 0.85]; end
+ if nargin<7, lw=1.4; end
+ plot(ax,[x1 x2],[y1 y2],'Color',col,'LineWidth',lw);
+ end
+
+ function node(ax,x,y,col)
+ if nargin<4, col=[0.85 0.85 0.85]; end
+ plot(ax,x,y,'o','MarkerFaceColor',col,'MarkerEdgeColor',col,'MarkerSize',5);
+ end
+
+ function dibujar_R(ax,xc,yc,W,H,lbl_txt,val_txt)
+ xs = xc - W/2;
+ xx = linspace(xs, xs+W, 9);
+ yy = yc + H/2 * [0 1 -1 1 -1 1 -1 1 0];
+ plot(ax,xx,yy,'Color',[0.9 0.6 0.2],'LineWidth',1.5);
+ plot(ax,[xc-W/2-1.5 xc-W/2],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+ plot(ax,[xc+W/2 xc+W/2+1.5],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+ text(ax,xc,yc+H*0.9+0.3,lbl_txt,'Color',[0.9 0.7 0.3],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
+ text(ax,xc,yc-H*0.9-0.5,val_txt,'Color',[0.65 0.65 0.65],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+ end
+
+ function dibujar_C(ax,xc,yc,gap,H,lbl_txt,val_txt)
+ g = gap/2;
+ plot(ax,[xc-g xc-g],[yc-H/2 yc+H/2],'Color',[0.3 0.75 1.0],'LineWidth',2.2);
+ plot(ax,[xc+g xc+g],[yc-H/2 yc+H/2],'Color',[0.3 0.75 1.0],'LineWidth',2.2);
+ plot(ax,[xc-g-2 xc-g],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+ plot(ax,[xc+g xc+g+2],[yc yc],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+ text(ax,xc,yc+H/2+0.9,lbl_txt,'Color',[0.3 0.85 1.0],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
+ text(ax,xc,yc-H/2-1.2,val_txt,'Color',[0.55 0.55 0.65],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+ end
+
+ function gnd(ax,x,y)
+ plot(ax,[x x],[y y-1.2],'Color',[0.55 0.55 0.55],'LineWidth',1.3);
+ w = [2.2 1.5 0.7];
+ for i=1:3
+ plot(ax,[x-w(i) x+w(i)],[y-1.2-(i-1)*0.7 y-1.2-(i-1)*0.7], ...
+ 'Color',[0.55 0.55 0.55],'LineWidth',1.2);
+ end
+ end
+
+ function vcc(ax,x,y,lbl_txt)
+ if nargin<4, lbl_txt='+5V'; end
+ plot(ax,[x x],[y y+1.5],'Color',[0.9 0.35 0.35],'LineWidth',1.3);
+ plot(ax,[x-1.2 x+1.2],[y+1.5 y+1.5],'Color',[0.9 0.35 0.35],'LineWidth',2);
+ text(ax,x,y+2.8,lbl_txt,'Color',[0.95 0.4 0.4],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
+ end
+
+%% ─── LAYOUT: el circuito ocupa y=30..92, tabla y=2..17 ─────────
+% GND rail en y=30 (antes 18) — deja espacio para tabla abajo
+Y_GND = 30; % rail GND
+Y_VCC = 82; % rail +5V
+Y_UP = 12; % desplazamiento vertical respecto a version anterior (+12)
+
+%% ═══════════════════════════════════════════════════════════════
+% TITULO
+%% ═══════════════════════════════════════════════════════════════
+text(ax,80,93,'Diagrama de Circuito — Microfono Laser', ...
+ 'Color',[1 0.75 0.15],'FontSize',14,'HorizontalAlignment','center', ...
+ 'FontWeight','bold','FontName','Courier New');
+text(ax,80,90,'BPW34 → TIA LM358 → C_{ac} → MAX9814 → Jack PC → MATLAB FFT', ...
+ 'Color',[0.6 0.6 0.6],'FontSize',9,'HorizontalAlignment','center', ...
+ 'FontName','Courier New');
+plot(ax,[3 157],[87.5 87.5],'Color',[0.25 0.25 0.3],'LineWidth',0.8);
+
+%% ═══════════════════════════════════════════════════════════════
+% RAILS
+%% ═══════════════════════════════════════════════════════════════
+plot(ax,[5 155],[Y_VCC Y_VCC],'Color',[0.7 0.2 0.2],'LineWidth',1,'LineStyle','--');
+text(ax,4,Y_VCC+0.6,'+5V','Color',[0.9 0.4 0.4],'FontSize',7,'FontName','Courier New');
+plot(ax,[5 155],[Y_GND Y_GND],'Color',[0.4 0.4 0.4],'LineWidth',1,'LineStyle','--');
+text(ax,4,Y_GND-0.8,'GND','Color',[0.55 0.55 0.55],'FontSize',7,'FontName','Courier New');
+
+% Separador entre circuito y tabla
+plot(ax,[3 157],[27.5 27.5],'Color',[0.2 0.2 0.25],'LineWidth',1.2);
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 1: SENSOR OPTICO (y += 12 respecto a version anterior)
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[5 42 28 30],'EdgeColor',[0.4 0.4 0.5], ...
+ 'LineWidth',0.8,'LineStyle',':');
+text(ax,19,73.5,'SENSOR OPTICO','Color',[0.5 0.5 0.6],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+% Laser KY-008
+rectangle(ax,'Position',[7 44 8 6],'EdgeColor',[0.3 0.9 0.3], ...
+ 'FaceColor',[0.05 0.15 0.05],'LineWidth',1.3,'Curvature',0.2);
+text(ax,11,47.2,'LASER','Color',[0.3 1.0 0.3],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,11,45.8,'KY-008','Color',[0.3 0.7 0.3],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,11,44.6,'650 nm','Color',[0.5 0.5 0.5],'FontSize',6, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+% Haz laser
+x_beam = linspace(15,25,60);
+y_beam = 47 + 0.15*sin(linspace(0,6*pi,60));
+plot(ax,x_beam,y_beam,'Color',[1 0.2 0.2],'LineWidth',1.8);
+text(ax,20,48.3,'haz 650nm','Color',[1 0.4 0.4],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+% Vidrio
+plot(ax,[26 26],[40 56],'Color',[0.4 0.75 1.0],'LineWidth',3);
+plot(ax,[26.8 26.8],[40 56],'Color',[0.3 0.6 0.9],'LineWidth',1);
+text(ax,26,57.2,'VIDRIO','Color',[0.4 0.85 1.0],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
+text(ax,26,56.0,'(vibra con','Color',[0.4 0.7 0.85],'FontSize',6.2, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,26,55.0,'el sonido)','Color',[0.4 0.7 0.85],'FontSize',6.2, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+% Reflexion
+x_ref = linspace(27,22,30);
+y_ref = linspace(47,62,30);
+plot(ax,x_ref,y_ref,'Color',[1 0.4 0.4],'LineWidth',1.5,'LineStyle','--');
+text(ax,23.5,56,'reflexion','Color',[1 0.5 0.5],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+% BPW34
+xd = 20; yd = 65;
+patch(ax,[xd-1.5 xd+1.5 xd-1.5],[yd-1.8 yd yd+1.8], ...
+ [0.2 0.2 0.2],'FaceColor',[0.15 0.15 0.25], ...
+ 'EdgeColor',[1 0.8 0.2],'LineWidth',1.5);
+plot(ax,[xd+1.5 xd+1.5],[yd-1.8 yd+1.8],'Color',[1 0.8 0.2],'LineWidth',2);
+plot(ax,[xd-3 xd-1.5],[yd yd],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+plot(ax,[xd+1.5 xd+3],[yd yd],'Color',[0.85 0.85 0.85],'LineWidth',1.4);
+for ang = [-25 0 25]
+ dx_p = 1.8*cosd(ang+180); dy_p = 1.8*sind(ang+180);
+ plot(ax,[xd+dx_p xd-0.2],[yd+dy_p yd], ...
+ 'Color',[1 0.9 0.3],'LineWidth',1,'LineStyle','--');
+end
+text(ax,xd,yd+4.2,'BPW34','Color',[1.0 0.85 0.15],'FontSize',8.5, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,xd,yd+2.8,'Fotodiodo PIN','Color',[0.7 0.7 0.0],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,xd-3.8,yd+0.3,'K','Color',[0.65 0.65 0.65],'FontSize',7,'FontName','Courier New');
+text(ax,xd+2.5,yd+0.3,'A','Color',[0.65 0.65 0.65],'FontSize',7,'FontName','Courier New');
+
+wire(ax,xd-3,yd,xd-3,Y_VCC); vcc(ax,xd-3,Y_VCC,'+5V');
+wire(ax,xd+3,yd,xd+3,Y_GND); gnd(ax,xd+3,Y_GND);
+text(ax,xd,yd-3.5,'polariz. inversa','Color',[0.5 0.5 0.5],'FontSize',6, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+wire(ax,xd+3,yd,35,yd);
+node(ax,35,yd);
+text(ax,32,yd+1.5,'I_{foto}','Color',[1.0 0.85 0.2],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New','FontWeight','bold');
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 2: TIA — LM358
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[35 40 42 36],'EdgeColor',[0.3 0.5 0.8], ...
+ 'LineWidth',0.8,'LineStyle',':');
+text(ax,56,77.5,'TIA — LM358','Color',[0.4 0.6 0.9],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+xop=58; yop=56; sz=7;
+patch(ax,[xop-sz xop-sz xop+sz],[yop-sz yop+sz yop], ...
+ [0.1 0.1 0.2],'FaceColor',[0.08 0.08 0.18], ...
+ 'EdgeColor',[0.4 0.6 1.0],'LineWidth',1.8);
+text(ax,xop-1,yop,'LM358','Color',[0.5 0.7 1.0],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+
+xin=xop-sz; yin_n=yop+3.5; yin_p=yop-3.5; yout=yop;
+text(ax,xin-0.6,yin_n,'−','Color',[0.7 0.7 0.9],'FontSize',10,'FontName','Courier New');
+text(ax,xin-0.6,yin_p,'+','Color',[0.7 0.7 0.9],'FontSize',10,'FontName','Courier New');
+
+xout_node = xop+sz+2;
+wire(ax,xop+sz,yout,xout_node,yout);
+
+wire(ax,35,yd,35,yin_n);
+wire(ax,35,yin_n,xin,yin_n);
+node(ax,35,yin_n);
+
+% Retroalimentacion Rf
+wire(ax,xout_node,yout,xout_node,yop+12);
+wire(ax,xout_node,yop+12,xin-2,yop+12);
+wire(ax,xin-2,yop+12,xin-2,yin_n);
+node(ax,xin-2,yin_n);
+node(ax,xout_node,yout);
+dibujar_R(ax,(xout_node+xin-2)/2,yop+12,14,1.8,'R_f','1 MOhm');
+
+% Cf paralelo con Rf
+wire(ax,xout_node,yop+15.5,xin-2,yop+15.5);
+wire(ax,xout_node,yop+12,xout_node,yop+15.5);
+wire(ax,xin-2,yop+12,xin-2,yop+15.5);
+dibujar_C(ax,(xout_node+xin-2)/2,yop+15.5,1.5,2.5,'C_f','100pF');
+
+% Divisor Vref
+wire(ax,xin,yin_p,xin-4,yin_p);
+dibujar_R(ax,xin-8,yin_p,6,1.5,'R1','100k');
+wire(ax,xin-11,yin_p,xin-11,Y_VCC); vcc(ax,xin-11,Y_VCC,'+5V');
+wire(ax,xin-4,yin_p,xin-4,yin_p-3);
+dibujar_R(ax,xin-4,yin_p-6,6,1.5,'R2','100k');
+wire(ax,xin-4,yin_p-9,xin-4,Y_GND); gnd(ax,xin-4,Y_GND);
+node(ax,xin-4,yin_p);
+text(ax,xin-5.5,yin_p+2,'V_{ref}','Color',[0.8 0.5 0.5],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,xin-5.5,yin_p+0.7,'2.5V','Color',[0.6 0.4 0.4],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+wire(ax,xop,yop+sz,xop,Y_VCC); vcc(ax,xop,Y_VCC,'+5V');
+wire(ax,xop,yop-sz,xop,Y_GND); gnd(ax,xop,Y_GND);
+
+text(ax,xout_node+1,yout+1.5,'V_{TIA}','Color',[0.4 0.7 1.0],'FontSize',7.5, ...
+ 'HorizontalAlignment','left','FontName','Courier New','FontWeight','bold');
+text(ax,xout_node+1,yout-1.5,'= I x R_f','Color',[0.35 0.55 0.8],'FontSize',6.5, ...
+ 'HorizontalAlignment','left','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 3: ACOPLAMIENTO AC
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[78 48 18 16],'EdgeColor',[0.3 0.6 0.6], ...
+ 'LineWidth',0.8,'LineStyle',':');
+text(ax,87,65.5,'C_{ac} (bloqueo DC)','Color',[0.35 0.7 0.7],'FontSize',6.8, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+wire(ax,xout_node,yout,79,yout);
+wire(ax,79,yout,79,56);
+wire(ax,79,56,82,56);
+dibujar_C(ax,87,56,1.8,3.5,'C_{ac}','10 uF');
+wire(ax,89,56,93,56);
+wire(ax,93,56,93,52);
+dibujar_R(ax,93,49,5,1.5,'R_{in}','10k');
+wire(ax,93,46,93,Y_GND); gnd(ax,93,Y_GND);
+node(ax,93,56);
+wire(ax,93,56,96,56);
+text(ax,87,53.5,'elimina V_{DC}','Color',[0.35 0.65 0.65],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,87,52.3,'pasa V_{AC}','Color',[0.35 0.65 0.65],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 4: MAX9814
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[96 42 30 36],'EdgeColor',[0.7 0.3 0.9], ...
+ 'FaceColor',[0.08 0.04 0.12],'LineWidth',1.8,'Curvature',0.08);
+text(ax,111,79.5,'MAX9814','Color',[0.9 0.5 1.0],'FontSize',10, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,111,77.5,'HiLetgo Module','Color',[0.65 0.35 0.75],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+pins_y = [74 69 64 59 54 49 44];
+pins_lbl = {'VCC','GND','OUT','GAIN','AR','MIC\_IN','MIC\_BIAS'};
+pins_col = {[0.9 0.35 0.35],[0.55 0.55 0.55],[0.3 0.9 0.6], ...
+ [0.8 0.8 0.3],[0.7 0.6 0.5],[0.9 0.6 0.3],[0.6 0.5 0.7]};
+for i = 1:length(pins_y)
+ plot(ax,[96 99],[pins_y(i) pins_y(i)],'Color',pins_col{i},'LineWidth',1.5);
+ plot(ax,97,pins_y(i),'s','MarkerFaceColor',pins_col{i}, ...
+ 'MarkerEdgeColor',pins_col{i},'MarkerSize',5);
+ text(ax,100.5,pins_y(i),pins_lbl{i},'Color',pins_col{i},'FontSize',7, ...
+ 'VerticalAlignment','middle','FontName','Courier New','FontWeight','bold');
+end
+
+wire(ax,96,74,88,74); wire(ax,88,74,88,Y_VCC); vcc(ax,88,Y_VCC,'+5V');
+wire(ax,96,69,88,69); wire(ax,88,69,88,Y_GND); gnd(ax,88,Y_GND);
+wire(ax,96,56,96,49); node(ax,96,56);
+wire(ax,96,59,94,59);
+text(ax,93,59,'NC','Color',[0.5 0.5 0.5],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,91,57.5,'(float=40dB)','Color',[0.55 0.55 0.35],'FontSize',6.2, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+wire(ax,96,54,94,54);
+dibujar_C(ax,92,54,1.5,2.5,'C_{AR}','4.7uF');
+wire(ax,89.5,54,89.5,Y_GND); gnd(ax,89.5,Y_GND);
+plot(ax,[123 127],[64 64],'Color',[0.3 0.9 0.6],'LineWidth',1.8);
+plot(ax,126.5,64,'s','MarkerFaceColor',[0.3 0.9 0.6], ...
+ 'MarkerEdgeColor',[0.3 0.9 0.6],'MarkerSize',5);
+text(ax,122,64,'OUT','Color',[0.3 0.9 0.6],'FontSize',7, ...
+ 'HorizontalAlignment','right','FontName','Courier New','FontWeight','bold');
+wire(ax,126,64,131,64);
+
+text(ax,113,59,'AGC','Color',[0.8 0.5 0.9],'FontSize',8.5, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,113,57.5,'auto-ganancia','Color',[0.6 0.35 0.7],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,113,56.2,'40 / 50 / 60 dB','Color',[0.6 0.35 0.7],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 5: CAPACITOR DE SALIDA
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[130 56 12 14],'EdgeColor',[0.3 0.5 0.6], ...
+ 'LineWidth',0.8,'LineStyle',':');
+text(ax,136,71,'C_{sal}','Color',[0.35 0.6 0.7],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+wire(ax,131,64,133,64);
+dibujar_C(ax,136,64,1.8,3.5,'C_{sal}','47 uF');
+wire(ax,139,64,142,64);
+wire(ax,139,64,139,60);
+dibujar_R(ax,139,57,5,1.5,'R_L','10k');
+wire(ax,139,54,139,Y_GND); gnd(ax,139,Y_GND);
+node(ax,139,64);
+text(ax,136,61.5,'bloquea offset','Color',[0.35 0.55 0.65],'FontSize',6.2, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,136,60.3,'1.25V MAX9814','Color',[0.35 0.55 0.65],'FontSize',6.2, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 6: JACK 3.5mm
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[142 56 16 16],'EdgeColor',[0.3 0.7 0.4], ...
+ 'FaceColor',[0.04 0.1 0.06],'LineWidth',1.5,'Curvature',0.1);
+xj=150; yj=64;
+th=linspace(0,2*pi,60);
+plot(ax,xj+2*cos(th),yj+2*sin(th),'Color',[0.4 0.8 0.4],'LineWidth',1.5);
+plot(ax,xj+1*cos(th),yj+1*sin(th),'Color',[0.6 0.9 0.6],'LineWidth',1);
+plot(ax,[xj-2 xj+2],[yj yj],'Color',[0.4 0.8 0.4],'LineWidth',1.5);
+plot(ax,[xj xj],[yj-2 yj+2],'Color',[0.4 0.8 0.4],'LineWidth',1.5);
+wire(ax,142,64,148,64);
+text(ax,150,69.8,'JACK 3.5mm','Color',[0.35 0.85 0.45],'FontSize',7.5, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,150,68.5,'Microfono PC','Color',[0.3 0.65 0.35],'FontSize',6.8, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+wire(ax,150,yj-2,150,Y_GND); gnd(ax,150,Y_GND);
+
+%% ═══════════════════════════════════════════════════════════════
+% BLOQUE 7: PC + MATLAB
+%% ═══════════════════════════════════════════════════════════════
+rectangle(ax,'Position',[154 47 5 26],'EdgeColor',[0.2 0.6 0.8], ...
+ 'FaceColor',[0.03 0.08 0.12],'LineWidth',1.5,'Curvature',0.05);
+wire(ax,152,64,154,64);
+plot(ax,[153.5 154.5],[64.4 64],'Color',[0.3 0.75 0.95],'LineWidth',1.5);
+plot(ax,[153.5 154.5],[63.6 64],'Color',[0.3 0.75 0.95],'LineWidth',1.5);
+text(ax,156.5,67,'PC','Color',[0.3 0.75 0.95],'FontSize',8, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+text(ax,156.5,63,'+','Color',[0.25 0.6 0.8],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,156.5,60,'MAT','Color',[0.25 0.6 0.8],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,156.5,58,'LAB','Color',[0.25 0.6 0.8],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+text(ax,156.5,55,'FFT','Color',[0.2 0.5 0.7],'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% FLUJO DE SENAL — debajo del separador (y < 27)
+%% ═══════════════════════════════════════════════════════════════
+y_flow = 23.5;
+puntos_x = [20 35 58 87 111 136 150 156];
+nombres = {'I_{foto}','->V_{TIA}','V_{TIA}','V_{AC}','V_{amp}','V_{out}','V_{PC}','AUDIO'};
+colores = {[1.0 0.85 0.2],[0.4 0.7 1.0],[0.4 0.7 1.0],[0.3 0.8 0.8], ...
+ [0.85 0.5 1.0],[0.85 0.5 1.0],[0.35 0.85 0.45],[0.3 0.75 0.95]};
+for i = 1:length(puntos_x)-1
+ plot(ax,[puntos_x(i)+0.5 puntos_x(i+1)-0.5],[y_flow y_flow], ...
+ 'Color',[0.3 0.3 0.35],'LineWidth',1.2);
+ plot(ax,[puntos_x(i+1)-1.2 puntos_x(i+1)-0.3 puntos_x(i+1)-1.2], ...
+ [y_flow+0.5 y_flow y_flow-0.5], ...
+ 'Color',[0.3 0.3 0.35],'LineWidth',1.2);
+end
+for i = 1:length(puntos_x)
+ plot(ax,puntos_x(i),y_flow,'o','MarkerFaceColor',colores{i}, ...
+ 'MarkerEdgeColor',colores{i},'MarkerSize',4);
+ text(ax,puntos_x(i),y_flow+1.5,nombres{i},'Color',colores{i},'FontSize',6.5, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+end
+text(ax,80,y_flow-1.2,'← Flujo de senal →','Color',[0.4 0.4 0.45],'FontSize',7, ...
+ 'HorizontalAlignment','center','FontName','Courier New');
+
+%% ═══════════════════════════════════════════════════════════════
+% TABLA DE VALORES — bien separada abajo del flujo
+%% ═══════════════════════════════════════════════════════════════
+xT = 20; yT = 11; % y=10..21, debajo del flujo (y=23.5)
+rectangle(ax,'Position',[xT yT-1 120 11],'EdgeColor',[0.25 0.25 0.3], ...
+ 'FaceColor',[0.07 0.07 0.09],'LineWidth',0.8);
+text(ax,xT+60,yT+9.5,'Valores del circuito','Color',[0.75 0.75 0.8],'FontSize',8.5, ...
+ 'HorizontalAlignment','center','FontWeight','bold','FontName','Courier New');
+
+datos = {
+ 'BPW34', 'Responsividad:', '0.3 A/W @ 650 nm', [1.0 0.85 0.2];
+ 'LM358 TIA', 'Rf = 1 MOhm,', 'Cf = 100 pF', [0.4 0.7 1.0];
+ 'C_ac', '10 uF fc =', '1.6 Hz (paso AC)', [0.3 0.8 0.8];
+ 'MAX9814', 'Av = 40 dB,', 'AGC automatico', [0.85 0.5 1.0];
+ 'C_sal', '47 uF fc =', '0.34 Hz', [0.35 0.7 0.45];
+ 'Alimentacion', '+5V + GND,', 'VCC LM358 + laser', [0.9 0.4 0.4];
+};
+col_x = [xT+2, xT+28, xT+60];
+for i = 1:size(datos,1)
+ yi = yT + 8.0 - (i-1)*1.55;
+ text(ax,col_x(1),yi,datos{i,1},'Color',datos{i,4},'FontSize',7.5, ...
+ 'FontWeight','bold','FontName','Courier New');
+ text(ax,col_x(2),yi,datos{i,2},'Color',[0.65 0.65 0.65],'FontSize',7.5,'FontName','Courier New');
+ text(ax,col_x(3),yi,datos{i,3},'Color',[0.5 0.5 0.55],'FontSize',7.5,'FontName','Courier New');
+end
+
+%% ─── Pie ──────────────────────────────────────────────────────
+plot(ax,[3 157],[9.5 9.5],'Color',[0.2 0.2 0.25],'LineWidth',0.8);
+text(ax,80,1.8, ...
+ 'Fisica 2do Semestre | Ondas y Oscilaciones | BPW34 + LM358 + MAX9814 + MATLAB FFT', ...
+ 'Color',[0.35 0.35 0.4],'FontSize',7.5,'HorizontalAlignment','center', ...
+ 'FontName','Courier New');
+
+fprintf(' Diagrama generado.\n');
+fprintf(' Para guardar: print(gcf,''-dpng'',''-r300'',''diagrama_circuito.png'')\n');
\ No newline at end of file
blob - /dev/null
blob + 72cd55127b1234dc0d40605c3807500ef7cb728e (mode 644)
--- /dev/null
+++ Scripts/script_prueba_demostracion.m
+%% SCRIPT DE PRUEBA Y DEMOSTRACIÓN
+% Proyecto: Microfono Laser — Reconstruccion de Sonido por Vibracion de Vidrio
+% Hardware: Laser KY-008 → vidrio vibrante → BPW34 → TIA LM358 → MAX9814 → PC
+% Metodo: FFT + filtrado espectral + IFFT
+%
+% Fisica 2do Semestre — Ondas, Oscilaciones y Espacios Vectoriales
+% Autor: Alejandro B. E.
+
+clear all; close all; clc;
+
+fprintf('╔════════════════════════════════════════════════════════════════╗\n');
+fprintf('║ SISTEMA DE RECONSTRUCCIÓN DE SONIDO CON LÁSER Y FOTOSENSOR ║\n');
+fprintf('║ Fisica 2do Semestre - Ondas, Oscilaciones y Espacios Vect. ║\n');
+fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
+
+%% ========================================================================
+% PARÁMETROS DEL SISTEMA
+%% ========================================================================
+fprintf('CONFIGURANDO PARÁMETROS DEL SISTEMA...\n');
+
+fs = 44100; % Hz — frecuencia de muestreo
+duracion = 3; % s
+t = (0:1/fs:duracion-1/fs)';
+
+% ── Parámetros del pipeline optico-electronico ───────────────────────────
+% BPW34 (fotodiodo PIN, 650 nm)
+R_bpw34 = 0.3; % A/W — responsividad @ 650 nm
+P_laser = 0.5e-3; % W — potencia laser KY-008
+
+% Profundidad de modulacion del vidrio vibrante
+% El sonido dentro de la caja hace vibrar el vidrio, que modula el reflejo
+mod_depth = 0.15; % — — 15% (vidrio de ~2mm, bocina a ~10cm)
+
+% TIA LM358
+Rf_TIA = 10e3; % Ω — resistencia de retroalimentacion
+
+% MAX9814 (GAIN flotante = 40 dB = Av~100, pero con AGC activo
+% la ganancia efectiva baja para señales grandes — usamos Av=3 ~10dB)
+Av_MAX = 3; % V/V
+
+% Ruido del BPW34 (shot noise — mucho menor que un LDR)
+% BPW34 tiene I_dark ~ 2nA — ruido RMS equivalente en voltaje << 1 mV
+ruido_fotosensor = 0.008; % fraccion de la señal (0.8%)
+
+% Ganancia total del sistema
+G_sistema = mod_depth * R_bpw34 * P_laser * Rf_TIA * Av_MAX;
+
+fprintf(' Frecuencia de muestreo : %d Hz\n', fs);
+fprintf(' Duracion : %.1f s\n', duracion);
+fprintf(' Muestras : %d\n', length(t));
+fprintf(' BPW34 responsividad : %.1f A/W @ 650nm\n', R_bpw34);
+fprintf(' Laser potencia : %.1f mW\n', P_laser*1e3);
+fprintf(' TIA Rf : %.0f kOhm\n', Rf_TIA/1e3);
+fprintf(' MAX9814 ganancia : %.0f V/V (~%.0f dB)\n', Av_MAX, 20*log10(Av_MAX));
+fprintf(' Profundidad modulacion : %.0f%%\n', mod_depth*100);
+fprintf(' Ganancia total sistema : %.4f V/V\n', G_sistema);
+fprintf(' Ruido (BPW34+TIA) : %.1f%% de la senal\n\n', ruido_fotosensor*100);
+
+%% ========================================================================
+% FUNCIÓN: simular pipeline BPW34 → TIA → MAX9814
+%% ========================================================================
+% Modela la cadena completa de transduccion optico-electronica.
+% Entrada: señal de audio normalizada (-1 a 1)
+% Salida: voltaje a la salida del MAX9814 (como llegaría al jack del PC)
+
+ function v_out = pipeline_sensor(audio, P_laser, mod_depth, ...
+ R_bpw34, Rf_TIA, Av_MAX, ruido)
+ % 1. Modulacion optica: el vidrio vibrante modula el reflejo del laser
+ P_luz = P_laser * (1 + mod_depth * audio);
+
+ % 2. BPW34: fotocorriente = responsividad × potencia + ruido shot
+ I_foto = R_bpw34 * P_luz + ruido * 1e-4 * randn(size(audio));
+
+ % 3. TIA (LM358): I → V, luego eliminar offset DC
+ % En hardware el capacitor C_ac bloquea el DC
+ V_tia = I_foto * Rf_TIA;
+ V_tia = V_tia - mean(V_tia);
+
+ % 4. MAX9814: amplificar y saturar (±1.65V, alimentado a 3.3V)
+ V_max = Av_MAX * V_tia;
+ v_out = max(-1.65, min(1.65, V_max));
+ end
+
+%% ========================================================================
+% PRUEBA 1: GENERACIÓN DE SEÑALES ACÚSTICAS
+%% ========================================================================
+fprintf('╭─ PRUEBA 1: GENERACIÓN DE SEÑALES ACÚSTICAS\n');
+
+fprintf(' Generando tono puro (1000 Hz)...\n');
+f_puro = 1000;
+senial_pura = 0.5 * sin(2*pi*f_puro*t);
+senial_pura_ruidosa = pipeline_sensor(senial_pura, P_laser, mod_depth, ...
+ R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
+
+fprintf(' Generando acorde musical (Do Mayor: 262-330-392 Hz)...\n');
+f_do = 262; f_mi = 330; f_sol = 392;
+senial_acorde = 0.3*sin(2*pi*f_do*t) + ...
+ 0.3*sin(2*pi*f_mi*t) + ...
+ 0.3*sin(2*pi*f_sol*t);
+senial_acorde_ruidosa = pipeline_sensor(senial_acorde, P_laser, mod_depth, ...
+ R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
+
+fprintf(' Generando barrido de frecuencia (100-1000 Hz)...\n');
+senial_chirp = chirp(t, 100, duracion, 1000, 'linear') * 0.5;
+senial_chirp_ruidosa = pipeline_sensor(senial_chirp, P_laser, mod_depth, ...
+ R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
+
+fprintf(' Generando senal compleja (multiples armonicos)...\n');
+senial_compleja = zeros(size(t));
+for k = 1:5
+ senial_compleja = senial_compleja + (1/k) * sin(2*pi*f_do*k*t);
+end
+senial_compleja = senial_compleja * 0.5;
+senial_compleja_ruidosa = pipeline_sensor(senial_compleja, P_laser, mod_depth, ...
+ R_bpw34, Rf_TIA, Av_MAX, ruido_fotosensor);
+
+fprintf('╰─ Completado: 4 tipos de senales generadas con pipeline BPW34→TIA→MAX9814\n\n');
+
+%% ========================================================================
+% PRUEBA 2: ANÁLISIS ESPECTRAL (FFT)
+%% ========================================================================
+fprintf('╭─ PRUEBA 2: ANÁLISIS ESPECTRAL (TRANSFORMADA DE FOURIER)\n');
+
+[f1, mag1, ~] = calcular_fft_sistema(senial_pura_ruidosa, fs);
+[f2, mag2, ~] = calcular_fft_sistema(senial_acorde_ruidosa, fs);
+[f3, mag3, ~] = calcular_fft_sistema(senial_chirp_ruidosa, fs);
+[f4, mag4, ~] = calcular_fft_sistema(senial_compleja_ruidosa, fs);
+
+fprintf(' Identificando componentes principales:\n\n');
+
+[~, idx] = findpeaks(mag1, 'MinPeakHeight', max(mag1)*0.2);
+fprintf(' Tono puro (1000 Hz):\n');
+fprintf(' Picos detectados: %s Hz\n', sprintf('%.0f ', f1(idx)));
+
+[~, idx] = findpeaks(mag2, 'MinPeakHeight', max(mag2)*0.2);
+fprintf(' Acorde (262, 330, 392 Hz):\n');
+fprintf(' Picos detectados: %s Hz\n', sprintf('%.0f ', f2(idx)));
+
+fprintf('╰─ Completado: FFT calculado para todas las senales\n\n');
+
+%% ========================================================================
+% PRUEBA 3: DESCOMPOSICIÓN EN VALORES SINGULARES (SVD)
+%% ========================================================================
+fprintf('╭─ PRUEBA 3: ANÁLISIS SVD (ESPACIOS VECTORIALES)\n');
+
+[U1, S1, V1, var1] = analizar_svd(senial_pura_ruidosa);
+[U2, S2, V2, var2] = analizar_svd(senial_acorde_ruidosa);
+[U3, S3, V3, var3] = analizar_svd(senial_chirp_ruidosa);
+[U4, S4, V4, var4] = analizar_svd(senial_compleja_ruidosa);
+
+fprintf(' Rangos numericos de matrices de trayectoria:\n\n');
+fprintf(' Tono puro: rango = %d, varianza en 5 modos = %.1f%%\n', ...
+ rank(U1*S1*V1'), var1(min(5, length(var1))));
+fprintf(' Acorde: rango = %d, varianza en 5 modos = %.1f%%\n', ...
+ rank(U2*S2*V2'), var2(min(5, length(var2))));
+fprintf(' Barrido: rango = %d, varianza en 5 modos = %.1f%%\n', ...
+ rank(U3*S3*V3'), var3(min(5, length(var3))));
+fprintf(' Compleja: rango = %d, varianza en 5 modos = %.1f%%\n', ...
+ rank(U4*S4*V4'), var4(min(5, length(var4))));
+
+fprintf('\n Interpretacion:\n');
+fprintf(' - Mayor rango = mas informacion, menor redundancia\n');
+fprintf(' - Tono puro: bajo rango (senal simple)\n');
+fprintf(' - Acorde: rango moderado (3 componentes)\n');
+fprintf(' - Barrido: alto rango (contenido variante)\n');
+fprintf(' - Compleja: alto rango (muchos armonicos)\n');
+fprintf('╰─ Completado: Analisis SVD realizado\n\n');
+
+%% ========================================================================
+% PRUEBA 4: FILTRADO Y RECONSTRUCCIÓN
+%% ========================================================================
+fprintf('╭─ PRUEBA 4: FILTRADO Y RECONSTRUCCIÓN DE SEÑALES\n');
+
+fprintf(' Reconstruyendo senales usando filtrado FFT...\n');
+senial_pura_rec = reconstruir_por_fft(senial_pura_ruidosa);
+senial_acorde_rec = reconstruir_por_fft(senial_acorde_ruidosa);
+senial_chirp_rec = reconstruir_por_fft(senial_chirp_ruidosa);
+senial_compleja_rec = reconstruir_por_fft(senial_compleja_ruidosa);
+
+fprintf(' Calculando metricas de error:\n\n');
+
+[err1, snr1, cor1] = calcular_metricas(senial_pura, senial_pura_rec);
+[err2, snr2, cor2] = calcular_metricas(senial_acorde, senial_acorde_rec);
+[err3, snr3, cor3] = calcular_metricas(senial_chirp, senial_chirp_rec);
+[err4, snr4, cor4] = calcular_metricas(senial_compleja, senial_compleja_rec);
+
+fprintf(' Tono puro: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err1, snr1, cor1);
+fprintf(' Acorde: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err2, snr2, cor2);
+fprintf(' Barrido: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err3, snr3, cor3);
+fprintf(' Compleja: Error RMS = %.6f, SNR = %6.2f dB, Corr = %.4f\n', err4, snr4, cor4);
+fprintf('╰─ Completado: Reconstruccion y validacion\n\n');
+
+%% ========================================================================
+% PRUEBA 5: VISUALIZACIÓN INTEGRAL
+%% ========================================================================
+fprintf('╭─ PRUEBA 5: VISUALIZACIÓN DE RESULTADOS\n');
+
+figure('Name','Sistema Laser-Fotosensor — Resultados Completos', ...
+ 'Position',[100 100 1400 1000]);
+
+t_zoom = t(1:2000);
+
+% ── TONO PURO ─────────────────────────────────────────────────────────────
+subplot(4,4,1);
+plot(t_zoom, senial_pura(1:2000), 'b-', 'LineWidth', 1.5);
+title('Tono Puro — Senal Ideal','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,2);
+h = plot(t_zoom, senial_pura_ruidosa(1:2000), 'b-', 'LineWidth', 0.8);
+h.Color(4) = 0.6;
+title('Tono Puro — Sensor (BPW34→MAX9814)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
+
+subplot(4,4,3);
+plot(t_zoom, senial_pura_rec(1:2000), 'g-', 'LineWidth', 1.5);
+title('Tono Puro — Reconstruido (IFFT)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,4);
+rango_f = f1 <= 2000;
+stem(f1(rango_f), mag1(rango_f), 'filled', 'MarkerSize', 4);
+title(sprintf('FFT Tono Puro\nSNR = %.1f dB', snr1),'FontWeight','bold');
+xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
+
+% ── ACORDE ────────────────────────────────────────────────────────────────
+subplot(4,4,5);
+plot(t_zoom, senial_acorde(1:2000), 'r-', 'LineWidth', 1.5);
+title('Acorde — Senal Ideal','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,6);
+h = plot(t_zoom, senial_acorde_ruidosa(1:2000), 'r-', 'LineWidth', 0.8);
+h.Color(4) = 0.6;
+title('Acorde — Sensor (BPW34→MAX9814)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
+
+subplot(4,4,7);
+plot(t_zoom, senial_acorde_rec(1:2000), 'g-', 'LineWidth', 1.5);
+title('Acorde — Reconstruido (IFFT)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,8);
+rango_f = f2 <= 1000;
+stem(f2(rango_f), mag2(rango_f), 'filled', 'MarkerSize', 4);
+title(sprintf('FFT Acorde (Do Mayor)\nSNR = %.1f dB', snr2),'FontWeight','bold');
+xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
+
+% ── BARRIDO ───────────────────────────────────────────────────────────────
+subplot(4,4,9);
+plot(t_zoom, senial_chirp(1:2000), 'm-', 'LineWidth', 1.5);
+title('Barrido — Senal Ideal','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,10);
+h = plot(t_zoom, senial_chirp_ruidosa(1:2000), 'm-', 'LineWidth', 0.8);
+h.Color(4) = 0.6;
+title('Barrido — Sensor (BPW34→MAX9814)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
+
+subplot(4,4,11);
+plot(t_zoom, senial_chirp_rec(1:2000), 'g-', 'LineWidth', 1.5);
+title('Barrido — Reconstruido (IFFT)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,12);
+rango_f = f3 <= 2000;
+stem(f3(rango_f), mag3(rango_f), 'filled', 'MarkerSize', 4);
+title(sprintf('FFT Barrido 100-1000Hz\nSNR = %.1f dB', snr3),'FontWeight','bold');
+xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
+
+% ── SEÑAL COMPLEJA ────────────────────────────────────────────────────────
+subplot(4,4,13);
+plot(t_zoom, senial_compleja(1:2000), 'c-', 'LineWidth', 1.5);
+title('Compleja — Senal Ideal','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,14);
+h = plot(t_zoom, senial_compleja_ruidosa(1:2000), 'c-', 'LineWidth', 0.8);
+h.Color(4) = 0.6;
+title('Compleja — Sensor (BPW34→MAX9814)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('V (V)'); grid on;
+
+subplot(4,4,15);
+plot(t_zoom, senial_compleja_rec(1:2000), 'g-', 'LineWidth', 1.5);
+title('Compleja — Reconstruido (IFFT)','FontWeight','bold');
+xlabel('Tiempo (s)'); ylabel('Amplitud'); grid on;
+
+subplot(4,4,16);
+rango_f = f4 <= 2000;
+stem(f4(rango_f), mag4(rango_f), 'filled', 'MarkerSize', 4);
+title(sprintf('FFT Compleja (5 armonicos)\nSNR = %.1f dB', snr4),'FontWeight','bold');
+xlabel('Frecuencia (Hz)'); ylabel('|Y(f)|'); grid on;
+
+sgtitle('Sistema Microfono Laser: BPW34 → TIA LM358 → MAX9814 → MATLAB FFT', ...
+ 'FontWeight','bold','FontSize',12);
+
+fprintf(' Visualizacion generada\n');
+fprintf('╰─ Completado: Graficos de resultados\n\n');
+
+%% ========================================================================
+% PRUEBA 6: ANÁLISIS SVD DETALLADO
+%% ========================================================================
+fprintf('╭─ PRUEBA 6: ANÁLISIS DETALLADO SVD — ESPACIOS VECTORIALES\n');
+
+figure('Name','Analisis SVD — Espacios Vectoriales');
+
+subplot(2,2,1);
+semilogy(diag(S1), 'bo-', 'LineWidth', 2, 'MarkerSize', 6);
+xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
+title('SVD — Tono Puro (bajo rango)','FontWeight','bold'); grid on;
+
+subplot(2,2,2);
+semilogy(diag(S2), 'ro-', 'LineWidth', 2, 'MarkerSize', 6);
+xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
+title('SVD — Acorde (3 componentes)','FontWeight','bold'); grid on;
+
+subplot(2,2,3);
+semilogy(diag(S3), 'mo-', 'LineWidth', 2, 'MarkerSize', 6);
+xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
+title('SVD — Barrido (alto rango)','FontWeight','bold'); grid on;
+
+subplot(2,2,4);
+semilogy(diag(S4), 'co-', 'LineWidth', 2, 'MarkerSize', 6);
+xlabel('Modo (i)'); ylabel('Valor Singular \sigma_i');
+title('SVD — Compleja (muchos armonicos)','FontWeight','bold'); grid on;
+
+sgtitle('Descomposicion SVD de la Matriz de Trayectoria', ...
+ 'FontWeight','bold','FontSize',12);
+
+fprintf(' Analisis SVD visualizado\n');
+fprintf('╰─ Completado: Estudio de descomposicion matricial\n\n');
+
+%% ========================================================================
+% RESUMEN FINAL
+%% ========================================================================
+fprintf('╔════════════════════════════════════════════════════════════════╗\n');
+fprintf('║ RESUMEN DE RESULTADOS ║\n');
+fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
+
+tabla = array2table(...
+ [1000, err1, snr1, cor1; ...
+ 262, err2, snr2, cor2; ...
+ 100, err3, snr3, cor3; ...
+ 262, err4, snr4, cor4], ...
+ 'VariableNames', {'Frecuencia_Hz','Error_RMS','SNR_dB','Correlacion'}, ...
+ 'RowNames', {'Tono Puro','Acorde','Barrido','Compleja'});
+
+disp(tabla);
+
+fprintf('\nINTERPRETACION:\n');
+fprintf(' Error RMS : diferencia entre original y reconstruida\n');
+fprintf(' SNR (dB) : razon senal-ruido en la reconstruccion\n');
+fprintf(' Correlacion : 1.0 = perfecta, 0.0 = sin relacion\n');
+fprintf('\n Pipeline simulado: Laser KY-008 → vidrio vibrante → BPW34\n');
+fprintf(' → TIA LM358 (Rf=%.0fkOhm) → MAX9814 (Av=%.0f)\n', ...
+ Rf_TIA/1e3, Av_MAX);
+fprintf(' → jack PC → MATLAB FFT\n');
+
+fprintf('\n╔════════════════════════════════════════════════════════════════╗\n');
+fprintf('║ PRUEBAS COMPLETADAS EXITOSAMENTE ║\n');
+fprintf('║ ║\n');
+fprintf('║ Sistema listo para usar con datos reales del fotosensor ║\n');
+fprintf('╚════════════════════════════════════════════════════════════════╝\n\n');
+
+fprintf('Archivos generados:\n');
+fprintf(' %d figuras con resultados\n', length(findobj('Type','figure')));
+fprintf(' Datos de prueba en memoria (variables: senial_*)\n');
+fprintf(' Metricas de validacion calculadas\n');
+
+%% ========================================================================
+% FUNCIONES LOCALES (siempre al final del script)
+%% ========================================================================
+
+function [f, mag, Y] = calcular_fft_sistema(senial, fs)
+ N = length(senial);
+ Y = fft(senial);
+ mag = abs(Y(1:N/2)) / N;
+ f = fs * (0:N/2-1) / N;
+end
+
+function [U, S, V, varianza_ac] = analizar_svd(senial)
+ ventana = max(2, round(length(senial) / 100));
+ cols = length(senial) - ventana + 1;
+ M = zeros(ventana, cols);
+ for i = 1:ventana
+ M(i,:) = senial(i : i + cols - 1)';
+ end
+ [U, S, V] = svd(M, 'econ');
+ sv = diag(S);
+ varianza_ac = cumsum(sv.^2) / sum(sv.^2) * 100;
+end
+
+function senial_rec = reconstruir_por_fft(senial_ruidosa)
+ N = length(senial_ruidosa);
+ Y = fft(senial_ruidosa);
+ mag_pos = abs(Y(1 : floor(N/2) + 1));
+ umbral = max(mag_pos) * 0.1;
+
+ mascara_pos = double(mag_pos > umbral);
+ mascara = zeros(N, 1);
+ mascara(1:floor(N/2)+1) = mascara_pos;
+ mascara(floor(N/2)+2:N) = flipud(mascara_pos(2:floor(N/2)));
+
+ senial_rec = real(ifft(Y .* mascara));
+end
+
+function [error_rms, snr_val, correlacion] = calcular_metricas(original, reconstruida)
+ factor = (original' * reconstruida) / (reconstruida' * reconstruida);
+ rec_scaled = reconstruida * factor;
+
+ error_rms = sqrt(mean((original - rec_scaled).^2));
+ pot = mean(original.^2);
+
+ if pot > 0 && error_rms > 0
+ snr_val = 10 * log10(pot / error_rms^2);
+ else
+ snr_val = Inf;
+ end
+
+ correlacion = (original' * rec_scaled) / (norm(original) * norm(rec_scaled));
+end
\ No newline at end of file
blob - /dev/null
blob + 72e6e079375bb030552e2d4c12b4dbc53bf8e8d5 (mode 644)
--- /dev/null
+++ Scripts/simulacion_3d_laser.m
+%% SIMULACION 3D — MICROFONO LASER
+% Visualizacion 3D animada del experimento completo:
+% Caja insonorizada → vidrio vibrante → laser → BPW34 →
+% TIA (LM358) → MAX9814 → PC → FFT → reconstruccion
+%
+% Autor: Alejandro B. E. — Fisica 2do Semestre
+
+clear; close all; clc;
+
+fprintf('╔══════════════════════════════════════════════════════╗\n');
+fprintf('║ SIMULACION 3D — Microfono Laser ║\n');
+fprintf('╚══════════════════════════════════════════════════════╝\n\n');
+fprintf(' Presiona Q en la figura 3D para detener la animacion.\n\n');
+
+%% ═══════════════════════════════════════════════════════
+% PARAMETROS
+%% ═══════════════════════════════════════════════════════
+
+% Audio simulado (acorde La mayor: 440 + 880 + 660 Hz)
+f1 = 440; f2 = 880; f3 = 660;
+fs = 8000; % Hz
+duracion = 3.0; % s
+
+t = (0 : 1/fs : duracion - 1/fs)';
+N = length(t);
+
+% Senal de audio dentro de la caja (normalizada -1 a 1)
+audio_original = 0.5*sin(2*pi*f1*t) + ...
+ 0.3*sin(2*pi*f2*t) + ...
+ 0.2*sin(2*pi*f3*t);
+audio_original = audio_original / max(abs(audio_original)); % normalizar
+
+% Parametros fisicos
+R_bpw34 = 0.3; % A/W — responsividad BPW34 @ 650nm
+P_laser = 1e-3; % W — potencia laser
+mod_depth = 0.15; % antes 0.4, — — profundidad de modulacion del vidrio
+Rf_TIA = 10e3; % Ω — resistencia TIA
+Av_MAX = 1; % antes 3, V/V — ganancia MAX9814
+
+%% ─── PIPELINE DE SENAL (CORREGIDO) ─────────────────────
+
+% 1. Modulacion optica: vibracion del vidrio modula P_laser
+P_luz = P_laser * (1 + mod_depth * audio_original);
+% P_luz oscila entre P_laser*(1-m) y P_laser*(1+m) — nunca negativo
+
+% 2. BPW34: P_luz → I_foto (corriente)
+I_foto = R_bpw34 * P_luz + 1e-8 * randn(N,1);
+% I_foto_DC = R * P_laser = 0.3 * 1e-3 = 300 µA (offset DC)
+% I_foto_AC = R * P_laser * mod_depth * audio = ±120 µA (señal util)
+
+% 3. TIA: I_foto → V_tia, luego ELIMINAR DC por resta de media
+% (en hardware esto lo hace el capacitor de acoplamiento C_ac)
+V_tia_total = I_foto * Rf_TIA; % V = I * Rf → offset DC + señal AC
+V_tia = V_tia_total - mean(V_tia_total); % solo componente AC
+% V_tia_AC pico = mod_depth * R * P_laser * Rf = 0.4*0.3*1e-3*10e3 = 1.2 mV
+% Nota: señal pequeña — el MAX9814 la amplifica
+
+% 4. MAX9814: amplificar y saturar
+V_max = Av_MAX * V_tia;
+V_max = max(-1.65, min(1.65, V_max)); % saturacion ±1.65V
+
+% 5. FFT sobre la señal capturada
+Y = fft(V_max);
+mag_Y = abs(Y);
+
+% Filtrado: umbral de magnitud (conservar picos principales)
+umbral = max(mag_Y) * 0.08;
+mascara = mag_Y > umbral;
+% Simetria conjugada obligatoria para ifft real
+mascara = mascara | flipud(mascara);
+Y_filt = Y .* mascara;
+
+% 6. Reconstruccion (IFFT)
+V_rec = real(ifft(Y_filt));
+
+% Escalar V_rec para comparar con audio_original (minimos cuadrados)
+factor = (audio_original' * V_rec) / (V_rec' * V_rec + 1e-12);
+V_rec_escalado = V_rec * factor;
+
+% Correlacion
+cc = corrcoef(audio_original, V_rec_escalado);
+rho = cc(1,2);
+
+fprintf(' Senal simulada:\n');
+fprintf(' Frecuencias: %.0f + %.0f + %.0f Hz\n', f1, f2, f3);
+fprintf(' I_foto DC: %.0f uA\n', mean(I_foto)*1e6);
+fprintf(' V_TIA AC pico: %.4f V\n', max(abs(V_tia)));
+fprintf(' V_MAX pico: %.4f V\n', max(abs(V_max)));
+fprintf(' Correlacion: %.4f\n\n', rho);
+
+%% ═══════════════════════════════════════════════════════
+% FIGURA PRINCIPAL
+%% ═══════════════════════════════════════════════════════
+fig = figure('Name','Simulacion 3D — Microfono Laser', ...
+ 'NumberTitle','off', ...
+ 'Position',[30 30 1500 900], ...
+ 'Color',[0.05 0.05 0.08], ...
+ 'KeyPressFcn', @(s,e) setappdata(s,'salir', strcmp(e.Key,'q')));
+setappdata(fig, 'salir', false);
+
+%% ═══════════════════════════════════════════════════════
+% SUBPLOT 3D
+%% ═══════════════════════════════════════════════════════
+ax3d = subplot('Position', [0.02 0.35 0.55 0.62]);
+set(ax3d,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','ZColor','w');
+hold(ax3d,'on'); grid(ax3d,'on');
+view(ax3d, 35, 22);
+xlabel(ax3d,'X (cm)','Color','w');
+ylabel(ax3d,'Y (cm)','Color','w');
+zlabel(ax3d,'Z (cm)','Color','w');
+title(ax3d,'Montaje experimental 3D','Color',[1 0.7 0.1],'FontWeight','bold','FontSize',12);
+ax3d.GridColor = [0.2 0.2 0.2];
+xlim(ax3d,[-2 58]); ylim(ax3d,[-3 38]); zlim(ax3d,[-1 33]);
+lighting(ax3d,'gouraud');
+light(ax3d,'Position',[60 60 60],'Style','infinite');
+
+% Helper: dibujar caja
+ function dibujar_caja(ax,x0,y0,z0,Lx,Ly,Lz,col,al)
+ verts = [x0 y0 z0;
+ x0+Lx y0 z0;
+ x0+Lx y0+Ly z0;
+ x0 y0+Ly z0;
+ x0 y0 z0+Lz;
+ x0+Lx y0 z0+Lz;
+ x0+Lx y0+Ly z0+Lz;
+ x0 y0+Ly z0+Lz];
+ faces = [1 2 6 5; 2 3 7 6; 3 4 8 7;
+ 4 1 5 8; 1 2 3 4; 5 6 7 8];
+ patch(ax,'Vertices',verts,'Faces',faces, ...
+ 'FaceColor',col,'FaceAlpha',al, ...
+ 'EdgeColor',[0.55 0.55 0.55],'LineWidth',0.7);
+ end
+
+Lc = 20; % tamaño caja (cm)
+
+% Caja insonorizada
+dibujar_caja(ax3d, 0,0,0, Lc,Lc,Lc, [0.35 0.25 0.15], 0.22);
+text(ax3d, Lc/2, Lc/2, Lc+1.5,'Caja insonorizada', ...
+ 'Color',[0.85 0.65 0.3],'FontSize',9,'HorizontalAlignment','center');
+
+% Vidrio (cara x=Lc)
+[yv,zv] = meshgrid(linspace(0.5,Lc-0.5,12), linspace(0.5,Lc-0.5,12));
+xv0 = Lc * ones(size(yv));
+h_vidrio = surf(ax3d, xv0, yv, zv, ...
+ 'FaceColor',[0.5 0.8 1.0],'FaceAlpha',0.28, ...
+ 'EdgeColor',[0.4 0.7 0.9],'EdgeAlpha',0.12);
+text(ax3d, Lc+0.3, Lc/2, Lc+0.8,'Vidrio', ...
+ 'Color',[0.5 0.9 1.0],'FontSize',9);
+
+% Audifono dentro de la caja
+th = linspace(0,2*pi,40);
+for lado = [-1 1]
+ yc = Lc/2 + lado*5;
+ fill3(ax3d, Lc/2-0.3+zeros(1,40), ...
+ yc + 3*cos(th), ...
+ Lc/2 + 3*sin(th), ...
+ [0.2 0.2 0.2],'FaceAlpha',0.85,'EdgeColor',[0.5 0.5 0.5]);
+end
+text(ax3d, Lc/2-5, Lc/2, Lc/2+5.5,'Audifono', ...
+ 'Color',[0.7 0.7 0.7],'FontSize',8);
+
+% Modulo laser KY-008
+laser_pos = [35, 4, 10];
+[xl,yl,zl] = cylinder(0.8,20);
+surf(ax3d, xl*3+laser_pos(1), yl+laser_pos(2), zl+laser_pos(3), ...
+ 'FaceColor',[0.15 0.65 0.15],'EdgeColor','none','FaceAlpha',0.92);
+text(ax3d, laser_pos(1)+0.5, laser_pos(2)-0.5, laser_pos(3)-2.2,'Laser KY-008', ...
+ 'Color',[0.3 1.0 0.3],'FontSize',8,'FontWeight','bold');
+
+% Punto de impacto en vidrio
+P_imp = [Lc, 10, 10];
+
+% Haz laser (rojo solido)
+h_haz_ida = plot3(ax3d, ...
+ [laser_pos(1) P_imp(1)], ...
+ [laser_pos(2) P_imp(2)], ...
+ [laser_pos(3) P_imp(3)], ...
+ 'r-','LineWidth',2.5);
+
+% Reflexion hacia BPW34
+v_inc = (P_imp - laser_pos) / norm(P_imp - laser_pos);
+n_vid = [-1 0 0];
+v_ref = v_inc - 2*dot(v_inc,n_vid)*n_vid;
+bpw34_pos = P_imp + 12*v_ref;
+
+h_haz_ref = plot3(ax3d, ...
+ [P_imp(1) bpw34_pos(1)], ...
+ [P_imp(2) bpw34_pos(2)], ...
+ [P_imp(3) bpw34_pos(3)], ...
+ 'r--','LineWidth',1.8);
+
+% Punto de impacto
+plot3(ax3d, P_imp(1),P_imp(2),P_imp(3),'y*','MarkerSize',12,'LineWidth',2);
+
+% BPW34 (caja negra)
+dibujar_caja(ax3d, bpw34_pos(1)-1.2, bpw34_pos(2)-1.2, bpw34_pos(3)-1.2, ...
+ 2.4, 2.4, 2.4, [0.08 0.08 0.08], 0.92);
+text(ax3d, bpw34_pos(1), bpw34_pos(2), bpw34_pos(3)+3.2,'BPW34', ...
+ 'Color',[1.0 0.85 0.1],'FontSize',9,'FontWeight','bold','HorizontalAlignment','center');
+
+% Tubo negro (proteccion de luz ambiente)
+[xt,yt,zt] = cylinder(1.5,20);
+surf(ax3d, xt+bpw34_pos(1), yt+bpw34_pos(2), zt*5+bpw34_pos(3)-2.5, ...
+ 'FaceColor',[0.07 0.07 0.07],'EdgeColor','none','FaceAlpha',0.55);
+
+% Protoboard + LM358 TIA
+proto = [37, 14, 4];
+dibujar_caja(ax3d, proto(1), proto(2), proto(3), 9, 5, 0.6, [0.1 0.5 0.1], 0.85);
+text(ax3d, proto(1)+4.5, proto(2)+2.5, proto(3)+2,'LM358 TIA', ...
+ 'Color',[0.4 1.0 0.4],'FontSize',8,'HorizontalAlignment','center');
+
+% Cable BPW34 → TIA
+plot3(ax3d,[bpw34_pos(1) proto(1)+4], ...
+ [bpw34_pos(2) proto(2)+2], ...
+ [bpw34_pos(3) proto(3)+0.5], ...
+ 'Color',[1 0.55 0.1],'LineWidth',1.5,'LineStyle',':');
+
+% MAX9814
+maxp = [37, 21, 4];
+dibujar_caja(ax3d, maxp(1), maxp(2), maxp(3), 7, 4, 1.2, [0.45 0.1 0.55], 0.88);
+text(ax3d, maxp(1)+3.5, maxp(2)+2, maxp(3)+2.8,'MAX9814', ...
+ 'Color',[0.9 0.5 1.0],'FontSize',8,'HorizontalAlignment','center');
+
+% Cable TIA → MAX9814
+plot3(ax3d,[proto(1)+4 maxp(1)+3], ...
+ [proto(2)+5 maxp(2)], ...
+ [proto(3)+0.5 maxp(3)+0.6], ...
+ 'Color',[1 0.55 0.1],'LineWidth',1.5,'LineStyle',':');
+
+% Laptop
+pcp = [46, 14, 4];
+% Pantalla
+fill3(ax3d,[pcp(1) pcp(1)+9 pcp(1)+9 pcp(1)], ...
+ [pcp(2) pcp(2) pcp(2) pcp(2)], ...
+ [pcp(3) pcp(3) pcp(3)+8 pcp(3)+8], ...
+ [0.1 0.1 0.16],'EdgeColor',[0.5 0.5 0.5],'FaceAlpha',0.92);
+fill3(ax3d,[pcp(1)+0.5 pcp(1)+8.5 pcp(1)+8.5 pcp(1)+0.5], ...
+ [pcp(2)-0.1 pcp(2)-0.1 pcp(2)-0.1 pcp(2)-0.1], ...
+ [pcp(3)+0.5 pcp(3)+0.5 pcp(3)+7.5 pcp(3)+7.5], ...
+ [0.05 0.3 0.4],'EdgeColor','none','FaceAlpha',0.85);
+% Base
+fill3(ax3d,[pcp(1) pcp(1)+9 pcp(1)+9 pcp(1)], ...
+ [pcp(2) pcp(2) pcp(2)+4 pcp(2)+4], ...
+ [pcp(3) pcp(3) pcp(3) pcp(3)], ...
+ [0.2 0.2 0.2],'EdgeColor',[0.5 0.5 0.5],'FaceAlpha',0.92);
+text(ax3d, pcp(1)+4.5, pcp(2)-1.2, pcp(3)+4,'PC + MATLAB', ...
+ 'Color',[0.3 0.85 1.0],'FontSize',9,'FontWeight','bold','HorizontalAlignment','center');
+
+% Cable MAX9814 → PC
+plot3(ax3d,[maxp(1)+7 pcp(1)], ...
+ [maxp(2)+2 pcp(2)+2], ...
+ [maxp(3)+0.6 pcp(3)+0.5], ...
+ 'Color',[0.7 0.7 0.7],'LineWidth',2);
+
+% Leyenda
+legend(ax3d,[h_haz_ida,h_haz_ref], ...
+ {'Haz laser (650nm)','Reflexion hacia BPW34'}, ...
+ 'Location','northeast','TextColor','w', ...
+ 'Color',[0.1 0.1 0.15],'EdgeColor',[0.4 0.4 0.4]);
+
+%% ═══════════════════════════════════════════════════════
+% SUBPLOTS INFERIORES DE SENAL
+%% ═══════════════════════════════════════════════════════
+c_audio = [1.0 0.7 0.1];
+c_foto = [1.0 0.4 0.3];
+c_tia = [0.3 0.8 1.0];
+c_rec = [0.4 1.0 0.4];
+
+ax_audio = subplot('Position',[0.02 0.03 0.22 0.28]);
+ax_ifoto = subplot('Position',[0.26 0.03 0.22 0.28]);
+ax_tia = subplot('Position',[0.50 0.03 0.22 0.28]);
+ax_fft = subplot('Position',[0.74 0.03 0.24 0.28]);
+
+function setup_ax(ax, ttl, col)
+ set(ax,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w', ...
+ 'GridColor',[0.15 0.15 0.15],'FontSize',8);
+ grid(ax,'on');
+ title(ax, ttl,'Color',col,'FontWeight','bold','FontSize',9);
+ xlabel(ax,'Tiempo (s)','Color','w','FontSize',8);
+end
+
+setup_ax(ax_audio,'Audio en la caja', c_audio);
+setup_ax(ax_ifoto,'BPW34 — I_{foto} (uA)', c_foto);
+setup_ax(ax_tia, 'V_{TIA} + MAX9814 (mV)', c_tia);
+setup_ax(ax_fft, 'FFT — Espectro', c_rec);
+
+n_win = round(fs * 0.012); % ventana de 12 ms
+t_win = t(1:n_win);
+
+h_l_audio = plot(ax_audio, t_win, audio_original(1:n_win), 'Color',c_audio,'LineWidth',1.2);
+h_l_ifoto = plot(ax_ifoto, t_win, I_foto(1:n_win)*1e6, 'Color',c_foto, 'LineWidth',1.2);
+h_l_tia = plot(ax_tia, t_win, V_tia(1:n_win)*1e3, 'Color',c_tia, 'LineWidth',1.2);
+
+ylim(ax_audio,[-1.3 1.3]);
+ylim(ax_ifoto,[min(I_foto)*1e6*1.05 max(I_foto)*1e6*1.05]);
+ylim(ax_tia, [min(V_tia)*1e3*1.1 max(V_tia)*1e3*1.1]);
+
+% FFT estatica
+f_vec = (0:floor(N/2)) * fs / N;
+mag = abs(Y(1:floor(N/2)+1)) / N;
+mag(2:end-1) = 2*mag(2:end-1);
+plot(ax_fft, f_vec, mag,'Color',c_rec,'LineWidth',0.9);
+xlim(ax_fft,[0 2000]);
+set(ax_fft,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
+grid(ax_fft,'on');
+title(ax_fft,'FFT — Espectro','Color',c_rec,'FontWeight','bold','FontSize',9);
+xlabel(ax_fft,'Frecuencia (Hz)','Color','w','FontSize',8);
+hold(ax_fft,'on');
+for fi = [f1 f2 f3]
+ [~,idx_fi] = min(abs(f_vec - fi));
+ plot(ax_fft, fi, mag(idx_fi),'w^','MarkerSize',7,'MarkerFaceColor','w');
+ text(ax_fft, fi, mag(idx_fi)*1.12, sprintf('%.0fHz',fi), ...
+ 'Color','w','FontSize',7,'HorizontalAlignment','center');
+end
+
+%% ═══════════════════════════════════════════════════════
+% ANIMACION
+%% ═══════════════════════════════════════════════════════
+fprintf(' Iniciando animacion (presiona Q para salir)...\n\n');
+
+paso = round(fs/30); % ~30 fps
+n_frm = floor(N / paso);
+amp_v = 0.25; % cm vibracion max del vidrio
+
+for k = 1:n_frm
+
+ if ~ishandle(fig) || getappdata(fig,'salir'), break; end
+
+ i0 = (k-1)*paso + 1;
+ i1 = min(i0 + n_win - 1, N);
+ idx = i0:i1;
+
+ if length(idx) < n_win, break; end
+
+ % Vibracion del vidrio
+ desp = amp_v * audio_original(i0);
+ set(h_vidrio,'XData',(Lc + desp)*ones(size(yv)));
+
+ % Haz laser sigue el punto de impacto
+ P_imp_k = [Lc + desp, P_imp(2), P_imp(3)];
+ set(h_haz_ida,'XData',[laser_pos(1) P_imp_k(1)], ...
+ 'YData',[laser_pos(2) P_imp_k(2)], ...
+ 'ZData',[laser_pos(3) P_imp_k(3)]);
+ set(h_haz_ref,'XData',[P_imp_k(1) bpw34_pos(1)], ...
+ 'YData',[P_imp_k(2) bpw34_pos(2)], ...
+ 'ZData',[P_imp_k(3) bpw34_pos(3)]);
+
+ % Actualizar graficas
+ tw = t(idx);
+ set(h_l_audio,'XData',tw,'YData',audio_original(idx));
+ set(h_l_ifoto,'XData',tw,'YData',I_foto(idx)*1e6);
+ set(h_l_tia, 'XData',tw,'YData',V_tia(idx)*1e3);
+ xlim(ax_audio,[tw(1) tw(end)]);
+ xlim(ax_ifoto,[tw(1) tw(end)]);
+ xlim(ax_tia, [tw(1) tw(end)]);
+
+ title(ax3d, sprintf('Montaje 3D — t = %.3f s | P_{laser} = %.5f W', ...
+ t(i0), P_luz(i0)), ...
+ 'Color',[1 0.7 0.1],'FontWeight','bold','FontSize',11);
+
+ drawnow limitrate;
+end
+
+%% ═══════════════════════════════════════════════════════
+% FIGURA FINAL: RECONSTRUCCION
+%% ═══════════════════════════════════════════════════════
+fprintf(' Animacion terminada.\n\n');
+
+figure('Name','Reconstruccion FFT','NumberTitle','off', ...
+ 'Position',[80 80 1300 750],'Color',[0.05 0.05 0.08]);
+
+subplot(3,1,1);
+plot(t, audio_original,'Color',c_audio,'LineWidth',0.8);
+set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
+grid on;
+title('Audio original dentro de la caja','Color',c_audio,'FontWeight','bold','FontSize',11);
+xlabel('Tiempo (s)','Color','w'); ylabel('Amplitud','Color','w');
+xlim([0 duracion]);
+
+subplot(3,1,2);
+plot(t, V_max,'Color',c_tia,'LineWidth',0.8);
+set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
+grid on;
+title('Senal capturada (MAX9814 out)','Color',c_tia,'FontWeight','bold','FontSize',11);
+xlabel('Tiempo (s)','Color','w'); ylabel('V (V)','Color','w');
+xlim([0 duracion]);
+
+subplot(3,1,3);
+plot(t, V_rec_escalado,'Color',c_rec,'LineWidth',0.8);
+set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
+grid on;
+title(sprintf('Senal reconstruida (IFFT) — correlacion: %.4f', rho), ...
+ 'Color',c_rec,'FontWeight','bold','FontSize',11);
+xlabel('Tiempo (s)','Color','w'); ylabel('Amplitud','Color','w');
+xlim([0 duracion]);
+
+V_play = V_rec_escalado / max(abs(V_rec_escalado) + 1e-10);
+fprintf(' Reproduciendo senal reconstruida...\n');
+sound(V_play, fs);
+
+fprintf('\n╔══════════════════════════════════════════════════════╗\n');
+fprintf('║ Simulacion completada ║\n');
+fprintf('║ Correlacion original / reconstruido: %.4f ║\n', rho);
+fprintf('╚══════════════════════════════════════════════════════╝\n');
\ No newline at end of file
blob - 72e6e079375bb030552e2d4c12b4dbc53bf8e8d5 (mode 644)
blob + /dev/null
--- simulacion_3d_laser.m
+++ /dev/null
-%% SIMULACION 3D — MICROFONO LASER
-% Visualizacion 3D animada del experimento completo:
-% Caja insonorizada → vidrio vibrante → laser → BPW34 →
-% TIA (LM358) → MAX9814 → PC → FFT → reconstruccion
-%
-% Autor: Alejandro B. E. — Fisica 2do Semestre
-
-clear; close all; clc;
-
-fprintf('╔══════════════════════════════════════════════════════╗\n');
-fprintf('║ SIMULACION 3D — Microfono Laser ║\n');
-fprintf('╚══════════════════════════════════════════════════════╝\n\n');
-fprintf(' Presiona Q en la figura 3D para detener la animacion.\n\n');
-
-%% ═══════════════════════════════════════════════════════
-% PARAMETROS
-%% ═══════════════════════════════════════════════════════
-
-% Audio simulado (acorde La mayor: 440 + 880 + 660 Hz)
-f1 = 440; f2 = 880; f3 = 660;
-fs = 8000; % Hz
-duracion = 3.0; % s
-
-t = (0 : 1/fs : duracion - 1/fs)';
-N = length(t);
-
-% Senal de audio dentro de la caja (normalizada -1 a 1)
-audio_original = 0.5*sin(2*pi*f1*t) + ...
- 0.3*sin(2*pi*f2*t) + ...
- 0.2*sin(2*pi*f3*t);
-audio_original = audio_original / max(abs(audio_original)); % normalizar
-
-% Parametros fisicos
-R_bpw34 = 0.3; % A/W — responsividad BPW34 @ 650nm
-P_laser = 1e-3; % W — potencia laser
-mod_depth = 0.15; % antes 0.4, — — profundidad de modulacion del vidrio
-Rf_TIA = 10e3; % Ω — resistencia TIA
-Av_MAX = 1; % antes 3, V/V — ganancia MAX9814
-
-%% ─── PIPELINE DE SENAL (CORREGIDO) ─────────────────────
-
-% 1. Modulacion optica: vibracion del vidrio modula P_laser
-P_luz = P_laser * (1 + mod_depth * audio_original);
-% P_luz oscila entre P_laser*(1-m) y P_laser*(1+m) — nunca negativo
-
-% 2. BPW34: P_luz → I_foto (corriente)
-I_foto = R_bpw34 * P_luz + 1e-8 * randn(N,1);
-% I_foto_DC = R * P_laser = 0.3 * 1e-3 = 300 µA (offset DC)
-% I_foto_AC = R * P_laser * mod_depth * audio = ±120 µA (señal util)
-
-% 3. TIA: I_foto → V_tia, luego ELIMINAR DC por resta de media
-% (en hardware esto lo hace el capacitor de acoplamiento C_ac)
-V_tia_total = I_foto * Rf_TIA; % V = I * Rf → offset DC + señal AC
-V_tia = V_tia_total - mean(V_tia_total); % solo componente AC
-% V_tia_AC pico = mod_depth * R * P_laser * Rf = 0.4*0.3*1e-3*10e3 = 1.2 mV
-% Nota: señal pequeña — el MAX9814 la amplifica
-
-% 4. MAX9814: amplificar y saturar
-V_max = Av_MAX * V_tia;
-V_max = max(-1.65, min(1.65, V_max)); % saturacion ±1.65V
-
-% 5. FFT sobre la señal capturada
-Y = fft(V_max);
-mag_Y = abs(Y);
-
-% Filtrado: umbral de magnitud (conservar picos principales)
-umbral = max(mag_Y) * 0.08;
-mascara = mag_Y > umbral;
-% Simetria conjugada obligatoria para ifft real
-mascara = mascara | flipud(mascara);
-Y_filt = Y .* mascara;
-
-% 6. Reconstruccion (IFFT)
-V_rec = real(ifft(Y_filt));
-
-% Escalar V_rec para comparar con audio_original (minimos cuadrados)
-factor = (audio_original' * V_rec) / (V_rec' * V_rec + 1e-12);
-V_rec_escalado = V_rec * factor;
-
-% Correlacion
-cc = corrcoef(audio_original, V_rec_escalado);
-rho = cc(1,2);
-
-fprintf(' Senal simulada:\n');
-fprintf(' Frecuencias: %.0f + %.0f + %.0f Hz\n', f1, f2, f3);
-fprintf(' I_foto DC: %.0f uA\n', mean(I_foto)*1e6);
-fprintf(' V_TIA AC pico: %.4f V\n', max(abs(V_tia)));
-fprintf(' V_MAX pico: %.4f V\n', max(abs(V_max)));
-fprintf(' Correlacion: %.4f\n\n', rho);
-
-%% ═══════════════════════════════════════════════════════
-% FIGURA PRINCIPAL
-%% ═══════════════════════════════════════════════════════
-fig = figure('Name','Simulacion 3D — Microfono Laser', ...
- 'NumberTitle','off', ...
- 'Position',[30 30 1500 900], ...
- 'Color',[0.05 0.05 0.08], ...
- 'KeyPressFcn', @(s,e) setappdata(s,'salir', strcmp(e.Key,'q')));
-setappdata(fig, 'salir', false);
-
-%% ═══════════════════════════════════════════════════════
-% SUBPLOT 3D
-%% ═══════════════════════════════════════════════════════
-ax3d = subplot('Position', [0.02 0.35 0.55 0.62]);
-set(ax3d,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','ZColor','w');
-hold(ax3d,'on'); grid(ax3d,'on');
-view(ax3d, 35, 22);
-xlabel(ax3d,'X (cm)','Color','w');
-ylabel(ax3d,'Y (cm)','Color','w');
-zlabel(ax3d,'Z (cm)','Color','w');
-title(ax3d,'Montaje experimental 3D','Color',[1 0.7 0.1],'FontWeight','bold','FontSize',12);
-ax3d.GridColor = [0.2 0.2 0.2];
-xlim(ax3d,[-2 58]); ylim(ax3d,[-3 38]); zlim(ax3d,[-1 33]);
-lighting(ax3d,'gouraud');
-light(ax3d,'Position',[60 60 60],'Style','infinite');
-
-% Helper: dibujar caja
- function dibujar_caja(ax,x0,y0,z0,Lx,Ly,Lz,col,al)
- verts = [x0 y0 z0;
- x0+Lx y0 z0;
- x0+Lx y0+Ly z0;
- x0 y0+Ly z0;
- x0 y0 z0+Lz;
- x0+Lx y0 z0+Lz;
- x0+Lx y0+Ly z0+Lz;
- x0 y0+Ly z0+Lz];
- faces = [1 2 6 5; 2 3 7 6; 3 4 8 7;
- 4 1 5 8; 1 2 3 4; 5 6 7 8];
- patch(ax,'Vertices',verts,'Faces',faces, ...
- 'FaceColor',col,'FaceAlpha',al, ...
- 'EdgeColor',[0.55 0.55 0.55],'LineWidth',0.7);
- end
-
-Lc = 20; % tamaño caja (cm)
-
-% Caja insonorizada
-dibujar_caja(ax3d, 0,0,0, Lc,Lc,Lc, [0.35 0.25 0.15], 0.22);
-text(ax3d, Lc/2, Lc/2, Lc+1.5,'Caja insonorizada', ...
- 'Color',[0.85 0.65 0.3],'FontSize',9,'HorizontalAlignment','center');
-
-% Vidrio (cara x=Lc)
-[yv,zv] = meshgrid(linspace(0.5,Lc-0.5,12), linspace(0.5,Lc-0.5,12));
-xv0 = Lc * ones(size(yv));
-h_vidrio = surf(ax3d, xv0, yv, zv, ...
- 'FaceColor',[0.5 0.8 1.0],'FaceAlpha',0.28, ...
- 'EdgeColor',[0.4 0.7 0.9],'EdgeAlpha',0.12);
-text(ax3d, Lc+0.3, Lc/2, Lc+0.8,'Vidrio', ...
- 'Color',[0.5 0.9 1.0],'FontSize',9);
-
-% Audifono dentro de la caja
-th = linspace(0,2*pi,40);
-for lado = [-1 1]
- yc = Lc/2 + lado*5;
- fill3(ax3d, Lc/2-0.3+zeros(1,40), ...
- yc + 3*cos(th), ...
- Lc/2 + 3*sin(th), ...
- [0.2 0.2 0.2],'FaceAlpha',0.85,'EdgeColor',[0.5 0.5 0.5]);
-end
-text(ax3d, Lc/2-5, Lc/2, Lc/2+5.5,'Audifono', ...
- 'Color',[0.7 0.7 0.7],'FontSize',8);
-
-% Modulo laser KY-008
-laser_pos = [35, 4, 10];
-[xl,yl,zl] = cylinder(0.8,20);
-surf(ax3d, xl*3+laser_pos(1), yl+laser_pos(2), zl+laser_pos(3), ...
- 'FaceColor',[0.15 0.65 0.15],'EdgeColor','none','FaceAlpha',0.92);
-text(ax3d, laser_pos(1)+0.5, laser_pos(2)-0.5, laser_pos(3)-2.2,'Laser KY-008', ...
- 'Color',[0.3 1.0 0.3],'FontSize',8,'FontWeight','bold');
-
-% Punto de impacto en vidrio
-P_imp = [Lc, 10, 10];
-
-% Haz laser (rojo solido)
-h_haz_ida = plot3(ax3d, ...
- [laser_pos(1) P_imp(1)], ...
- [laser_pos(2) P_imp(2)], ...
- [laser_pos(3) P_imp(3)], ...
- 'r-','LineWidth',2.5);
-
-% Reflexion hacia BPW34
-v_inc = (P_imp - laser_pos) / norm(P_imp - laser_pos);
-n_vid = [-1 0 0];
-v_ref = v_inc - 2*dot(v_inc,n_vid)*n_vid;
-bpw34_pos = P_imp + 12*v_ref;
-
-h_haz_ref = plot3(ax3d, ...
- [P_imp(1) bpw34_pos(1)], ...
- [P_imp(2) bpw34_pos(2)], ...
- [P_imp(3) bpw34_pos(3)], ...
- 'r--','LineWidth',1.8);
-
-% Punto de impacto
-plot3(ax3d, P_imp(1),P_imp(2),P_imp(3),'y*','MarkerSize',12,'LineWidth',2);
-
-% BPW34 (caja negra)
-dibujar_caja(ax3d, bpw34_pos(1)-1.2, bpw34_pos(2)-1.2, bpw34_pos(3)-1.2, ...
- 2.4, 2.4, 2.4, [0.08 0.08 0.08], 0.92);
-text(ax3d, bpw34_pos(1), bpw34_pos(2), bpw34_pos(3)+3.2,'BPW34', ...
- 'Color',[1.0 0.85 0.1],'FontSize',9,'FontWeight','bold','HorizontalAlignment','center');
-
-% Tubo negro (proteccion de luz ambiente)
-[xt,yt,zt] = cylinder(1.5,20);
-surf(ax3d, xt+bpw34_pos(1), yt+bpw34_pos(2), zt*5+bpw34_pos(3)-2.5, ...
- 'FaceColor',[0.07 0.07 0.07],'EdgeColor','none','FaceAlpha',0.55);
-
-% Protoboard + LM358 TIA
-proto = [37, 14, 4];
-dibujar_caja(ax3d, proto(1), proto(2), proto(3), 9, 5, 0.6, [0.1 0.5 0.1], 0.85);
-text(ax3d, proto(1)+4.5, proto(2)+2.5, proto(3)+2,'LM358 TIA', ...
- 'Color',[0.4 1.0 0.4],'FontSize',8,'HorizontalAlignment','center');
-
-% Cable BPW34 → TIA
-plot3(ax3d,[bpw34_pos(1) proto(1)+4], ...
- [bpw34_pos(2) proto(2)+2], ...
- [bpw34_pos(3) proto(3)+0.5], ...
- 'Color',[1 0.55 0.1],'LineWidth',1.5,'LineStyle',':');
-
-% MAX9814
-maxp = [37, 21, 4];
-dibujar_caja(ax3d, maxp(1), maxp(2), maxp(3), 7, 4, 1.2, [0.45 0.1 0.55], 0.88);
-text(ax3d, maxp(1)+3.5, maxp(2)+2, maxp(3)+2.8,'MAX9814', ...
- 'Color',[0.9 0.5 1.0],'FontSize',8,'HorizontalAlignment','center');
-
-% Cable TIA → MAX9814
-plot3(ax3d,[proto(1)+4 maxp(1)+3], ...
- [proto(2)+5 maxp(2)], ...
- [proto(3)+0.5 maxp(3)+0.6], ...
- 'Color',[1 0.55 0.1],'LineWidth',1.5,'LineStyle',':');
-
-% Laptop
-pcp = [46, 14, 4];
-% Pantalla
-fill3(ax3d,[pcp(1) pcp(1)+9 pcp(1)+9 pcp(1)], ...
- [pcp(2) pcp(2) pcp(2) pcp(2)], ...
- [pcp(3) pcp(3) pcp(3)+8 pcp(3)+8], ...
- [0.1 0.1 0.16],'EdgeColor',[0.5 0.5 0.5],'FaceAlpha',0.92);
-fill3(ax3d,[pcp(1)+0.5 pcp(1)+8.5 pcp(1)+8.5 pcp(1)+0.5], ...
- [pcp(2)-0.1 pcp(2)-0.1 pcp(2)-0.1 pcp(2)-0.1], ...
- [pcp(3)+0.5 pcp(3)+0.5 pcp(3)+7.5 pcp(3)+7.5], ...
- [0.05 0.3 0.4],'EdgeColor','none','FaceAlpha',0.85);
-% Base
-fill3(ax3d,[pcp(1) pcp(1)+9 pcp(1)+9 pcp(1)], ...
- [pcp(2) pcp(2) pcp(2)+4 pcp(2)+4], ...
- [pcp(3) pcp(3) pcp(3) pcp(3)], ...
- [0.2 0.2 0.2],'EdgeColor',[0.5 0.5 0.5],'FaceAlpha',0.92);
-text(ax3d, pcp(1)+4.5, pcp(2)-1.2, pcp(3)+4,'PC + MATLAB', ...
- 'Color',[0.3 0.85 1.0],'FontSize',9,'FontWeight','bold','HorizontalAlignment','center');
-
-% Cable MAX9814 → PC
-plot3(ax3d,[maxp(1)+7 pcp(1)], ...
- [maxp(2)+2 pcp(2)+2], ...
- [maxp(3)+0.6 pcp(3)+0.5], ...
- 'Color',[0.7 0.7 0.7],'LineWidth',2);
-
-% Leyenda
-legend(ax3d,[h_haz_ida,h_haz_ref], ...
- {'Haz laser (650nm)','Reflexion hacia BPW34'}, ...
- 'Location','northeast','TextColor','w', ...
- 'Color',[0.1 0.1 0.15],'EdgeColor',[0.4 0.4 0.4]);
-
-%% ═══════════════════════════════════════════════════════
-% SUBPLOTS INFERIORES DE SENAL
-%% ═══════════════════════════════════════════════════════
-c_audio = [1.0 0.7 0.1];
-c_foto = [1.0 0.4 0.3];
-c_tia = [0.3 0.8 1.0];
-c_rec = [0.4 1.0 0.4];
-
-ax_audio = subplot('Position',[0.02 0.03 0.22 0.28]);
-ax_ifoto = subplot('Position',[0.26 0.03 0.22 0.28]);
-ax_tia = subplot('Position',[0.50 0.03 0.22 0.28]);
-ax_fft = subplot('Position',[0.74 0.03 0.24 0.28]);
-
-function setup_ax(ax, ttl, col)
- set(ax,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w', ...
- 'GridColor',[0.15 0.15 0.15],'FontSize',8);
- grid(ax,'on');
- title(ax, ttl,'Color',col,'FontWeight','bold','FontSize',9);
- xlabel(ax,'Tiempo (s)','Color','w','FontSize',8);
-end
-
-setup_ax(ax_audio,'Audio en la caja', c_audio);
-setup_ax(ax_ifoto,'BPW34 — I_{foto} (uA)', c_foto);
-setup_ax(ax_tia, 'V_{TIA} + MAX9814 (mV)', c_tia);
-setup_ax(ax_fft, 'FFT — Espectro', c_rec);
-
-n_win = round(fs * 0.012); % ventana de 12 ms
-t_win = t(1:n_win);
-
-h_l_audio = plot(ax_audio, t_win, audio_original(1:n_win), 'Color',c_audio,'LineWidth',1.2);
-h_l_ifoto = plot(ax_ifoto, t_win, I_foto(1:n_win)*1e6, 'Color',c_foto, 'LineWidth',1.2);
-h_l_tia = plot(ax_tia, t_win, V_tia(1:n_win)*1e3, 'Color',c_tia, 'LineWidth',1.2);
-
-ylim(ax_audio,[-1.3 1.3]);
-ylim(ax_ifoto,[min(I_foto)*1e6*1.05 max(I_foto)*1e6*1.05]);
-ylim(ax_tia, [min(V_tia)*1e3*1.1 max(V_tia)*1e3*1.1]);
-
-% FFT estatica
-f_vec = (0:floor(N/2)) * fs / N;
-mag = abs(Y(1:floor(N/2)+1)) / N;
-mag(2:end-1) = 2*mag(2:end-1);
-plot(ax_fft, f_vec, mag,'Color',c_rec,'LineWidth',0.9);
-xlim(ax_fft,[0 2000]);
-set(ax_fft,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
-grid(ax_fft,'on');
-title(ax_fft,'FFT — Espectro','Color',c_rec,'FontWeight','bold','FontSize',9);
-xlabel(ax_fft,'Frecuencia (Hz)','Color','w','FontSize',8);
-hold(ax_fft,'on');
-for fi = [f1 f2 f3]
- [~,idx_fi] = min(abs(f_vec - fi));
- plot(ax_fft, fi, mag(idx_fi),'w^','MarkerSize',7,'MarkerFaceColor','w');
- text(ax_fft, fi, mag(idx_fi)*1.12, sprintf('%.0fHz',fi), ...
- 'Color','w','FontSize',7,'HorizontalAlignment','center');
-end
-
-%% ═══════════════════════════════════════════════════════
-% ANIMACION
-%% ═══════════════════════════════════════════════════════
-fprintf(' Iniciando animacion (presiona Q para salir)...\n\n');
-
-paso = round(fs/30); % ~30 fps
-n_frm = floor(N / paso);
-amp_v = 0.25; % cm vibracion max del vidrio
-
-for k = 1:n_frm
-
- if ~ishandle(fig) || getappdata(fig,'salir'), break; end
-
- i0 = (k-1)*paso + 1;
- i1 = min(i0 + n_win - 1, N);
- idx = i0:i1;
-
- if length(idx) < n_win, break; end
-
- % Vibracion del vidrio
- desp = amp_v * audio_original(i0);
- set(h_vidrio,'XData',(Lc + desp)*ones(size(yv)));
-
- % Haz laser sigue el punto de impacto
- P_imp_k = [Lc + desp, P_imp(2), P_imp(3)];
- set(h_haz_ida,'XData',[laser_pos(1) P_imp_k(1)], ...
- 'YData',[laser_pos(2) P_imp_k(2)], ...
- 'ZData',[laser_pos(3) P_imp_k(3)]);
- set(h_haz_ref,'XData',[P_imp_k(1) bpw34_pos(1)], ...
- 'YData',[P_imp_k(2) bpw34_pos(2)], ...
- 'ZData',[P_imp_k(3) bpw34_pos(3)]);
-
- % Actualizar graficas
- tw = t(idx);
- set(h_l_audio,'XData',tw,'YData',audio_original(idx));
- set(h_l_ifoto,'XData',tw,'YData',I_foto(idx)*1e6);
- set(h_l_tia, 'XData',tw,'YData',V_tia(idx)*1e3);
- xlim(ax_audio,[tw(1) tw(end)]);
- xlim(ax_ifoto,[tw(1) tw(end)]);
- xlim(ax_tia, [tw(1) tw(end)]);
-
- title(ax3d, sprintf('Montaje 3D — t = %.3f s | P_{laser} = %.5f W', ...
- t(i0), P_luz(i0)), ...
- 'Color',[1 0.7 0.1],'FontWeight','bold','FontSize',11);
-
- drawnow limitrate;
-end
-
-%% ═══════════════════════════════════════════════════════
-% FIGURA FINAL: RECONSTRUCCION
-%% ═══════════════════════════════════════════════════════
-fprintf(' Animacion terminada.\n\n');
-
-figure('Name','Reconstruccion FFT','NumberTitle','off', ...
- 'Position',[80 80 1300 750],'Color',[0.05 0.05 0.08]);
-
-subplot(3,1,1);
-plot(t, audio_original,'Color',c_audio,'LineWidth',0.8);
-set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
-grid on;
-title('Audio original dentro de la caja','Color',c_audio,'FontWeight','bold','FontSize',11);
-xlabel('Tiempo (s)','Color','w'); ylabel('Amplitud','Color','w');
-xlim([0 duracion]);
-
-subplot(3,1,2);
-plot(t, V_max,'Color',c_tia,'LineWidth',0.8);
-set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
-grid on;
-title('Senal capturada (MAX9814 out)','Color',c_tia,'FontWeight','bold','FontSize',11);
-xlabel('Tiempo (s)','Color','w'); ylabel('V (V)','Color','w');
-xlim([0 duracion]);
-
-subplot(3,1,3);
-plot(t, V_rec_escalado,'Color',c_rec,'LineWidth',0.8);
-set(gca,'Color',[0.05 0.05 0.08],'XColor','w','YColor','w','GridColor',[0.15 0.15 0.15]);
-grid on;
-title(sprintf('Senal reconstruida (IFFT) — correlacion: %.4f', rho), ...
- 'Color',c_rec,'FontWeight','bold','FontSize',11);
-xlabel('Tiempo (s)','Color','w'); ylabel('Amplitud','Color','w');
-xlim([0 duracion]);
-
-V_play = V_rec_escalado / max(abs(V_rec_escalado) + 1e-10);
-fprintf(' Reproduciendo senal reconstruida...\n');
-sound(V_play, fs);
-
-fprintf('\n╔══════════════════════════════════════════════════════╗\n');
-fprintf('║ Simulacion completada ║\n');
-fprintf('║ Correlacion original / reconstruido: %.4f ║\n', rho);
-fprintf('╚══════════════════════════════════════════════════════╝\n');
\ No newline at end of file