señales de audio matlab

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 par tir 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.

Upload: daniel-santiago

Post on 11-Jul-2015

2.059 views

Category:

Documents


1 download

DESCRIPTION

Se realiza un análisis de sonido en Matlab, haciendo uso de la transformada de fourier

TRANSCRIPT

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 1/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 unacombinació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.

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 2/8

 

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 lafft

entre el número de muestras que son 80001 (si la frecuencia de muestreo fuese de 16000 y el

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 3/8

 

0 2000 4000 6000 8000 10000 12000 14000 160000

0.5

1

1.5

2

2.5x 10

4

X: 3000

Y: 2.014e+004

Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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 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).

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.

0 2000 4000 6000 8000 10000 12000 14000 160000

0.05

0.1

0.15

0.2

0.25

0.3

0.35Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 4/8

 

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).

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 unoestá 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.

0 1000 2000 3000 4000 5000 6000 7000 8000 9000 100000

0.05

0.1

0.15

0.2

0.25Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 5/8

 

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 deseadopor 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'); 

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 6/8

 

0 1000 2000 3000 4000 5000 60000

0.05

0.1

0.15

0.2

0.25Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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

6Senal en el Tiempo

Tiempo(s)

   M  a  g  n   i   t  u   d

 

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:

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.

0 1000 2000 3000 4000 5000 60000

1000

2000

3000

4000

   m   a   g   n   i   t   u   d   e

Frequency (Hz)

Frequency magnitude response

0 1000 2000 3000 4000 5000 6000-4

-2

0

2

   p   h   a   s   e   a   n   g   l   e

Frequency (Hz)

Phase angle plot

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 7/8

 

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 siguienteresultado:

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.7Y: 0.01421

Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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

5/11/2018 Señales de Audio Matlab - slidepdf.com

http://slidepdf.com/reader/full/senales-de-audio-matlab 8/8

 

 

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

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. 

500 1000 1500 2000 2500 3000 3500 4000 4500 50000

0.01

0.02

0.03

0.04

0.05 X: 389.3

Y: 0.05205

Componentes Frecuenciales en el Dominio Temporal

Frecuencia 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