Anda di halaman 1dari 8

MANIPULACION DE SEÑALES DE

AUDIO
Daniel Santiago Mora Ortega
27159207

En este documento se presenta un análisis de señales de audio. Se estudiará las principales


instrucciones y comandos usados en Matlab para la generación de sonidos. También se usa la
transformada de Fourier como herramienta de análisis.

Se genera una señal de sonido a partir del siguiente código:

function [s_norm]=analyze1(t_total, f_muestreo )

%Crear t_total segundos de una señal de sonido muestreada a f_muestreo

t=0:1/f_muestreo: t_total;
% Generar señal 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 código genera un sonido que se almacena en el disco duro y puede ser reproducido
posteriormente con la función sound de Matlab o con cualquier programa reproductor de
sonidos.
La función toma un tiempo total t_total en segundos que será la duración de la onda la cual
será muestreada a una frecuencia de muestreo f_muestreo. Se genera la señal s que es una
combinación lineal de tres ondas sinusoidales de distintas frecuencias y posteriormente se hace
una normalización del resultado de s.
A veces, tenemos que normalizar primero, para prevenir el Clipping. El Clipping ocurre cuando
una señal excede los límites del diseño, causando distorsión por sus altos componentes de
frecuencia.
En la Figura 1 se puede apreciar que la señal no excede los límites de una señal sinusoidal,
definida en el rango [-1,1]. En este caso la señal es exactamente una réplica de la señal de entrada.
En la Figura 2 se puede apreciar cómo la onda sobrepasa los niveles para los cuales está definida
una onda sinusoidal. En este caso la señal sobrepasa los niveles de la señal de entrada ocurriendo
el efecto de Clipping.
En la Figura 3 se puede ver cómo la señal se corrige, eliminando los componentes altos de
frecuencia, razón por la cual los componentes que están 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 más grandes que este. Incluso si
el audio fue presentado en el rango correcto, el procesarlo causa a menudo que las muestras se
extiendan más allá de su rango original. Por eso, en el código 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 rápida 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 visualización 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 número de muestras que son 80001 (si la frecuencia de muestreo fuese de 16000 y el
tiempo de 5 seg), dado que por definición la transformada inversa de Fourier se define como

Y como la transformada de Fourier es:

Entonces si aplicamos la transformada inversa a nuestra señal, lo que cambiará será la magnitud
del espectro, de manera que cada valor de la fft será dividido entre , donde será de
80001(número de muestras).

4
x 10 Componentes Frecuenciales en el Dominio Temporal Componentes Frecuenciales en el Dominio Temporal
2.5 0.35

X: 3000
0.3
Magnitud de los componentes frecuenciales

Magnitud de los componentes frecuenciales


Y: 2.014e+004
2

0.25

1.5
0.2

0.15
1

0.1

0.5
0.05

0 0
0 2000 4000 6000 8000 10000 12000 14000 16000 0 2000 4000 6000 8000 10000 12000 14000 16000
Frecuencia en Herz Frecuencia en Herz
Figura 4. Espectro con fft Figura 5. Espectro con ifft

Al llamar la función desde el comand window así:


>> [son1]=analyze1(1.5,10000)
donde 1.5 representa la duración 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 señal de s. Esto quiere decir que nuestra señal 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 señales, así pues, la que más contribuye es la de 3000 Hz luego la de 1000
Hz y la que menos contribuye es la de 2000 Hz. En conclusión, las magnitudes de los picos están
relacionadas con las amplitudes de la señal 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 señal s es real y por tanto el espectro generará un grafica
que está reflejada de un lado.

Escuchar una señal de audio puede realizarse al utilizar las funciones sound y wavplay de
Matlab.
El comando wavplay(y,Fs) reproduce la señal 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 señal de
audio con el entero Fs en muestras por segundo. Soporta solamente señales de audio de 1 o 2
canales (mono o estéreo).

Componentes Frecuenciales en el Dominio Temporal


0.25
Magnitud de los componentes frecuenciales

0.2

0.15

0.1

0.05

0
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Frecuencia en Herz

Figura 6. Espectro de son1.wav

El comando sound(y,Fs) convierte vector en sonido. Específicamente, envía la señal del vector al
altavoz en Microsoft Windows y en la mayoría de plataformas UNIX. Se asume que los valores de y
están entre -1 y +1. Los valores que estén fuera de este rango son normalizados como se vió
anteriormente. La duración de reproducción que resulta de ajustar Fs depende de la tarjeta
de sonido del PC. La mayoría 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 señal. 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 están por debajo
de los 20Hz el sonido no se escucha. Esto se debe a que el oído solo capta frecuencias superiores a
los 20Hz y frecuencias por debajo de los 20KHz aproximadamente.
Una vibración 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 señal
senoidal. Resulta difícil diferenciar los tonos que contiene una señal, eso se lo logra cuando uno
está familiarizado con la música desde un punto de vista profesional.

El espectro obtenido es importante ya que nos da información acerca de los tonos que
componen nuestra señal. Esto se ve reflejado en los picos del espectro, los cuales están ubicados
en sus respectivas frecuencias. El análisis del espectro del sonido es importante por ejemplo para
encontrar tonos o frecuencias que necesitan ser silenciados.
El código siguiente es básicamente una extensión del primer código en cuanto tiene como
adición la posibilidad de guardar el sonido con un nombre definido por el usuario, además de que
se usan los comandos para graficar el espectro de tensión y fase:

function [s_norm]=sonido1(t_total, f_muestreo )

%Crear t_total segundos de una señal de sonido muestreada a f_muestreo

t=0:1/f_muestreo: t_total;
% Generar señal 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 líneas permiten ignorar fases que vayan con
% muy pequeñas 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 están relacionados con los picos
presentes en el diagrama de frecuencias usando la ifft. Cada valor de la fft se divide entre ,
donde será el número de muestras.
Al correr la función anterior >> sonido1(1.5,10000)se pueden visualizar las siguientes gráficas:
Senal en el Tiempo Componentes Frecuenciales en el Dominio Temporal
6 0.25

Magnitud de los componentes frecuenciales


4
0.2

2
0.15
Magnitud

0.1
-2

0.05
-4

-6 0
0 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.01 0 1000 2000 3000 4000 5000 6000
Tiempo(s) Frecuencia en Herz

Frequency magnitude response


4000

3000
magnitude

2000

1000

0
0 1000 2000 3000 4000 5000 6000
Frequency (Hz)
Phase angle plot
2
phase angle

-2

-4
0 1000 2000 3000 4000 5000 6000
Frequency (Hz)

En este caso el número 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 señal 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 código 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 extensión .wav, de lo contrario no funcionará.
Se dibuja el diagrama en frecuencia y finalmente se reproduce el sonido.

Se procedió a analizar el código 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 podría decir es que este código me
permite tener en un solo paso el espectro y escuchar el sonido.

A continuación vamos a analizar el espectro de distintos archivos .wav. Se utilizó un archivo .wav
denominado Si.wav. Al llamar la función 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

2000 4000 6000 8000 10000 12000 14000


Frecuencia en Herz

Figura 7. Espectro de Si.wav


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

Magnitud de los componentes frecuenciales Componentes Frecuenciales en el Dominio Temporal

0.05 X: 389.3
Y: 0.05205

0.04

0.03

0.02

0.01

0
500 1000 1500 2000 2500 3000 3500 4000 4500 5000
Frecuencia en Herz
Figura 8. Espectro de Sol.wav

Los espectros anteriores corresponden a las notas musicales Si y Sol respectivamente. De las
gráficas se puede observar que son espectros armónicos puesto que se tratan de notas musicales
que tienen armónicos, es decir, la nota Si es la misma en el primer armónico, en el segundo
armónico, en el tercer armónico, y así sucesivamente. En el espectro los picos corresponden a los
armónicos de su respectiva nota. Por ejemplo, en teoría 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 también se
encuentran en la tabla anterior.

Así pues, se puede concluir que se podría tener una aplicación 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 música con conceptos matemáticos, reconocer las
aplicaciones que se pueden conseguir al manipular señales de audio, en fin.
Queda bien claro las ventajas de visualizar una señal en frecuencia, y las características de la
señal que se pasan por alto al visualizar estas solamente en el dominio del tiempo.

Anda mungkin juga menyukai