domingo, enero 14, 2007

El Sonido y Matlab u Octave


¿Cómo hago sonido con el Matlab?



El computador funciona de forma discreta, es decir, trabaja con números, que guardamos en la memoria del computador. Para este caso, vamos a guardar los números en vectores.
Un ejemplo de vector es [1,2,3,4,5,6,10].

Para hacer sonidos de forma digital, necesitamos una señal, que en este caso, es un vector con muchos números guardados en él, a veces millones de números. Este vector tiene que contener el sonido que queremos generar.

Ahora el problema es ¿Qué características debe tener el vector que guarda el sonido?

¿Qué es un sonido? ¿Cómo construyo un sonido con Matlab u Octave?

Vamos por parte.
De forma muy general, un sonido es una vibración, una onda.
Ahora ¿Qué función matemática representa bien una vibración u onda?  Pues la función seno. De hecho, al graficarla, vemos la forma de olas u ondas.


¿Cómo sé que es una  función seno?

Para intentar explicar esto imaginemos una cuerda. Una cuerda vibrando y que suena: La cuerda que se mueve, vibrando (Fig. 1) y le sacamos una foto en un instante. Cuando la cuerda esta quieta, no vibrando, decimos que está en el valor cero (Fig. 2). Mientras empieza a moverse de izquierda a derecha va adquiriendo valores, los que medimos con respecto al medio de la cuerda desde el punto donde esta quieta -cuando esta en cero- (Fig.3), su elongación máxima será 1 a la derecha, y -1 a la izquierda (Fig.5 y 6).

Cada foto que le saqué a la onda que representé como cuerda, tendrá un valor que se guardará en el vector. 

Pero como el movimiento es una vibración, tengo que guardar estos valores cada cierto intervalo de tiempo. Ese intervalo de tiempo en que saco fotos, debe permitir mostrar la onda y todos los movimientos hechos en un ciclo.

¿Cada cuánto tiempo registro la onda?
El tiempo entre que saco una foto y otra foto a la onda, para saber su posición, se define como "Periodo de muestreo", pero es mas útil su inverso: 1 /(periodo de tiempo). Es ahí donde aparece el concepto de “Frecuencia de Muestreo”.

La frecuencia de Muestreo fm, es la cantidad de muestras (fotos en la analogía) que se toman en 1 segundo. Si tomamos la gráfica de los valores que va tomando la onda (cuerda), en el “eje y” ponemos los valores en función del tiempo, y en el “eje x” el tiempo, la frecuencia de muestreo en la figura es 1[Hz], pues muestreo (tomo una foto) 1 vez por segundo.
Lo que guardo es lo que se ve arriba. Hay que notar que la función representada por los puntos muestreados es parecida a la real, pero hay diferencias. Esa diferencia mejoraría si la frecuencia de muestreo fuera mayor, es decir, si se muestrearan puntos más frecuentemente.


Frecuencia de muestreo

Lógicamente cuando tengo una mayor frecuencia de muestreo mejor será la calidad del sonido, porque estaré representando con más puntos mi función.

Por ejemplo el teléfono funciona a 8000 [Hz], y se escucha más o menos no más, (Sobre todo cuando hacen esos contactos con las unidades móviles en la Radio); Los CD tienen una frecuencia de muestreo de 44.100[Hz] la radio de 22100[Hz], bueno como dato no más.

El código para Matlab u Octave para hacer sonido


Hago lo comentado arriba en matlab con el comando sound que reproduce un vector con su frecuencia de muestreo. El comando sound funciona tanto en Matlab, como también hay un comando sound en Octave. Ha sido probado en ambas plataformas.  GNU Octave se probó en su  versión 4.2.2 en linux mint.

Otro comando que se usa para guardar el sonido es wavwrite que está disponible en Octave, para Matlab debe usarse el comando audiowrite,quedo que ha sido puesto en el código de abajo comentado, entonces si corres esto en Matlab debes comentar la línea que dice "wavwrite" y descomentar la de "audiowrite".







Para los que no tengan Matlab u Octave:
1) Sonido que se debería escuchar
2) Gráfico de un pedacito de señal, nótese que los valores que da están entre 1 y -1, y que en el eje x esta graficado el tiempo en segundos. Se nota la forma de sinusoide


:)

10 comentarios:

Anónimo dijo...

Excelente aporte!

Anónimo dijo...

Excelente!

Esto me sirve como guía para realizar algunos trabajos con sonido!!

Anónimo dijo...

Muchas gracias, fue de mucha utilidad para mí

Anónimo dijo...

fue de mucha ayuda tu explicacion

Anónimo dijo...

mil gracias fue de gran ayuda

Anónimo dijo...

PERFECTO SEÑOR!!! MUY BUEN APORTE PARA LOS QUE SOMOS CURIOSOS!!

Don Braulio dijo...

Buenísimo el aporte.
Tal vez ya lo sepas, pero vale aclarar que a mayor frecuencia de muestreo no siempre tiene por que mejorar la calidad del sonido.
El sonido audible por el humano va de 20Hz a 20KHz aprox, en el mejor de los casos. La frencuencia más alta es entonces 20 KHz; según el criterio de Nyquist (teo. del muestreo), con una frecuencia de muestreo del doble (40 KHz aprox), la señal de sonido se puede reconstruir de forma perfecta (salvo por el redondeo de punto flotante de la computadora), sin pérdida de información. Muestrear un sonido a una frecuencia mucho mayor, no tiene sentido, no le agrega calidad al sonido, sino que sólamente estaría grabando también ondas de más de 20KHz que ningún humano podrá oír, y entonces estaríamos malgastando bits y tiempo de procesamiento.
Saludos!

Anónimo dijo...

Me re sirvió! gracias!!

Anónimo dijo...

Muchísimas Gracias!!!!!

Anónimo dijo...

Interesante, convirtiendo vectores en sonido...