En esta prctica vamos a utilizar los pipes de Unix para transmitir datos entre las aplicaciones ”arecord” y ”aplay”, realizando un procesamiento de la seal de audio transferida.
Las seales de audio, como el resto de seales unidimensionales y dependientes del tiempo, pueden representarse tanto en el dominio del tiempo como en el dominio de la frecuencia. En el primero, una muestra de audio indica, para el instante de tiempo que referencia la muestra, la amplitud del sonido. En el segundo, un coeficiente especifica, para todo el tiempo que comprende la ventana de anlisis, la amplitud de la sinusoide de frecuencia igual al ndice del coeficiente, que dicho sonido.
En el caso de las seales de audio, el dominio del tiempo y el dominio de la frecuencia son equivalentes y por tanto, una determinada operacin que se realiza en uno de los dominios siempre tiene una equivalente en el otro.
Un ejemplo de esto lo encontramos en el filtrado de seales. Cuando filtramos, en el dominio de la frecuencia lo que realizamos (atenuando unas determinadas frecuencias con respecto a otras) es multiplicar el espectro de la seal de audio (la que queremos filtrar) con el espectro de la funcin de transferencia de filtro (la funcin que resulta de hacer pasar a travs del filtro la funcin impulso unitario). Como sabemos, por el teorema de convolucin, multiplicar los espectros de dos seales es equivalente a convolucionar las transformadas inversas de dichos espectros en el dominio del tiempo, es decir, para filtrar una seal en el dominio del tiempo podemos convolucionar dicha seal con la respuesta del filtro a la funcin impulso unitario.
Por definicin, modular una seal es desplazar su espectro en el dominio de la frecuencia. Para conseguir dicho desplazamiento en ω0 Hz, desde el punto de vista de la teora de seales, podemos convolucionar el espectro (por tanto, en el dominio de la frecuencia) con la funcin impulso unitario de frecuencia ω0 Hz. Sea dicha funcin δ(ω0).
Aplicando de nuevo el teorema de convolucin, dicha convolucin sera equivalente a multiplicar la seal por la transformada inversa de la funcin impulso unitario δ(ω0). Por definicin, la funcin cuyo espectro es una funcin impulso es una funcin exponencial compleja. Como esta funcin no existe realmente podemos “simularla” utilizando una sinusoide que, aunque presenta dos impulsos, es perfectamente vlida al no poderse representar fsicamente las frecuencias negativas.
Por tanto, para desplazar el espectro de una seal de audio debemos multiplicar cada una de las muestras por una funcin sinusoidal de una determinada frecuencia. La cantidad de desplazamiento que sufra el espectro va a depender de la frecuencia de la funcin sinusoidal, que por cierto, se suele llamar en el contexto de la modulacin de seales seal moduladora y seal portadora en el contexto de la transmisin de seales.
Un modulador de seales es un sistema al que entra una seal (la seal a modular, la seal de datos original) y del que sale otra seal (la seal modulada, la nueva seal de datos). Adems, normalmente se le especifica la frecuencia de la seal moduladora como un parmetro de entrada (frecuencia de la seal moduladora o portadora).
Como ya se indic al comienzo de este documento, vamos a utilizar los pipes de Unix para leer de la tarjeta de sonido una seal, modularla y a continuacin reproducirla. Este sistema queda construido escribiendo:
Ntese que sin el flag -t raw modularamos tambin la cabecera WAV.
Esta forma de procesar la seales es muy cmoda pero tiene un ligero inconveniente: el retraso que los pipes introducen. Los pipes son colas FIFO de un cierto tamao (4K bytes normalmente). Esto significa que el tiempo que transcurre desde que la seal es capturada hasta que la modulada es reproducida es apreciable y puede suponer un problema en algunos contextos. Adems, a esta latencia hay que sumar la que ya poseen las aplicaciones arecord y aplay.
Para minimizar estos problemas podemos hacer varias cosas:
Por tanto, para minimizar la latencia usando una tarjeta de sonido tpica escribiremos:
Muesto modulador va a ser un programa escrito en C que lea un conjunto de muestras de la entrada estndar, realice la modulacin tal y como se ha indicado anteriormente y finalmente escriba las muestras procesadas a la salida estndar. Para controlar la frecuencia de la seal moduladora podemos usar la aplicacin FreqControl desarrollada para la prctica anterior. Adems, el cdigo de modulator.c es muy similar al de sinusoidal.c porque ambos escriben en la salida estndar una sea que ellos generan. Bien, a continuacin aparece el cdigo de modulator.c:
Y de su Makefile: