Análisis de señales de audio utilizando la transformada de ...
Señales de Audio Matlab
-
Upload
daniel-santiago -
Category
Documents
-
view
2.058 -
download
1
description
Transcript of Señales de Audio Matlab
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