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. Las variaciones de presión acústica alteran levemente el índice de refracción del aire. Un fotosensor (fotodiodo o LDR) colocado al otro extremo del haz detecta esas fluctuaciones de intensidad como una señal eléctrica proporcional a la onda de sonido original:
$$V(t) = A \cdot \sin(2\pi f t) + \eta(t)$$
donde $\eta(t)$ es el ruido introducido por el fotosensor y el ambiente. El reto de este proyecto 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 una 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.
Metodología de Simulación
Para validar los algoritmos sin hardware, generé cuatro tipos de señal en MATLAB y simulé el proceso completo: generación → captura con ruido → filtrado → reconstrucción → validación.
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 |
Todas se contaminaron con ruido gaussiano de amplitud 0.05 para simular el fotosensor real.
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 (o generaba tamaños inconsistentes). 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 con ruido (simulando el fotosensor) → 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 | 3.8 × 10⁻⁵ | 79.4 dB | 1.0000 | Excelente |
| Acorde | 3.3 × 10⁻⁴ | 61.0 dB | 1.0000 | Excelente |
| Barrido | 1.3 × 10⁻² | 28.7 dB | 0.9993 | Muy bueno |
| Compleja | 3.4 × 10⁻⁴ | 62.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 28.7 y 79.4 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 | 98.0% — casi toda la energía en 1–2 modos |
| Acorde | 83.5% — ~3 modos significativos (uno por frecuencia) |
| Barrido | 9.2% — energía muy distribuida |
| Compleja | 88.0% — 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 (para eso existiría el espectrograma o la STFT, trabajo futuro).
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 79.4 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 28.7 dB y correlación 0.9993, 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.
La simulación valida la arquitectura antes del hardware. Este es el punto más importante para el proyecto: ya sé que los algoritmos funcionan. Ahora puedo construir el fotosensor real con confianza.
Próximos Pasos
El hardware objetivo es:
- Láser: módulo de 650 nm (rojo visible), económico y fácil de conseguir
- Fotosensor: fotodiodo BPW34 o LDR con amplificador operacional LM358
- Adquisición: tarjeta de sonido USB o ADC externo para capturar la señal a 44.1 kHz
- Procesamiento: el mismo script MATLAB, ahora alimentado con datos reales
- Futuro: migrar el procesamiento a la Raspberry Pi 4 disponible para hacerlo en tiempo real
El siguiente post documentará la construcción del hardware y la primera captura real de audio. Si el SNR real se acerca al simulado, el sistema está listo para aplicaciones más ambiciosas: reconocimiento de voz, detección de vibraciones estructurales, o comunicación óptica de corto alcance.
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.