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:

  1. Identificar qué frecuencias componen la señal capturada
  2. 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:

ComponenteFunciónParámetro clave
Láser D18×65mm 650nm 5mWFuente de luz, punto continuoEnfocable, montado en soporte Neiko ~30°
BPW34 (fotodiodo PIN)Luz → corrienteR = 0.3 A/W @ 650 nm, en tubo negro
LM358 (TIA)Corriente → voltajeRf = 10 kΩ, Cf = 100 pF
Capacitor C_ac 10 µFBloqueo de offset DCfc = 1.6 Hz
MAX9814 HiLetgoAmplificador AGCAv = 40 dB (GAIN flotante)
Capacitor C_sal 47 µFBloqueo offset salidafc = 0.34 Hz
Módulo Jack ShillehTek 3.5mmInterfaz PCEntrada micrófono, breakout TRRS
ESP32Fuente de alimentación 5VPin VIN → rail protoboard
Soporte NeikoPosicionar láser en ánguloAjuste ~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

Diagrama de circuito completo: BPW34 → TIA LM358 → MAX9814 → Jack PC

Montaje experimental

Simulacion 3D animada del montaje experimental completo

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ñalFrecuenciasPor qué es interesante
Tono puro1000 HzCaso base, señal más simple posible
Acorde Do Mayor262 + 330 + 392 HzTres frecuencias simultáneas (Do, Mi, Sol)
Barrido (chirp)100 → 1000 HzFrecuencia variable en el tiempo
Señal compleja262·k Hz, k=1..5Serie 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/2 directamente para indexar, lo que fallaba cuando N es impar. La solución correcta es floor(N/2) en todos los índices, y construir la simetría conjugada explícitamente. Esto asegura que la máscara tenga exactamente N elementos 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.

Pipeline completo para las 4 señales de prueba: ideal, capturada, reconstruida y espectro FFT

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ñalError RMSSNR (dB)CorrelaciónResultado
Tono puro2.79 × 10⁻⁶102.1 dB1.0000Excelente
Acorde2.87 × 10⁻⁴62.1 dB1.0000Excelente
Barrido1.06 × 10⁻²30.5 dB0.9996Muy bueno
Compleja3.00 × 10⁻⁴63.1 dB1.0000Excelente

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

Descomposicion SVD de la matriz de trayectoria para las 4 señales

El análisis de valores singulares confirma la intuición teórica sobre la complejidad de cada señal:

SeñalVarianza acumulada en 5 modos
Tono puro99.0%casi toda la energía en 1–2 modos
Acorde84.3%~3 modos significativos (uno por frecuencia)
Barrido9.3%energía muy distribuida
Compleja88.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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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:

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.