Está en la página 1de 8

MANIPULACION DE SEALES DE AUDIO

Daniel Santiago Mora Ortega 27159207 En este documento se presenta un anlisis de seales de audio. Se estudiar las principales instrucciones y comandos usados en Matlab para la generacin de sonidos. Tambin se usa la transformada de Fourier como herramienta de anlisis. Se genera una seal de sonido a partir del siguiente cdigo:
function [s_norm]=analyze1(t_total, f_muestreo ) %Crear t_total segundos de una seal de sonido muestreada a f_muestreo t=0:1/f_muestreo: t_total; % Generar seal de sonido f1=1000 ; f2=2000 ; f3=3000 ; s= 2* sin(2*pi*f1*t)+ 3 *sin(2*pi*f2*t)/2+ 5* sin(2*pi*f3*t)/2; s_norm=s/max(abs(s)); % normalizar los valores entre 1 y 1. % crear arcivo .WAV y almacenarlo en disco wavwrite(s_norm, f_muestreo,'son1.wav'); %Diagrama de frecuencia mag_ss=abs(ifft(s_norm)); %magnitud del espectro de s nm=length(mag_ss); %numero de muestras delta=f_muestreo/nm; eje_frec= 0:delta:f_muestreo-delta; plot(eje_frec,mag_ss); title('Componentes Frecuenciales en el Dominio Temporal'); xlabel('Frecuencia en Herz'); ylabel('Magnitud de los componentes frecuenciales');

Este cdigo genera un sonido que se almacena en el disco duro y puede ser reproducido posteriormente con la funcin sound de Matlab o con cualquier programa reproductor de sonidos. La funcin toma un tiempo total t_total en segundos que ser la duracin de la onda la cual ser muestreada a una frecuencia de muestreo f_muestreo. Se genera la seal s que es una combinacin lineal de tres ondas sinusoidales de distintas frecuencias y posteriormente se hace una normalizacin del resultado de s. A veces, tenemos que normalizar primero, para prevenir el Clipping. El Clipping ocurre cuando una seal excede los lmites del diseo, causando distorsin por sus altos componentes de frecuencia. En la Figura 1 se puede apreciar que la seal no excede los lmites de una seal sinusoidal, definida en el rango [-1,1]. En este caso la seal es exactamente una rplica de la seal de entrada.

En la Figura 2 se puede apreciar cmo la onda sobrepasa los niveles para los cuales est definida una onda sinusoidal. En este caso la seal sobrepasa los niveles de la seal de entrada ocurriendo el efecto de Clipping. En la Figura 3 se puede ver cmo la seal se corrige, eliminando los componentes altos de frecuencia, razn por la cual los componentes que estn por encima de 1 y por debajo de -1 se pierden.

Figura 1. Onda seno dentro del rango [-1 1]

Figura 2. Onda seno fuera del rango [-1 1]

Figura 3. Onda seno corregida

Matlab supone que cada elemento en el vector de sonido est escalado dentro de un rango entre -1.0 y +1.0. Sin embargo, el audio que nosotros importamos fue probablemente fijado en formato de 16-bits, que tiene una escala de varias miles de veces ms grandes que este. Incluso si el audio fue presentado en el rango correcto, el procesarlo causa a menudo que las muestras se extiendan ms all de su rango original. Por eso, en el cdigo se normaliza, haciendo
s_norm=s/max(abs(s)). Se usa wavwrite(s_norm, f_muestreo,'son1.wav'),

que escribe los datos

almacenados en s_norm a un archivo WAVE llamado son1.wav. El archivo tiene una frecuencia
de muestreo de f_muestreo y se asume que es de 16-bits. En el programa se utiliza ifft para obtener las componentes frecuenciales en el dominio temporal. Veamos qu sucede cuando se cambia ste comando por fft. La Figura 4 muestra el espectro usando la transformada rpida de Fourier, mientras que en la Figura 5 se muestra el espectro usando la transformada inversa de Fourier. Como se puede observar, al utilizar la ifft se tiene una mejor visualizacin del espectro, es una manera de normalizar la magnitud de la respuesta en frecuencia. Lo que sucede es que se est dividiendo los valores que produce la fft entre el nmero de muestras que son 80001 (si la frecuencia de muestreo fuese de 16000 y el

tiempo de 5 seg), dado que por definicin la transformada inversa de Fourier se define como

Y como la transformada de Fourier es:

Entonces si aplicamos la transformada inversa a nuestra seal, lo que cambiar ser la magnitud del espectro, de manera que cada valor de la fft ser dividido entre 80001(nmero de muestras).
2.5 x 10
4

, donde

ser de

Componentes Frecuenciales en el Dominio Temporal 0.35


X: 3000 Y: 2.014e+004

Componentes Frecuenciales en el Dominio Temporal

Magnitud de los componentes frecuenciales

Magnitud de los componentes frecuenciales

0.3

0.25

1.5

0.2

0.15

0.1

0.5

0.05

2000

4000

Figura 4. Espectro con fft

6000 8000 10000 Frecuencia en Herz

12000

14000

16000

2000

4000

Figura 5. Espectro con ifft

6000 8000 10000 Frecuencia en Herz

12000

14000

16000

Al llamar la funcin desde el comand window as:


>> [son1]=analyze1(1.5,10000)

donde 1.5 representa la duracin en segundos del sonido, y 10000 la frecuencia de muestreo del mismo, obtenemos el espectro que se muestra en la Figura 6. En el espectro vemos claramente tres picos que corresponden a los aportes en frecuencia de cada seal de s. Esto quiere decir que nuestra seal s, est compuesta de ondas sinusoidales que tienen frecuencias de 1000, 2000, y 3000 Hz. De los picos se puede decir que son las contribuciones de estas seales, as pues, la que ms contribuye es la de 3000 Hz luego la de 1000 Hz y la que menos contribuye es la de 2000 Hz. En conclusin, las magnitudes de los picos estn relacionadas con las amplitudes de la seal original s. La parte de la derecha del espectro obtenido no es necesaria porque es un reflejo de la parte izquierda. Esto se debe a que nuestra seal s es real y por tanto el espectro generar un grafica que est reflejada de un lado. Escuchar una seal de audio puede realizarse al utilizar las funciones sound y wavplay de Matlab.

El comando wavplay(y,Fs) reproduce la seal de audio almacenada en el vector y sobre un dispositivo de salida de audio basado en PC. Se especifica la frecuencia de muestreo de la seal de audio con el entero Fs en muestras por segundo. Soporta solamente seales de audio de 1 o 2 canales (mono o estreo).
Componentes Frecuenciales en el Dominio Temporal 0.25

Magnitud de los componentes frecuenciales

0.2

0.15

0.1

0.05

1000

2000

3000

4000 5000 6000 Frecuencia en Herz

7000

8000

9000

10000

Figura 6. Espectro de son1.wav

El comando sound(y,Fs) convierte vector en sonido. Especficamente, enva la seal del vector al altavoz en Microsoft Windows y en la mayora de plataformas UNIX. Se asume que los valores de y estn entre -1 y +1. Los valores que estn fuera de este rango son normalizados como se vi anteriormente. La duracin de reproduccin que resulta de ajustar Fs depende de la tarjeta de sonido del PC. La mayora de las tarjetas de sonido soportan frecuencias de muestreo en el intervalo de aproximadamente 5 kHz a 44,1 kHz. Las frecuencias de muestreo fuera de este rango pueden producir resultados inesperados. Es decir, wavplay no puede ser soportado en todas las plataformas. Para evitar esa incompatibilidad existe el comando sound para ser usado en vez de wavplay. Se analiz el sonido para distintos valores de frecuencia de la seal. Cuando las frecuencias son bajas el sonido es grave, y cuando las frecuencias son altas el sonido es agudo. Cuando las frecuencias superan los 20KHz el sonido es muy ruidoso y cuando las frecuencias estn por debajo de los 20Hz el sonido no se escucha. Esto se debe a que el odo solo capta frecuencias superiores a los 20Hz y frecuencias por debajo de los 20KHz aproximadamente. Una vibracin sinusoidal a una frecuencia concreta, produce un sonido puro que nosotros percibimos como un pitido de un determinado tono. As pues, un tono lo produce una sola seal senoidal. Resulta difcil diferenciar los tonos que contiene una seal, eso se lo logra cuando uno est familiarizado con la msica desde un punto de vista profesional. El espectro obtenido es importante ya que nos da informacin acerca de los tonos que componen nuestra seal. Esto se ve reflejado en los picos del espectro, los cuales estn ubicados en sus respectivas frecuencias. El anlisis del espectro del sonido es importante por ejemplo para encontrar tonos o frecuencias que necesitan ser silenciados.

El cdigo siguiente es bsicamente una extensin del primer cdigo en cuanto tiene como adicin la posibilidad de guardar el sonido con un nombre definido por el usuario, adems de que se usan los comandos para graficar el espectro de tensin y fase:
function [s_norm]=sonido1(t_total, f_muestreo ) %Crear t_total segundos de una seal de sonido muestreada a f_muestreo t=0:1/f_muestreo: t_total; % Generar seal de sonido f1=1000 ; f2=2000 ; f3=3000 ; s= 2* sin(2*pi*f1*t)+ 3 *sin(2*pi*f2*t)/2+ 5* sin(2*pi*f3*t)/2; s_norm=s/max(abs(s)); % normalizar los valores entre 1 y 1. mpp=floor(f_muestreo*2*pi /628); %calcular muestras en un periodo h1=figure; plot(t(1:mpp),s(1:mpp));%graficar un periodo % crear arcivo .WAV y almacenarlo en disco in=input('ingrese el nombre del archivo') %Se ingresa el nombre deseado por el usuario wavwrite(s_norm, f_muestreo,in); %Diagrama de frecuencia fs=ifft(s_norm); half_m=0:ceil(length(fs)/2); h2=figure plot(half_m*f_muestreo/length(fs),(abs(fs(half_m+1))),'b'); title('Componentes Frecuenciales en el Dominio Temporal'); xlabel('Frecuencia en Herz'); ylabel('Magnitud de los componentes frecuenciales'); fs1=fft(s); half_m=0:ceil(length(fs1)/2); h3=figure; subplot(2,1,1) plot(half_m*f_muestreo/length(fs1),(abs(fs1(half_m+1))),'b'); ylabel('magnitude'); xlabel('Frequency (Hz)'); title('Frequency magnitude response'); % las siguientes tres lneas permiten ignorar fases que vayan con % muy pequeas magnitudes. tolerance=0.00001; fs2=ceil(abs(fs1)-tolerance); fs3=round(fs2./(fs2+1)); % fs3 es un vector de 0s a 1s subplot(2,1,2) plot(half_m*f_muestreo/length(fs1),angle(fs1(half_m+1)).*fs3(half_m+1),'b '); ylabel('phase angle'); xlabel('Frequency (Hz)'); title('Phase angle plot');

Como se dijo anteriormente los picos del espectro usando la fft estn relacionados con los picos presentes en el diagrama de frecuencias usando la ifft. Cada valor de la fft se divide entre , donde ser el nmero de muestras. Al correr la funcin anterior >> sonido1(1.5,10000)se pueden visualizar las siguientes grficas:
Senal en el Tiempo 6

Componentes Frecuenciales en el Dominio Temporal 0.25

Magnitud de los componentes frecuenciales

0.2

2
Magnitud

0.15

0.1

-2

0.05

-4

-6

0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 Tiempo(s)

0.01

1000

2000

3000 4000 Frecuencia en Herz

5000

6000

Frequency magnitude response 4000

magnitude

3000 2000 1000 0

1000

2000

3000 Frequency (Hz) Phase angle plot

4000

5000

6000

phase angle

-2

-4

1000

2000

3000 Frequency (Hz)

4000

5000

6000

En este caso el nmero de muestras es de 15001 por tanto, para el pico de 3034 en la magnitud de la respuesta en frecuencia, el pico en el diagrama temporal ser de:

As mismo ser para todos los picos del espectro.

El siguiente programa permite cargar una seal de audio a partir de un archivo .wav, visualizar el diagrama de frecuencia y escuchar el sonido grabado.
function [s]=analyze2(archivo_son) %archivo_son = cadena de caracteres que contiene el nombre del archivo .wav %Obtener datos del archivo de sonido [s,fs,bits] = wavread(archivo_son) %Diagrama de frecuencia mag_ss=abs(ifft(s)); %magnitud del espectro de s nm=length(mag_ss) ; %numero de muestras delta=fs/nm; eje_frec= 0:delta:fs-delta; h1=figure; plot(eje_frec,mag_ss); title('Componentes Frecuenciales en el Dominio Temporal'); xlabel('Frecuencia en Herz'); ylabel('Magnitud de los componentes frecuenciales'); %Reproducir sonido wavplay(s,fs);

En este cdigo se utiliza el comando wavread(filename) que me permite cargar un archivo WAVE especificado por filename como una cadena de caracteres en comillas simples. El archivo de sonido tiene que ser de extensin .wav, de lo contrario no funcionar. Se dibuja el diagrama en frecuencia y finalmente se reproduce el sonido. Se procedi a analizar el cdigo con el archivo de sonido son1.wav y se lo compar con el obtenido con el comando sound(son1,10000) y se puede decir que no hay diferencias relacionadas al sonido y al espectro que producen ambos. Lo nico que se podra decir es que este cdigo me permite tener en un solo paso el espectro y escuchar el sonido. A continuacin vamos a analizar el espectro de distintos archivos .wav. Se utiliz un archivo .wav denominado Si.wav. Al llamar la funcin desde la ventana de comandos se obtiene el siguiente resultado:
Componentes Frecuenciales en el Dominio Temporal

Magnitud de los componentes frecuenciales

0.05

0.04

0.03

0.02

X: 494.7 Y: 0.01421

0.01

0 2000 4000 6000 8000 10000 Frecuencia en Herz 12000 14000

Figura 7. Espectro de Si.wav

Para otro archivo denominado Sol.wav se obtiene el siguiente espectro:


Componentes Frecuenciales en el Dominio Temporal

Magnitud de los componentes frecuenciales

0.05

X: 389.3 Y: 0.05205

0.04

0.03

0.02

0.01

500

1000

1500

2000 2500 3000 Frecuencia en Herz

3500

4000

4500

5000

Figura 8. Espectro de Sol.wav

Los espectros anteriores corresponden a las notas musicales Si y Sol respectivamente. De las grficas se puede observar que son espectros armnicos puesto que se tratan de notas musicales que tienen armnicos, es decir, la nota Si es la misma en el primer armnico, en el segundo armnico, en el tercer armnico, y as sucesivamente. En el espectro los picos corresponden a los armnicos de su respectiva nota. Por ejemplo, en teora las notas Si y Sol tienen las siguientes frecuencias
Si Sol 30,87 61,74 49,00 123,47 98,00 246,94 196,00 493,88 392,00 987,77 783,99 1975,53 1567,98 3951,07 3135,96

De la figura 7 se pueden reconocer dos picos en frecuencias de 247 y 494,7. Estos valores se pueden ver en la tabla anterior y que efectivamente corresponden a las frecuencias de la nota Si. De la misma forma para la nota Sol se observan picos en 195 y en 389, los cuales tambin se encuentran en la tabla anterior. As pues, se puede concluir que se podra tener una aplicacin en la que se haga uso de la transformada de Fourier para obtener un afinador de Guitarra. Este trabajo fue muy interesante, ya que permiti aclarar varios conceptos, ampliar los conocimientos de Matlab, relacionar la msica con conceptos matemticos, reconocer las aplicaciones que se pueden conseguir al manipular seales de audio, en fin. Queda bien claro las ventajas de visualizar una seal en frecuencia, y las caractersticas de la seal que se pasan por alto al visualizar estas solamente en el dominio del tiempo.

También podría gustarte