Vous êtes sur la page 1sur 6

ESCUELA POLITÉCNICA NACIONAL

Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

Deber 4
TÍTULO: Transformada rápida de Fourier En esta primera parte del código aplicamos
(FFT) lo aprendido previamente en clases, es una
Problema – El objetivo principal de este simple generación de señal con 4
deber es comprobar la teoría vista en diferentes frecuencias
clases de la transformada rápida de Fourier
(FFT), para lo cual dividiremos este deberes figure
%grafica de la señal
en 3 partes.
subplot(2,1,1)
Parte 1.- plot(tn,yn)
sound(yn,Fs)%emisión de la señal
1) Usar Matlab en una sesión para por el puerto de audio
generar una señal cualquiera.
2) Usar Matlab en otra sesión o Aquí podemos observar la señal, para
computadora aparte receptar la obtener esta visualización se tuvo que
señal y aplicar la FFT para obtener hacer zoom a la imagen generada por el
las frecuencias. plot de matlab
Solución –
N=length(yn);%se toma el número
Parte 1.- de muestras para aplicar la FFT
%algoritmo para la FFT
En la práctica se demostró que basta con
nfft=2;%como se necesita
solo un código para generar y receptar la multiplos de dos comenzamos con
señal, ya que en la primera parte del 2
código se genera la señal y en la segunda while nfft<N
parte del código se recepta nfft=nfft*2;%número de FFT
end
Desarrollo : Yn=fft(yn,nfft);%aplicamos la
FFT
1. Generar la señal:
periodograma=abs(Yn);%sacamos el
Creamos el programa que nos generará la valor absoluto de la FFT
señal f=linspace(0,Fs,nfft);%esta será
nuestra variable en el eje x
clc
close all
clear all En la parte anterior del código aplicamos
duracion=15;%se le puso un los cálculos necesarios para usar el
tiempo mayor ya que el programa comando de “fft” que ofrece Matlab para
que recepta la señal no tenga proceder a graficar la señal en el dominio
problemas en captarla
de la frecuencia
Fmax=400;% nuestra frecuencia
máxima
%graficamos la señal en el
Fs=10*Fmax;%frecuencia a la cual
dominio de la frecuencia
vamos a muestrear
subplot(2,1,2)
Ts=1/Fs;%intervalo de tiempo
plot(f,periodograma);
tn=0:Ts:duracion;%vector de
axis([ 0 Fs/2 0
tiempo
max(periodograma)])%para no
yn=sin(2*pi*400*tn)+sin(2*pi*200
confundirnos solo tomamos la
*tn);%señal
ESCUELA POLITÉCNICA NACIONAL
Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

mitad del eje, para no ver las % parámetros...


senial=getaudiodata(y,
'single');

L=length(senial);%Obtencio
n de tamanio de senial
t=linspace(0,duracion1,L);
%creaciondel vector tiempo

Toda la parte anterior del código nos ayuda


a obtener la señal del puerto de audio,
para posteriormente graficar la señal.
Para este punto es necesario puentear
como ya lo hemos aprendido.

frecuencias repetidas

Si se quiere apreciar mejor la imagen se le


puede aplicar zoom, así con claridad
veremos que la gráfica nos indica las
subplot(2,1,1)
frecuencias en 200 y 400.
plot(t,senial);grid on;
grid minor;%con ese plot
observaremos la forma de la
señal
2. Obtención de la señal axis([0 1 -1 1])
%aplicamos el cálculo para
duracion1=1; la FFT
fs=100*200; nfft=2;
x=0; while nfft<L
figure nfft=nfft*2;
while x==0 end
% AUDIRECORDER: crea Yn=fft(senial,nfft);%aplic
objetos con amos la función FFT que nos
% Parámetros: ... fs, 16 ofrece Matlab
bits, 1canal??? periodograma=abs(Yn);
y=audiorecorder(fs,16,1);% f=linspace(0,fs,nfft);
Creacion del objeto para
obtencion de senial
La parte anterior del código nos sirve para
% Uso del objeto: adquiere sacar la FFT de la señal obtenida por el
senial cada "duración" en puerto de audio para poder graficar en el
segundos: dominio de la frecuencia.
recordblocking(y,duracion1
);%Obtencion de senial subplot(2,1,2)
plot(f,periodograma);
% GETAUDIODATA: recupera axis([ 0 fs/2 0
la senial almacenada: max(periodograma)])
ESCUELA POLITÉCNICA NACIONAL
Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

N=length(yn);%se toma el numero


pause(1) de muestras para aplicar la FFT
end %algoritmo para la FFT
nfft=2;%como se necesita
multiplos de dos comenzamos con
2
while nfft<N
nfft=nfft*2;%numero de FFT
end
Yn=fft(yn,nfft);%aplicamos la
FFT
periodograma=abs(Yn);%sacamos el
valor absoluto de la FFT
f=linspace(0,Fs,nfft);%esta será
nuestra variable en el eje x
%graficamos la señal en el
dominio de la frecuencia
como podemos observar la gráfica se subplot(2,1,2)
acerca mucho a la original y las frecuencias plot(f,periodograma);
están donde, exactamente en el mismo axis([ 0 Fs/2 0
punto. max(periodograma)])%para no
confundirnos solo tomamos la
Matlab mitad del eje, para no ver las
frecuencias repetidas
Aquí se muestran los códigos utilizados en
el deber sin ningún comentario adicional :
duracion1=1;
Parte 1.-
fs=100*200;
clc x=0;
close all figure
clear all while x==0
duracion=25;%se le puso un % AUDIRECORDER: crea
tiempo mayor ya que el programa objetos con
que recepta la señal no tenga % Parámetros: ... fs, 16
problemas en captarla bits, 1canal???
Fmax=400;% nuestra frecuencia y=audiorecorder(fs,16,1);%
maxima Creacion del objeto para
Fs=10*Fmax;%frecuencia a la cual obtencion de senial
vamos a muestrear
Ts=1/Fs;%intervalo de tiempo % Uso del objeto: adquiere
tn=0:Ts:duracion;%vector de senial cada "duración" en
tiempo segundos:
yn=sin(2*pi*400*tn)+sin(2*pi*200 recordblocking(y,duracion1
*tn);%señal );%Obtencion de senial
figure
%grafica de la señal % GETAUDIODATA: recupera
subplot(2,1,1) la senial almacenada:
plot(tn,yn) % parámetros...
sound(0.1*yn,Fs)%emision de la senial=getaudiodata(y,
señal por el puerto de audio 'single');
ESCUELA POLITÉCNICA NACIONAL
Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

L=length(senial);%Obtencio que recepta la señal no tenga


n de tamanio de senial problemas en captarla
t=linspace(0,duracion1,L); Fmax=400;% nuestra frecuencia
%creaciondel vector tiempo maxima
subplot(2,1,1) Fs=10*Fmax;%frecuencia a la cual
plot(t,senial);grid on; vamos a muestrear
grid minor;%con ese plot Ts=1/Fs;%intervalo de tiempo
observaremos la forma de la tn=0:Ts:duracion;%vector de
señal tiempo
axis([0 1 -1 1]) yn=sin(2*pi*400*tn)+sin(2*pi*200
%aplicamos el cálculo para *tn);%+sin(2*pi*300*tn)+sin(2*pi
la FFT *100*tn);%señal
nfft=2; figure
while nfft<L %grafica de la señal
nfft=nfft*2; subplot(2,1,1)
end plot(tn,yn)
Yn=fft(senial,nfft);%aplic sound(0.1*yn,Fs)%emision de la
amos la función FFT que nos señal por el puerto de audio
ofrece Matlab N=length(yn);%se toma el numero
periodograma=abs(Yn); de muestras para aplicar la FFT
f=linspace(0,fs,nfft); %algoritmo para la FFT
subplot(2,1,2) nfft=2;%como se necesita
plot(f,periodograma); multiplos de dos comenzamos con
axis([ 0 fs/2 0 2
max(periodograma)]) while nfft<N
nfft=nfft*2;%numero de FFT
pause(1) end
end Yn=fft(yn,nfft);%aplicamos la
FFT
periodograma=abs(Yn);%sacamos el
valor absoluto de la FFT
f=linspace(0,Fs,nfft);%esta será
nuestra variable en el eje x
Parte 2 - Deber 4 %graficamos la señal en el
dominio de la frecuencia
Objetivo.- Solucionar el problema de
subplot(2,1,2)
enmascaramiento espectral producido por plot(f,periodograma);
el periodograma, ocasionado por la gran axis([ 0 Fs/2 0
amplitud de los lóbulos secundarios de la max(periodograma)])%para no
ventana rectangular. confundirnos solo tomamos la
mitad del eje, para no ver las
Solución.- Se aplica el periodograma frecuencias repetidas
modificado el cual propone enventanar el
proceso con una ventana general.
duracion1=1;
clc
fs=10*400;
close all
x=0;
clear all
figure
duracion=25;%se le puso un
while x==0
tiempo mayor ya que el programa
% AUDIRECORDER: crea
objetos con
ESCUELA POLITÉCNICA NACIONAL
Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

% Parámetros: ... fs, 16 %PERIODOGRAMA SIMPLE vs


bits, 1canal??? MODIFICADO
y=audiorecorder(fs,16,1);% p1_m=abs(fft(yn1_env, nFFT));
Creacion del objeto para p2_m=abs(fft(yn2_env, nFFT));
obtencion de senial subplot(3,1,2),plot(f, P1);
title('PERIODOGRAMA SIMPLE')
% Uso del objeto: adquiere subplot(3,1,3)
senial cada "duración" en hold on
segundos: plot(f, 10*log10(p1_m),'k');
recordblocking(y,duracion1 plot(f, 10*log10(p2_m),'g');
);%Obtencion de senial
title('PERIODOGRAMA MODIFICADO')
% GETAUDIODATA: recupera xlabel('Frecuencia (Hz)');
la senial almacenada: ylabel('Potencia');
% parámetros... legend('Periodograma-Modif-
senial=getaudiodata(y, Hanning','Periodograma-modif.
'single'); BH4t')
axis([ 0 Fs/2 0
L=length(senial);%Obtencio max(10*log10(P1))]);
n de tamanio de senial
t=linspace(0,duracion1,L);
%creaciondel vector tiempo pause(1)
subplot(3,1,1) end
plot(t,senial);grid on;
grid minor;%con ese plot
observaremos la forma de la Parte 3 - Deber 4
señal
axis([0 1 -1 1])
%aplicamos el cálculo para
la FFT clc, close all, clear all
% Declaracion de valores de
nFFT = 2;
período y frecuencia
while nFFT < L A=0.25; %Amplitud de la señal
nFFT = 32*nFFT*2; fmax=400; %frecuencia maxima
end duracion=4;
%PERIDOGRAMA SIMPLE: fs=192000;
P1 = abs(fft(senial,nFFT)); ts=1/fs;
f = linspace(0, Fs, nFFT); tn=0:ts:duracion;
%%%%
nbits=24;
%PERIODOGRAMA MODIFICADO: channels=1;
%%%GENERACION DE LA SEÑAL
%1. GENERACION DE VENTANAS yn=A*(sin(2*pi*tn*200)+sin(2*pi*
ventana1 = tn*400));
blackmanharris(length(senial)); subplot(2,2,1)
ventana2 = plot(tn,yn)
title('Señal generada')
hanning(length(senial));
xlabel('Tiempo')
ylabel('Amplitud')
%2. ENVENTANADO DE LA SEÑAL xlim([0 0.5])
yn1_env = senial.*ventana1'; drawnow
yn2_env = senial.*ventana2'; N=length(yn);
nFFt=nbits;
while nFFt<N
ESCUELA POLITÉCNICA NACIONAL
Dayanna Cevallos, Quishuar Tasna, Andrés Sandoval

nFFt=nFFt*nbits; S=0;
end Periodigrama=0;
f=linspace(0,fs,nFFt); end
%Periodigrama normal fclose(puerto);
Periodigrama=abs(fft(yn,nFFt)); delete(puerto);
subplot(2,2,2)
plot(f,Periodigrama)
title('Periodograma de la señal
modoficada')
xlabel('Frecuencia')
ylabel('Potencia')
axis([0 500 0
max(Periodigrama)])
drawnow
%sound(0.1*yn,fs)
%%%%%
Sing=zeros(fs,1);
i=1;
while(1)
sound(yn,fs)
%%%%
S=0;

delete(instrfind({'port'},{'COM1
'}));
puerto=serial('COM1');
puerto.BaudRate=192000;
fopen(puerto);
while(i<=fs*duracion/45)

Sing=fscanf(puerto,'%d');
S(i)=Sing(1)*5/1024;
i=i+1;
end

ta=linspace(0,duracion,length(S)
);
subplot(2,2,3)
plot(ta,S)
xlim([0 5])
drawnow
%%%periodograma modificado
N=length(S);
nFFt=2;
while nFFt<N
nFFt=nFFt*nbits;
end
f=linspace(0,fs,nFFt);

Periodigrama=abs(fft(S,nFFt));
subplot(2,2,4)
plot(f/45,Periodigrama);
xlabel('Frecuencia')
ylabel('Potencia')
axis([0 (fmax+100) 0
max(Periodigrama)])
drawnow
i=1;

Vous aimerez peut-être aussi