Reconstrucción de Sonido con Láser y Fotosensor: De la Teoría al Código
By B.E. Alejandro
El Problema: ¿Puede un Rayo de Luz Transportar Sonido?
La idea surgió de una pregunta aparentemente simple en clase de física: si el sonido es una onda mecánica que vibra el aire, ¿podría esa vibración modular un haz de luz y recuperarse después?
La respuesta es sí, y el principio es elegante. El sonido dentro de una caja insonorizada hace vibrar un panel de vidrio. Un láser de 650 nm apunta al vidrio desde afuera; el reflejo modulado por las vibraciones es capturado por un fotodiodo BPW34. La corriente fotoeléctrica resultante pasa por un amplificador de transimpedancia (TIA LM358) que la convierte en voltaje, luego por un MAX9814 con control de ganancia automático (AGC), y finalmente llega al jack de micrófono de la PC donde MATLAB la digitaliza y reconstruye el audio original:
$$V(t) = A \cdot \sin(2\pi f t) + \eta(t)$$
donde $\eta(t)$ es el ruido introducido por el sistema óptico-electrónico. El reto es precisamente ese: dado que $\eta(t)$ siempre existe, ¿cómo recuperamos la señal $A \cdot \sin(2\pi f t)$ con la mayor fidelidad posible?
Este post documenta la fase de simulación completa en MATLAB que valida los algoritmos antes de construir el hardware real.
Fundamentos Teóricos
Transformada de Fourier (FFT)
El teorema de Fourier establece que cualquier señal periódica puede descomponerse como suma de senos y cosenos. La Transformada de Fourier Discreta (DFT) hace esto numéricamente:
$$X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi kn/N}$$
La FFT (Fast Fourier Transform) es un algoritmo eficiente para calcular la DFT en $O(N \log N)$ en lugar de $O(N^2)$. Para este proyecto, la FFT cumple dos funciones:
- Identificar qué frecuencias componen la señal capturada
- Filtrar el ruido eliminando componentes espectrales débiles
Descomposición en Valores Singulares (SVD)
Dado que el proyecto conecta con el tema de espacios vectoriales del semestre, también apliqué SVD para analizar la estructura de cada señal. Dada una matriz de trayectoria $M$ construida a partir de la señal:
$$M = U \cdot \Sigma \cdot V^T$$
Los valores singulares $\sigma_i$ en $\Sigma$ revelan cuántos “modos independientes” necesita la señal para representarse. Una señal simple (tono puro) tiene muy pocos valores singulares grandes; una señal compleja los tiene distribuidos.
Conexión con el curso: El SVD es esencialmente un cambio de base ortogonal. Los vectores columna de $U$ son la nueva base en el espacio de la señal, y los valores singulares son las “coordenadas” de importancia de cada vector base. Exactamente el mismo concepto de base ortonormal que vimos en clase.
El Hardware
El sistema físico que se simulará y construirá está formado por los siguientes componentes, elegidos por su precisión y bajo ruido:
| Componente | Función | Parámetro clave |
|---|---|---|
| Láser D18×65mm 650nm 5mW | Fuente de luz, punto continuo | Enfocable, montado en soporte Neiko ~30° |
| BPW34 (fotodiodo PIN) | Luz → corriente | R = 0.3 A/W @ 650 nm, en tubo negro |
| LM358 (TIA) | Corriente → voltaje | Rf = 10 kΩ, Cf = 100 pF |
| Capacitor C_ac 10 µF | Bloqueo de offset DC | fc = 1.6 Hz |
| MAX9814 HiLetgo | Amplificador AGC | Av = 40 dB (GAIN flotante) |
| Capacitor C_sal 47 µF | Bloqueo offset salida | fc = 0.34 Hz |
| Módulo Jack ShillehTek 3.5mm | Interfaz PC | Entrada micrófono, breakout TRRS |
| ESP32 | Fuente de alimentación 5V | Pin VIN → rail protoboard |
| Soporte Neiko | Posicionar láser en ángulo | Ajuste ~30° sobre el vidrio |
La ventaja principal del BPW34 sobre un LDR es su tiempo de respuesta: 20 ns frente a ~1 ms, permitiendo capturar audio hasta 20 kHz sin ninguna degradación por el sensor.
Diagrama del circuito

Montaje experimental

La escena 3D muestra el montaje completo: caja insonorizada con vidrio vibrante, láser industrial D18×65 mm sobre soporte Neiko apuntando al vidrio en ~30°, BPW34 en tubo negro en el ángulo de reflexión especular, y el circuito completo (ESP32 + LM358 + MAX9814 + módulo jack) en la protoboard. La animación sincroniza la vibración del vidrio con las señales en tiempo real en cada etapa del pipeline.
Metodología de Simulación
Para validar los algoritmos sin hardware, generé cuatro tipos de señal en MATLAB y simulé el proceso completo con el pipeline óptico-electrónico real: generación → modulación óptica → BPW34 → TIA → MAX9814 → filtrado FFT → reconstrucción → validación.
A diferencia de simplemente sumar ruido gaussiano, el modelo simula la cadena física completa:
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
P_luz = P_laser * (1 + mod_depth * audio);
% 2. BPW34: fotocorriente = responsividad x potencia + shot noise
I_foto = R_bpw34 * P_luz + ruido * 1e-4 * randn(size(audio));
% 3. TIA LM358: I → V, eliminar offset DC (como el capacitor C_ac)
V_tia = I_foto * Rf_TIA;
V_tia = V_tia - mean(V_tia);
% 4. MAX9814: amplificar y saturar (±1.65V)
V_max = Av_MAX * V_tia;
v_out = max(-1.65, min(1.65, V_max));
end
El ruido del BPW34 (shot noise) es de apenas 0.8% de la señal — notablemente menor que el 5% típico de un LDR, lo que explica los resultados de SNR superiores.
Las Cuatro Señales de Prueba
| Señal | Frecuencias | Por qué es interesante |
|---|---|---|
| Tono puro | 1000 Hz | Caso base, señal más simple posible |
| Acorde Do Mayor | 262 + 330 + 392 Hz | Tres frecuencias simultáneas (Do, Mi, Sol) |
| Barrido (chirp) | 100 → 1000 Hz | Frecuencia variable en el tiempo |
| Señal compleja | 262·k Hz, k=1..5 | Serie armónica, simula voz humana |
El Algoritmo de Reconstrucción
El núcleo del sistema es el filtrado espectral: se aplica una máscara binaria al espectro FFT que conserva solo las componentes que superan el 10% del pico máximo, luego se reconstruye la señal con la IFFT. La clave es mantener la simetría hermitiana del espectro para que la IFFT devuelva valores reales:
function senial_rec = reconstruir_por_fft(senial_ruidosa)
N = length(senial_ruidosa);
Y = fft(senial_ruidosa);
% Magnitud del espectro unilateral (DC hasta Nyquist inclusive)
mag_pos = abs(Y(1 : floor(N/2) + 1));
umbral = max(mag_pos) * 0.1;
% Máscara binaria: 1 donde la señal supera el umbral
mascara_pos = double(mag_pos > umbral);
% Máscara completa con simetría hermitiana para señal real
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
Error que cometí: En versiones anteriores usé
N/2directamente para indexar, lo que fallaba cuandoNes impar. La solución correcta esfloor(N/2)en todos los índices, y construir la simetría conjugada explícitamente. Esto asegura que la máscara tenga exactamenteNelementos sin importar la paridad de la longitud de la señal.
Resultados
Gráficas Completas
La siguiente figura muestra el pipeline completo para las cuatro señales: señal ideal → señal capturada por el sensor (BPW34→MAX9814) → señal reconstruida → espectro FFT con el SNR obtenido.

Lo más notable visualmente: la columna “Reconstruido” (verde) recupera la forma de onda con una fidelidad que hace casi indistinguible el resultado del original, a pesar del ruido visible en la columna “Capturado”.
Métricas Cuantitativas
Para no quedarme solo con la inspección visual, calculé tres métricas de error para cada señal. La señal reconstruida se escala antes de comparar (producto interno mínimo cuadrados) para separar el error de fase/forma del error de amplitud:
| Señal | Error RMS | SNR (dB) | Correlación | Resultado |
|---|---|---|---|---|
| Tono puro | 2.79 × 10⁻⁶ | 102.1 dB | 1.0000 | Excelente |
| Acorde | 2.87 × 10⁻⁴ | 62.1 dB | 1.0000 | Excelente |
| Barrido | 1.06 × 10⁻² | 30.5 dB | 0.9996 | Muy bueno |
| Compleja | 3.00 × 10⁻⁴ | 63.1 dB | 1.0000 | Excelente |
Referencia: En audio, un SNR por encima de 20 dB ya es considerado aceptable para reproducción de voz. Por encima de 40 dB es transparente para el oído humano en la mayoría de condiciones. Los resultados de este sistema están entre 30.5 y 102.1 dB.
Análisis SVD

El análisis de valores singulares confirma la intuición teórica sobre la complejidad de cada señal:
| Señal | Varianza acumulada en 5 modos | |
|---|---|---|
| Tono puro | 99.0% | casi toda la energía en 1–2 modos |
| Acorde | 84.3% | ~3 modos significativos (uno por frecuencia) |
| Barrido | 9.3% | energía muy distribuida |
| Compleja | 88.6% | varios modos (armónicos) |
El caso del barrido es el más revelador: como la frecuencia cambia continuamente de 100 a 1000 Hz durante 3 segundos, ningún modo fijo puede capturar bien la señal. Necesita cientos de vectores singulares para representarse fielmente. Esto explica matemáticamente por qué tiene el SNR más bajo: el filtro FFT de umbral fijo no es el mejor para señales variantes en el tiempo.
El Código Completo
El script completo está disponible en el repositorio del proyecto:
Código fuente: script_prueba_demostracion.m — MATLAB R2016b o superior, requiere Signal Processing Toolbox.
Conclusiones
Los resultados de la simulación son claros:
El filtrado espectral FFT funciona. SNR de hasta 102.1 dB para el tono puro y correlación de 1.0000 en tres de las cuatro señales. El sistema recupera la forma de onda con fidelidad suficiente para reproducción de audio.
La señal más difícil es el barrido (chirp). Con 30.5 dB y correlación 0.9996, sigue siendo muy buena, pero revela la limitación del filtro de umbral fijo: no es el mejor para señales cuya frecuencia varía en el tiempo. La STFT (Short-Time Fourier Transform) o una transformada Wavelet serían mejores herramientas para ese caso.
El SVD confirma la teoría de espacios vectoriales. El rango efectivo de la señal (medido por los valores singulares) refleja directamente su complejidad: 1–2 modos para el tono puro, cientos para el barrido.
El BPW34 supera al LDR. El shot noise del BPW34 es de apenas 0.8% de la señal, frente al 5% típico de un LDR. Esto se traduce directamente en SNR más alto y reconstrucción más fiel.
La simulación valida la arquitectura antes del hardware. Ya sé que los algoritmos funcionan. Ahora puedo construir el sistema real con confianza.
Próximos Pasos
El hardware está definido y en camino:
- Montaje físico: láser D18×65mm sobre soporte Neiko, BPW34 en tubo negro, circuito en protoboard 830 puntos
- Primera captura real: comparar SNR experimental con el simulado (objetivo: >20 dB)
- Señales de prueba: tono puro de generador, luego voz, luego música
- Futuro: STFT para mejorar la reconstrucción del chirp y señales variantes en el tiempo
El siguiente post documentará la construcción del hardware y la primera captura real de audio.
Este proyecto es parte del curso de Física II (Ondas, Oscilaciones y Espacios Vectoriales), segundo semestre. Todo el código es de acceso libre en Codeberg.