35.1 Objetivo del proyecto
Construiremos un laboratorio que conecte una ecuación de onda con una animación, resultados numéricos y una demostración sonora.
El usuario podrá modificar frecuencia, velocidad, amplitud, distancia, reflexión, atenuación y posición de medida. Todos los resultados deberán actualizarse desde un único estado.
35.2 Fenómenos integrados
- Propagación de una onda armónica.
- Relación entre frecuencia, velocidad y longitud de onda.
- Reflexión con conservación o inversión de fase.
- Atenuación acumulada durante el recorrido.
- Interferencia entre onda incidente y reflejada.
- Medición temporal en una posición fija.
- Retardo audible de un primer eco.
35.3 Alcance y simplificaciones
El espacio se reduce a una dimensión x. El medio es homogéneo, la velocidad permanece constante y la frontera está fija en x = L.
El modelo no resuelve una sala tridimensional. Su propósito es mostrar relaciones causales con suficiente claridad para experimentar.
35.4 Unidades coherentes
Usaremos metros, segundos, hertz y metros por segundo. Mantener unidades coherentes evita factores ocultos:
λ = v/f | T = 1/f | k = 2π/λ | ω = 2πf
La animación puede acelerar visualmente el tiempo, pero los cálculos deben conservar sus unidades físicas.
35.5 Onda incidente
Una onda que viaja hacia valores crecientes de x puede representarse como:
yi(x,t) = Aᵢ(x) sen(kx − ωt)
El signo entre kx y ωt determina el sentido de propagación. Cambiar ambos signos no cambia la señal, pero cambiar solo uno invierte el sentido.
35.6 Atenuación de amplitud
Si a se expresa en dB por metro, la amplitud después de recorrer una distancia d se multiplica por:
g(d) = 10−ad/20
La onda incidente en x tiene Aᵢ(x) = A·g(x). El divisor 20 corresponde a una razón de amplitudes.
35.7 Reflexión en la frontera
La onda reflejada recorrió desde la fuente hasta L y regresó desde L hasta x. Su recorrido total es 2L − x:
yr(x,t) = rA·g(2L − x) sen[k(2L − x) − ωt]
El coeficiente r puede ser positivo o negativo. Un valor negativo incorpora una inversión de fase.
35.8 Superposición
La perturbación total es la suma:
y(x,t) = yi(x,t) + yr(x,t)
Cuando |r| se acerca a 1 y las pérdidas son pequeñas aparece un patrón cercano a una onda estacionaria. Con r = 0 solo queda la onda viajera.
35.9 Potencia reflejada
Si r es un coeficiente de amplitud compatible con el modelo, la fracción reflejada de potencia es:
R = r²
La fracción 1 − R no reflejada puede transmitirse, absorberse o repartirse entre ambos procesos. El laboratorio no intenta separarlos.
35.10 Retardo de ida y vuelta
Para un emisor y receptor próximos al origen, el primer retorno recorre 2L:
Δteco = 2L/v
Este retardo se usará en la demostración sonora. No debe confundirse con el período de la onda.
35.11 Sensor virtual
Un sensor fijo en x = xs registra la evolución temporal y(xs,t). El gráfico espacial es una fotografía; el gráfico del sensor es una historia.
Ambas representaciones provienen de la misma función, evaluada con una variable diferente.
35.12 Amplitud local mediante fasores
Las dos componentes tienen la misma frecuencia. Su amplitud pico local puede calcularse sumando fasores:
Alocal = √[Aᵢ² + Aᵣ² + 2AᵢAᵣ cos(φᵢ − φᵣ)]
Aᵣ conserva el signo de r. El valor RMS de una sinusoide local es Alocal/√2.
35.13 Estado único de la aplicación
Los controles no deben modificar dibujos aislados. Primero se leen y validan todos los parámetros; después se derivan λ, k, ω, retardos y amplitudes.
Este flujo evita que una etiqueta muestre un valor mientras el gráfico utiliza otro.
35.14 Funciones puras para el modelo
Las funciones físicas deberían recibir números y devolver números sin depender del DOM. Por ejemplo:
const gainForDistance = (lossDbM, distanceM) =>
10 ** (-lossDbM * distanceM / 20);
function incidentWave(x, t, model) {
const amplitude = model.amplitude * gainForDistance(model.lossDbM, x);
return amplitude * Math.sin(model.k * x - model.omega * t);
}Separar modelo e interfaz facilita probar los cálculos sin dibujar ni reproducir audio.
35.15 Arquitectura de actualización
controles → estado validado → magnitudes derivadas → resultados + Canvas + audio
Los eventos de entrada actualizan resultados estáticos. El bucle de animación solo avanza el tiempo y vuelve a dibujar.
35.16 Escalas de la simulación
Una frecuencia audible produce cientos de oscilaciones por segundo. Dibujarla en tiempo físico puede generar movimiento demasiado rápido para una pantalla.
La visualización puede usar una fase desacelerada y declararlo. El audio, en cambio, conserva la frecuencia seleccionada.
35.17 Mapeo espacial al Canvas
Si el dominio físico va de 0 a L y el gráfico ocupa desde x₀ hasta x₁:
xcanvas = x₀ + (x/L)(x₁ − x₀)
La transformación inversa permite convertir posiciones del puntero en metros si se agrega interacción directa.
35.18 Resolución independiente del dispositivo
El lienzo debe redimensionarse según su tamaño visible y la densidad de píxeles. Después se dibuja en coordenadas CSS mediante una transformación.
La simulación física no debe depender de la cantidad de píxeles: aumentar el ancho solo agrega puntos visuales.
35.19 Reloj y pausa
El tiempo visual se incrementa usando la diferencia entre cuadros, limitada para evitar saltos enormes cuando la pestaña estuvo inactiva.
Pausar detiene el avance de fase, pero los controles siguen actualizando el estado y permiten inspeccionar una fotografía.
35.20 Grafo de audio del eco
La demostración usa una fuente que llega por dos caminos:
oscilador → ganancia maestra → camino directo
oscilador → ganancia maestra → retardo → ganancia reflejada → destino
La ganancia reflejada incorpora r y la pérdida del recorrido 2L. Un valor negativo representa inversión.
35.21 Envolvente de reproducción
La ganancia maestra sube y baja gradualmente. Así se evitan discontinuidades al iniciar y detener el tono.
El volumen se mantiene deliberadamente bajo. El nivel acústico real depende del equipo del usuario.
35.22 Accesibilidad
Los controles incluyen etiquetas y salidas numéricas. Los resultados usan aria-live para comunicar cambios sin convertir cada cuadro de animación en un anuncio.
La simulación conserva una explicación textual y un elemento noscript. El color no es el único medio para distinguir las curvas: también se nombran en la leyenda.
35.23 Validación de entradas
La posición del sensor debe permanecer dentro del dominio. La velocidad y la frecuencia deben ser positivas. El coeficiente r debe limitarse entre −1 y 1.
Además de los atributos HTML, el modelo debe protegerse frente a valores programáticos inválidos.
35.24 Pruebas físicas
- Si r = 0, la componente reflejada debe desaparecer.
- Si a = 0, la amplitud no debe disminuir con el recorrido.
- Duplicar f con v fija debe reducir λ a la mitad.
- Cambiar el signo de r debe invertir la fase reflejada.
- Duplicar L debe duplicar el retardo del eco.
- R debe permanecer entre 0 y 1.
35.25 Pruebas de interfaz
También deben verificarse pausa, restablecimiento, redimensionado, teclado, foco visible y reproducción repetida.
Los valores iniciales escritos en HTML tienen que coincidir con el primer cálculo de JavaScript para evitar un salto al cargar.
35.26 Rendimiento
El bucle de dibujo reutiliza el contexto y evita crear grandes arreglos en cada cuadro. La cantidad de evaluaciones espaciales se relaciona con el ancho visible.
El audio se programa en Web Audio y no mediante temporizadores del hilo de interfaz.
35.27 Desarrollo por etapas
- Dibujar una sinusoide estática.
- Animar la onda incidente.
- Agregar frontera y reflexión.
- Incorporar atenuación y sensor.
- Mostrar resultados y validaciones.
- Agregar audio con retardo.
- Probar casos límite y accesibilidad.
35.28 Núcleo matemático en JavaScript
function deriveModel({ frequency, speed, amplitude, length, reflection, lossDbM }) {
const wavelength = speed / frequency;
return {
frequency,
speed,
amplitude,
length,
reflection,
lossDbM,
wavelength,
period: 1 / frequency,
k: 2 * Math.PI / wavelength,
omega: 2 * Math.PI * frequency,
echoDelay: 2 * length / speed,
reflectedPower: reflection ** 2
};
}
function totalWave(x, t, model) {
const incidentGain = 10 ** (-model.lossDbM * x / 20);
const reflectedPath = 2 * model.length - x;
const reflectedGain = 10 ** (-model.lossDbM * reflectedPath / 20);
const incident = model.amplitude * incidentGain *
Math.sin(model.k * x - model.omega * t);
const reflected = model.reflection * model.amplitude * reflectedGain *
Math.sin(model.k * reflectedPath - model.omega * t);
return incident + reflected;
}35.29 Errores frecuentes
- Usar la distancia x para atenuar la reflexión en vez de su recorrido
2L − x. - Confundir r con R y elevar dos veces al cuadrado.
- Aplicar decibelios de intensidad con divisor 20 o amplitud con divisor 10.
- Hacer depender el modelo físico del ancho del Canvas.
- Programar audio con el reloj de animación.
- Permitir que el sensor quede fuera del dominio al reducir L.
- Reproducir a ganancia alta o sin envolvente.
35.30 Laboratorio integrador
La curva superior muestra una fotografía espacial. La inferior muestra tres períodos medidos por el sensor. Usá r = 0 para una onda viajera y |r| cercano a 1 para observar interferencia intensa.
Modelo: λ = 340/200 = 1,700 m; R = (−0,70)² = 0,490.
La reflexión está invertida y conserva 49,0 % de la potencia incidente antes de las pérdidas del recorrido.
35.31 Ejercicio resuelto: comprobar un caso límite
Tomemos r = 0, a = 0, f = 100 Hz, v = 300 m/s y A = 0,6.
La longitud de onda es 3 m y el período 10 ms. Como r = 0, R = 0, la onda reflejada desaparece y el valor pico local es 0,6 en cualquier posición.
const model = deriveModel({
frequency: 100,
speed: 300,
amplitude: 0.6,
length: 9,
reflection: 0,
lossDbM: 0
});
console.assert(model.wavelength === 3);
console.assert(model.period === 0.01);
console.assert(model.reflectedPower === 0);35.32 Límites del proyecto
El modelo es coherente en una dimensión, pero no incluye divergencia esférica, ángulos, difracción, modos tridimensionales ni múltiples fronteras.
La demostración sonora representa un tono directo y un primer retorno. No sintetiza exactamente la presión mostrada en cada punto ni reemplaza una simulación acústica de recintos.
35.33 Ampliaciones propuestas
- Agregar una segunda frontera y reflexiones repetidas.
- Incorporar pulsos además de ondas armónicas.
- Permitir varios sensores y comparar fases.
- Mostrar energía incidente, reflejada y transmitida.
- Guardar configuraciones en JSON.
- Exportar muestras a un archivo de audio.
- Crear pruebas automáticas para las funciones físicas.
35.34 Ejercicio propuesto
Configurá f = 250 Hz, v = 350 m/s, A = 0,75, L = 7 m, r = 0,60, a = 0,10 dB/m y un sensor en x = 2 m.
- Calculá λ, T, k y ω.
- Calculá el retardo de ida y vuelta.
- Calculá R y la fracción no reflejada.
- Calculá las amplitudes incidente y reflejada que llegan al sensor.
- Implementá una función que calcule la amplitud pico local.
- Comprobá el resultado con el laboratorio.
Ver solución y explicación
λ = 1,4 m, T = 4 ms, k ≈ 4,488 rad/m y ω ≈ 1570,796 rad/s. El retardo es 2·7/350 = 0,040 s.
R = 0,60² = 0,36 y la fracción no reflejada es 0,64. En el sensor, Aᵢ = 0,75·10−0,10·2/20 ≈ 0,733. La reflexión recorrió 12 m: Aᵣ = 0,60·0,75·10−0,10·12/20 ≈ 0,392.
Con las fases φᵢ = k·2 y φᵣ = k·12, la suma fasorial produce una amplitud pico local aproximada de 1,024.
35.35 Ideas para recordar
- Un proyecto sólido separa modelo físico, estado, dibujo y audio.
- La reflexión recorre
2L − xantes de regresar a una posición x. - El signo de r controla la inversión; r² controla la fracción de potencia reflejada.
- La atenuación de amplitud en dB usa el factor
10−ad/20. - Una fotografía espacial y un registro temporal muestran aspectos diferentes de la misma onda.
- Las pruebas de casos límite revelan errores de física y programación.
- La visualización puede desacelerarse; los cálculos deben conservar unidades.