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' 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 title('Componentes Frecuenciales en el Dominio Temporal'); Temporal'); xlabel('Frecuencia xlabel('Frecuencia en Herz'); Herz'); ylabel('Magnitud ylabel('Magnitud de los componentes frecuenciales'); 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.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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)) . f_muestreo,'son1.wav'), ), que escribe los datos Se usa wavwrite(s_norm, f_muestreo,'son1.wav' 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
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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).
2.5
s e l a i c n e u c e r f
x 10
4
Componentes Frecuenciales en el Dominio Temporal
Componentes Frecuenciales en el Dominio Temporal 0.35
X: 3000 Y: 2.014e+004
s e l a i c n e u c e r f
2
s e 1.5 t n e n o p m o c 1 s o l e d d u t i n 0.5 g a M
0
0.3
0.25
s e t n 0.2 e n o p m o c 0.15 s o l e d d 0.1 u t i n g a M0.05
0
2000
4000
6000 8000 10000 Frecuencia en Herz
Figura 4. Espectro con fft
12000
14000
16000
0
0
2000
4000
6000 8000 10000 Frecuencia en Herz
12000
14000
16000
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 1 0000 la frecuencia de muestreo del mismo, obtenemos el espectro que se muestra e n 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 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.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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
s e l a i c n e u c e r f
0.2
s e 0.15 t n e n o p m o c 0.1 s o l e d d u t i n 0.05 g a M
0
0
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 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 tonos que contiene una señal, eso se lo logra cuando 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
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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 plot(t(1:mpp),s(1:mpp)); %graficar un periodo % crear arcivo .WAV y almacenarlo en disco in=input('ingrese in=input('ingrese el nombre del archivo') 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' 'b'); ); title('Componentes title('Componentes Frecuenciales en el Dominio Temporal'); Temporal'); xlabel('Frecuencia xlabel('Frecuencia en Herz'); Herz'); ylabel('Magnitud ylabel('Magnitud de los componentes frecuenciales'); 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' 'b'); ); ylabel('magnitude' ylabel('magnitude'); ); xlabel('Frequency xlabel('Frequency (Hz)'); (Hz)'); title('Frequency title('Frequency magnitude response'); 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
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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: Componentes Frecuenciales en el Dominio Temporal
Senal en el Tiempo
0.25
6
s e l a i c 0.2 n e u c e r f s e 0.15 t n e n o p m o c s 0.1 o l e d d u t i n 0.05 g a M
4
2 d u t i n 0 g a M
-2
-4
-6 0
0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 Tiempo(s)
0. 01 01
0
0
1000
2000
3000 4000 Frecuencia en Herz
5000
6000
Frequency Frequency magnitude response 4000 3000
e d u t i n 2000 g a m
1000 0
0
1000
2000
3000 Frequency Frequency (Hz) Phase angle plot
4000
5000
6000
0
1000
2000
3000 Frequency Frequency (Hz)
4000
5000
6000
2 e l g n a e s a h p
0
-2
-4
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:
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
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 title('Componentes Frecuenciales en el Dominio Temporal'); Temporal'); xlabel('Frecuencia xlabel('Frecuencia en Herz'); Herz'); ylabel('Magnitud ylabel('Magnitud de los componentes frecuenciales'); 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 ext ensió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 re lacionadas 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
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Para otro archivo denominado Sol.wav se obtiene el siguiente espectro: Componentes Frecuenciales en el Dominio Temporal
s e 0.05 l a i c n e u c e 0.04 r f s e t n e n o 0.03 p m o c s o l e 0.02 d d u t i n g a 0.01 M
0
X: 389.3 Y: 0.05205
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 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 Sol
30,87
61,74
123,47
246,94
493,88
987,77
1975,53
3951,07
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.