Sei sulla pagina 1di 29

ESCUELA POLITCNICA NACIONAL

FACULTAD DE INGENIERA ELCTRICA Y ELECTRNICA


CARRERA DE INGENIERA ELECTRNICA Y
TELECOMUNICACIONES
SANTIAGO P. GUALLICHICO A.
JEISON S. CASTRO G.

ING. ROBIN ALVAREZ

PROCESAMIENTO DIGITAL DE SEALES


QUITO
2016-B

ESCUELA POLITCNICA NACIONAL


PROCESAMIENTO DIGITAL DE SEALES
TEMA: Uso de la DFT
1.- Planteamiento del problema
Mediante la funcin DFT implementada en Matlab, realizar el anlisis de frecuencia de
la base de datos de audios entregada en clase con el objetivo de ver sus componentes
en frecuencia.
2. Solucin:

Transformada de Fourier discreta


En matemticas, la transformada discreta de Fourier o DFT (del ingls, discrete Fourier transform) es un
tipo de transformada discreta utilizada en el anlisis de Fourier. Transforma una funcin matemtica en otra,
obteniendo una representacin en el dominio de la frecuencia, siendo la funcin original una funcin en
el dominio del tiempo. Pero la DFT requiere que la funcin de entrada sea una secuencia discreta y de
duracin finita. Dichas secuencias se suelen generar a partir del muestreo de una funcin continua, como
puede ser la voz humana Utilizar la DFT implica que el segmento que se analiza es un nico perodo de una
seal peridica que se extiende de forma infinita; si esto no se cumple, se debe utilizar una ventana para
reducir los espurios del espectro. Por la misma razn, la DFT inversa (IDFT) no puede reproducir el dominio
del tiempo completo, a no ser que la entrada sea peridica indefinidamente. Por estas razones, se dice que
la DFT es una transformada de Fourier para anlisis de seales de tiempo discreto y dominio finito. Las
funciones sinusoidales base que surgen de la descomposicin tienen las mismas propiedades.
Transformada de Fourier discreta
Primero se obtiene una seal peridica discreta x(n) de perodo To
muestreada a una Fs = 1/Ts.
Se obtienen N muestras: To = N .Ts

Ya que es una funcin simtrica respecto al origen, solamente calculamos


los coeficientes desde 0 hasta fs:

3. Simulacin en Matlab
Para poder desarrollar y obtener los factores Ck se utiliz la funcin dada en clase
llamada fds
CDIGO DE LA FUNSIN fds

function [Xk] = dfs(xn, N)


% Calcula los coeficientes de la DFS.
% [Xk] = dfs(xn, N):
% xn es un vector que contiene un perodo de la seal peridica en k
%
elemento de [0, N-1]
% N es el perodo fundamental de xn
% Xk es un vector de coeficientes DFS evaluados en k dentro de [0, N-1]
%
n= [0:1:N-1];
% vector fila para n
k= [0:1:N-1];
% vector fila para k
WN= exp(-j*2*pi/N); % notacin de la exponencial compleja.
nk= n'*k;
% creacin de una matriz NxN de nk valores
WNnk = WN .^nk ;
% matriz DFS
Xk = xn * WNnk;
% Vector fila con los Coeficientes DFS

a) Audio Ballena
clc, clear all, close all
[y,Fs]=audioread('ballena.mp3'); % Se realiza la lectura de el archivo de audio
y1=y(:,1); % Se selecciona una sola banda del audio para realizar el analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(5*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO BALLENA ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA BALLENA ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end

if h==5 % Condicional para controlar la graficacion de fragmentos de cancion


l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA BALLENA Modulo VS Frecuencia');

SIMULACIONES

Figura 1a. Seal de ballena 5to fragmento de cancin, con intervalo de 0.1*Fs

Figura 1b. Seal de ballena 25avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 1c. Seal de ballena 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 1d. Seal de ballena 65avo fragmento de cancin, con intervalo de 0.1*Fs

b) Audio Delfn

clc, clear all, close all


[y,Fs]=audioread('delfin.mp3'); % Se realiza la lectura de el archivo de audio
y1=y(:,1); % Se selecciona una sola banda del audio para realizar el analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(10*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO DELFIN ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');

ylabel (' Mdulo de Xk')


title('ANALISIS DE FRECUENCIA DELFIN ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end
if h==10 % Condicional para controlar la graficacion de fragmentos de cancion
l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA DELFIN Modulo VS Frecuencia');
SIMULACIONES

Figura 2a. Seal de delfn 10mo fragmento de cancin, con intervalo de 0.1*Fs

Figura 2b. Seal de delfn 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 2c. Seal de delfn 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 2d. Seal de delfn 60avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 2e. Seal de delfn frecuencias max vs amplitudes max

c) Audio Elefante
clc, clear all, close all
[y,Fs]=audioread('elefante.mp3'); % Se realiza la lectura de el archivo de audio
y1=y(:,1); % Se selecciona una sola banda del audio para realizar el analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(10*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO ELEFANTE ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA ELEFANTE ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end
if h==10 % Condicional para controlar la graficacion de fragmentos de cancion
l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA ELEFANTE Modulo VS Frecuencia');

SIMULACIONES

Figura 3a. Seal de elefante 10mo fragmento de cancin, con intervalo de 0.1*Fs

Figura 3b. Seal de elefante 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 3c. Seal de elefante 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 3d. Seal de elefante 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 3e. Seal de elefante 60avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 3f. Seal de elefante frecuencias max vs amplitudes max

d) Audio Lobo
clc, clear all, close all
[y,Fs]=audioread('lobo.wav'); % Se realiza la lectura de el archivo de audio
y1=y([8*Fs:15*Fs],1); % Se selecciona una sola banda del audio para realizar el
analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(10*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO LOBO ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA LOBO ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end
if h==10 % Condicional para controlar la graficacion de fragmentos de cancion
l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')

title('ANALISIS DE FRECUENCIA LOBO Modulo VS Frecuencia');


SIMULACIONES

Figura 4a. Seal de lobo 10mo fragmento de cancin, con intervalo de 0.1*Fs

Figura 4b. Seal de lobo 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 4c. Seal de lobo 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 4d. Seal de lobo 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 4e. Seal de lobo 60avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 4f. Seal de lobo frecuencias max vs amplitudes max

e) Audio Ovni
clc, clear all, close all
[y,Fs]=audioread('ovni.wav'); % Se realiza la lectura de el archivo de audio
y1=y(:,1); % Se selecciona una sola banda del audio para realizar el analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(10*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO OVNI ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA OVNI ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end
if h==10 % Condicional para controlar la graficacion de fragmentos de cancion
l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA OVNI Modulo VS Frecuencia');

SIMULACIONES

Figura 5a. Seal de ovni 10mo fragmento de cancin, con intervalo de 0.1*Fs

Figura 5b. Seal de ovni 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 5c. Seal de ovni 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 5d. Seal de ovni 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 5e. Seal de ovni 60avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 5f. Seal de ovni frecuencias max vs amplitudes max

e) Audio Arjona
clc, clear all, close all
[y,Fs]=audioread('ArjonaOriginal.mp3'); % Se realiza la lectura de el archivo de
y1=y(:,1); % Se selecciona una sola banda del audio para realizar el analisis
aux=1; % Creo una variable auxiliar que funcionara como contador
N=fix(0.1*Fs); % Obtengo el numero de puntos a evaluar
aux2=N; % aux 2 otra variable auxiliar que funcionara como separador de
fragentos de cancion
h=1; % Variable auxiliar para controlar el aumento de variable "l"
l=1; % Variable auxiliar utilizada para graficar solo ciertos fragmentos
for i=1:65 % Lazo for para realizar el analisis de 65 partes de la cancion
y_25=y1(aux:N); % Extraigo cierto intervalo de la cancion
xk=dfs(y_25',aux2); % Llamo a la funcion dfs
espectro_amplitud=abs(xk); % Obtengo los modulos de xk obteniendo el espectro
f=linspace(0,Fs,aux2); % Creo vector de frecuencias
if i==(10*l) %Condicional para solo graficar ciertos intervalos de tiempo
figure
subplot(2,1,1) % Parametros para graficar el resultado en funcion del tiempo
plot(y_25')
grid on;
xlabel ('Tiempo (s)');
ylabel(' Amplitud');
title('ANALISIS DE TIEMPO ARJONA ');
subplot(2,1,2) % Parametros para graficar el resultado en funcion del tiempo
plot(f,espectro_amplitud)
axis([0 length(f)/2 -10 max(espectro_amplitud)+10]); % Creo ejes de graficacin
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA ARJONA ');
end
r=max(espectro_amplitud); % Obtengo el valor maximo modulo en un fragmento de
cancion
if r~=0
n=find(espectro_amplitud==r); % encuentro la posicion donde se halla la max
amplitud del fragmento
frecuencias(i)=f(n); % Creo un vector con las frecuencias de las amplitudes
maximas
amplitudes(i)=espectro_amplitud(n);% Creo un vector con las amplitudes maximas
de cada fragmento
end
if h==10 % Condicional para controlar la graficacion de fragmentos de cancion
l=l+1; % Incremento de variable auxiliar para controlar graficacion
h=0;
end
h=h+1; % Incremento de variable auxiliar
aux=N+1; % Obtengo limite inferior del siguiente fragmento a evaluar
N=N+aux2; % Obtengo limite superior del siguiente fragmento a evaluar
end
% Realizo grfica final de mplitudes maximas vs frecuencia
figure
stem(frecuencias,amplitudes);
grid on;
xlabel(' Frecuencia Hz');
ylabel (' Mdulo de Xk')
title('ANALISIS DE FRECUENCIA ARJONA Modulo VS Frecuencia');

SIMULACIONES

Figura 6a. Seal de Arjona 10mo fragmento de cancin, con intervalo de 0.1*Fs

Figura 6b. Seal de Arjona 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 6c. Seal de Arjona 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 6d. Seal de Arjona 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 6e. Seal de Arjona 60avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 6f. Seal de Arjona frecuencias max vs amplitudes max

f) Audio Grabacion
SIMULACIONES

Figura 7b.Seal de Grabacion 20avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 7c.Seal de Grabacion 40avo fragmento de cancin, con intervalo de 0.1*Fs

Figura 7d.Seal de Grabacion 50avo fragmento de cancin, con intervalo de 0.1*Fs

Figura7e. Seal de Grabacion 60avo fragmento de cancin, con intervalo de 0.1*Fs

Conclusiones

Se logr implementar un cdigo propio para poder realizar las operaciones


respecto a la transformada discreta de Fourier y el anlisis de canciones.
Es muy importante conocer tcnicas de anlisis, debido a que, gracias a esta FDS,
podemos obtener datos para ser analizados ya no solo en el dominio del tiempo
sino de la frecuencia.
Se debe tener en cuenta que al poner un nmero muy alto de muestras a trabajar
Matlab llegara a un punto de colapsar, es recomendable trabajar por partes como
se lo hizo en el trabajo.
La tcnica de la TDS se usa muy comnmente para analizar en el dominio de la
frecuencia debido a que, al trabajar en el tiempo, esta puede llegar a no tener la
suficiente informacin de la seal.

Potrebbero piacerti anche