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
0 2000 4000 6000 8000 10000 12000 14000 16000
0
0. 5
1
1. 5
2
2. 5
x 10
4
X: 3000
Y : 2.014e+004
Component es Frec uenc iales en el Dom inio Temporal
Frec uenc i a en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s
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

, donde ser de
80001(nmero de muestras).













Figura 4. Espectro con fft Figura 5. Espectro con ifft


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.
0 2000 4000 6000 8000 10000 12000 14000 16000
0
0. 05
0. 1
0. 15
0. 2
0. 25
0. 3
0. 35
Component es Frec uencial es en el Dominio Temporal
Frecuenc ia en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s
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).


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.

0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
0
0.05
0.1
0.15
0.2
0.25
Componentes Frec uenc ial es en el Domini o Temporal
Frec uenc ia en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s
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');
0 1000 2000 3000 4000 5000 6000
0
0. 05
0. 1
0. 15
0. 2
0. 25
Component es Frecuenci ales en el Domini o Temporal
Frecuenci a en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s
0 0. 001 0. 002 0. 003 0. 004 0. 005 0. 006 0. 007 0. 008 0. 009 0. 01
-6
-4
-2
0
2
4
6
Senal en el Tiempo
Tiempo(s )
M
a
g
n
i
t
u
d

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:

















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.
0 1000 2000 3000 4000 5000 6000
0
1000
2000
3000
4000
m
a
g
n
i
t
u
d
e
Frequenc y (Hz)
Frequenc y magnit ude res pons e
0 1000 2000 3000 4000 5000 6000
-4
-2
0
2
p
h
a
s
e

a
n
g
l
e
Frequenc y (Hz)
Phas e angle pl ot
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:


Figura 7. Espectro de Si.wav

2000 4000 6000 8000 10000 12000 14000
0
0.01
0.02
0.03
0.04
0.05
X: 494.7
Y : 0.01421
Componentes Frec uenc ial es en el Domini o Temporal
Frec uenc ia en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s

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


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 30,87 61,74 123,47 246,94 493,88 987,77 1975,53 3951,07
Sol

49,00 98,00 196,00 392,00 783,99 1567,98 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.




500 1000 1500 2000 2500 3000 3500 4000 4500 5000
0
0.01
0.02
0.03
0.04
0.05
X: 389.3
Y : 0.05205
Componentes Frec uenc ial es en el Domini o Temporal
Frec uenc ia en Herz
M
a
g
n
i
t
u
d

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

f
r
e
c
u
e
n
c
i
a
l
e
s

También podría gustarte