Está en la página 1de 12

TP Implementacin Algoritmo STFT

Procesamiento digital de seales En este trabajo se desarrolla un algoritmo que realiza la transformada corta de ourier !S" "# en MatLab

Integrantes: Roldn, Leandro Saavedra, Adrian Maur Perotti, Ezequiel

(m)lementaci*n de algoritmo S" "

$%&'

Consignas del trabajo:


+tilizando las funciones de ventanas , clculo de la transformada r)ida de ourier !fft# im)lementar en Matlab el algoritmo de la transformada corta de ourier !S" "#&- .enerar una seal c/ir) lineal de 0&1$ )untos$- 2adas ' ventanas3 Rectangular, 4artlett , 5anning, evaluar el efecto sobre la S" "3 del largo de las ventanas &$0, 6&$, $%70 muestras con 6%8 de sola)amiento del )orcentaje de sola)amiento entre ventanas de %, '% , 968- Solamente con la ventana 5anning'- 2ada una seal no estacionaria :seal-;av< analizar su re)resentaci*n tiem)o=frecuencia , elegir la combinaci*n de anc/o, sola)amiento de ventana !5anning# , n>mero de )untos de clculo de fft que utilizar?a en funci*n de la seal a analizar- Puede utilizar la funci*n s)ectrogram de Matlab- Se )uede utilizar alguna de las seales que se )ro)onen !encontrarlas en 2ro)bo@# o utilizar una )ro)ia-

Figura1: Seal propuesta por la ctedra. Relato radial de un partido futbolstico

(m)lementaci*n de algoritmo S" "

$%&'

Resultados:
Se )uede a)reciar en las iguras $, ' , 7 que el aumento del anc/o de la ventana tem)oral genera una mejor resoluci*n en el dominio de las frecuencias- La >ltima imagen de cada igura corres)onde a la a)licaci*n de un anc/o de $%70 muestras- Aabe mencionar que, en caso de utilizar una seal con muc/as variaciones tem)orales, la resoluci*n en el dominio de frecuencias no se ver?a afectada- 2e /ec/o, )odr?an )erderse dic/as variaciones tem)orales- En tal caso, se )odr?a utilizar otro mBtodo de )rocesamiento digital de seales3 la "ransformada Cavelet-

!a#

!b# !b#

!c# !c#

Figura2: Procesamiento con una entana rectangular de !a" 12# muestras$ !b" %12 muestras$ !c" 2&'# muestras. %&( de solapamiento.

!a#

!b#

!c#

Figura ): Procesamiento con una entana de *anning de !a" 12# muestras$ !b" %12 muestras$ !c" 2&'# muestras. %&( de solapamiento.

!a#

!b#

!c#

Figura ': Procesamiento con una entana de +arlett de !a" 12# muestras$ !b" %12 muestras $!c" 2&'# muestras. %&( de solapamiento.

'

(m)lementaci*n de algoritmo S" "

$%&'

En la igura 6 se muestra la consecuencia de a)licar diferentes )orcentajes de sola)amiento entre ventanas contiguas- La ventana utilizada )ara )rocesar fue la ventana 5ann- El anlisis de los grficos )resenta una dificultad ma,or- Sola)ar las ventanas contiguas su)one una menor )Brdida de informaci*n )or la a)licaci*n de dic/as ventanas- +no de los )rinci)ales objetivos de a)licar esta tBcnica es )oder calcular correctamente la )otencia de una seal evitando )Brdidas en los e@tremos de cada ventana-

!a#

!b#

!c#

Figura %: Procesamiento con una entana de *anning de 12# muestras$ !a" sin solapamiento$ !b" )&( de solapamiento , !c" -&( de solapamiento.

La igura D com)ara los dos anlisis de la seal )ro)uesta )or la ctedra- Primero se )resentan las entregadas )or las funciones escritas )or el equi)o ,, al final, el grfico de la funci*n :s)ectrogram<- Luego de analizar varias configuraciones se o)t* )or la siguiente3 ventanas de 7%1D muestras , 6%8 de sola)amiento- El motivo de la elecci*n fue, en )rinci)io, la duraci*n de las mismas- En este caso, 7%1D muestras re)resentaban una fracci*n ms )equea de la seal total- El sola)amiento )ermit?a darle continuidad a la resoluci*n en frecuencia- Si bien la seal )odr?a considerarse de :banda anc/a<, en realidad sus com)onentes de frecuencia ms im)ortantes no ocu)an el total del anc/o de banda audible- Asimismo, )resenta ruido de alta frecuencia debido a ser una transmisi*n antigua- Eo se )uede notar una clara diferencia entre los grficos de las ' ventanas utilizadas en el c*digo )ro)io, )ero s? se ve claramente una diferencia entre esas ' , la del s)ectrogram-

Figura .: /omparaci0n de funci0n spectrogram , algoritmo para entanas *ann$ rectangular , +artlett con una seal de prueba

(m)lementaci*n de algoritmo S" "

$%&'

Codigo MATLAB:
%% 0. clear clc clf %% 1. Seal fs=10000; t=[1:8192]/fs; %8192 puntos espaciados en 0.0001 seg y = chirp(t,3,8192/fs,5000);

%% 2. Prueba con Ventana rectangular de 128 muestras L=128; % framelenght r_1 = rectwin (L)'; k= (8192-L)/(L/2); %cantidad de desplazamientos( frame) de la ventana para 50% % Lo calculo como la cantidad maxima de frames completos contra la sel,es % decir la muestra 128 desplazada hasta que alcanza la posicion 8192. 128+(126*64) %126=K ,64=128/2 R=L/2; for i=1:k i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*r_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C');%transpongo la matriz C porque fft de matriz calcula por columnas % La matriz C contiene la fft de cada frame. Cada fila corresponde a un % frame distinto %% 2.1 Ploteo f=(fs/2)*linspace(0,1,L/2); % Vector frecuencia C = abs(C(1:(length(C)/2),:)); % Tomo la mitad del fft porque solo considero parte real del espectro C=2*C/L; %multiplico por 2, por euler (espectro doble a simple) y divido por L (fft siempre esta escalada por la cantidad de muestras) figure(1) imagesc(t,f,C) set(gca,'YDir','normal');

(m)lementaci*n de algoritmo S" "

$%&'

title('Ventana rectangular 128 muestras') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]') %% 3. Ventana Bartlett de 128 muestras L=128; % framelenght b_1 = bartlett (L)'; k= (8192-L)/(L/2) ; R=L/2; for i=1:k i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*b_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C'); %% 3.1 Ploteos f=(fs/2)*linspace(0,1,L/2); C = abs(C(1:(length(C)/2),:)); C=2*C/L; figure(2) imagesc(t,f,C) set(gca,'YDir','normal'); title('Ventana bartlett 128 muestras') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]') %% 4. Ventana Hanning de 128 muestras L=128; % framelenght h_1 = hanning (L)'; k= (8192-L)/(L/2) ; R=L/2; for i=1:k i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*h_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1

(m)lementaci*n de algoritmo S" "

$%&'

C=Yi; else C = vertcat(C,Yi); end end C=fft(C'); %% 4.1 Ploteos

% concateno el ltimo vector generado con la matriz C

f=(fs/2)*linspace(0,1,L/2); C = abs(C(1:(length(C)/2),:)); C=2*C/L; figure(3) imagesc(t,f,C) set(gca,'YDir','normal'); title('Ventana hanning 128 muestras') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]') %% 5. Ventana Hanning sin solapamiento L=128; % framelenght h_1 = hanning (L)'; k= (8192-L)/(L) ; R=127; for i=1:k i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*h_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C'); %% 5.1 Ploteos f=(fs/2)*linspace(0,1,L/2); C = abs(C(1:(length(C)/2),:)); C=2*C/L; figure(4) imagesc(t,f,C) set(gca,'YDir','normal'); title('Ventana hanning 128 muestras sin solapamiento') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]')

(m)lementaci*n de algoritmo S" "

$%&'

%% 6. Ventana Hanning, solapamiento 30% L=128; % framelenght h_1 = hanning (L)'; e=128; k=0; R=89; while (e<8192) e=e+R; k=k+1; end k=k-1; % porque se pasa 1 antes de detenerse for i=1:k i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*h_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C'); %% 6.1 Ploteos f=(fs/2)*linspace(0,1,L/2); C = abs(C(1:(length(C)/2),:)); C=2*C/L; figure(5) imagesc(t,f,C) set(gca,'YDir','normal'); title('Ventana hanning 128 muestras con solapamiento de 30%') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]') %% 7. Ventana Hanning, solapamiento 70% L=128; % framelenght h_1 = hanning (L)'; e=128; k=0; R=31; while (e<8192) e=e+R; k=k+1; end k=k-1; for i=1:k

(m)lementaci*n de algoritmo S" "

$%&'

i_i= 1+(i-1)*(R) ;%indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*h_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C'); %% 7.1 Ploteos f=(fs/2)*linspace(0,1,L/2); size=size(C); j=size(1); % en los anteriores use length pero deberia corregirlo porque %cuando le pones una matriz toma la longitud mas grande entre %filas y/o columnas, en este caso no me funcionaba C = abs(C(1:j/2,:)); C=2*C/L; figure(6) imagesc(t,f,C) set(gca,'YDir','normal'); title('Ventana hanning 128 muestras con solapamiento de 70%') xlabel(' Tiempo [s]') ylabel(' Frecuencia [Hz]')

%% Funcin propia de MatLab figure(7) spectrogram(y,128,64,128,fs) title('Espectrograma utilizando funcin de librera') %% Adquisicin Seal de prueba clear fs=10000; [y, Fs, nbits] = wavread('Seal Audio por Radio - Frecuencia muestreo 8 kHz - 16 bits'); t=[1:length(y)]/Fs; figure(8) plot(t,y) title('Seal') xlabel('Tiempo [s]') ylabel('Amplitud normalizada')

%% Ventana rectangular y=y'; L=4096; % framelenght r_1 = rectwin (L)';

(m)lementaci*n de algoritmo S" "

$%&'

k= round((length(y)-L)/(L/2)); R=L/2; for i=1:k i_i= 1+(i-1)*(R); %indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*r_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=fft(C'); size=size(C); j=size(2); f=(fs/2)*linspace(0,1,L/2); % Vector frecuencia C = abs(C(1:(j/2),:)); % Tomo la mitad del fft porque solo considero parte real del espectro C=2*C/L; figure(9) subplot(4,1,1) imagesc(f,t,C') set(gca,'YDir','normal'); title('STFT con cdigo propio ventana rectangular') ylabel(' Tiempo [s]') xlabel(' Frecuencia [Hz]') %% clear fs=10000; [y, Fs, nbits] = wavread('Seal Audio por Radio - Frecuencia muestreo 8 kHz - 16 bits'); t=[1:length(y)]/Fs; y=y'; L=4096; % framelenght r_1 = bartlett (L)'; k= round((length(y)-L)/(L/2)); R=L/2; for i=1:k i_i= 1+(i-1)*(R); %indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*r_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional

&%

(m)lementaci*n de algoritmo S" "

$%&'

if i==1 C=Yi; else C = vertcat(C,Yi); end end C=abs(fft(C')); size=size(C); j=size(2);

% concateno el ltimo vector generado con la matriz C

f=(fs/2)*linspace(0,1,L/2); % Vector frecuencia C = abs(C(1:(j/2),:)); % Tomo la mitad del fft porque solo considero parte real del espectro C=2*C/L;

subplot(4,1,2) imagesc(f,t,C') set(gca,'YDir','normal'); title('STFT con cdigo propio ventana Bartlett') ylabel(' Tiempo [s]') xlabel(' Frecuencia [Hz]')

%% Hann clear fs=10000; [y, Fs, nbits] = wavread('Seal Audio por Radio - Frecuencia muestreo 8 kHz - 16 bits'); t=[1:length(y)]/Fs; y=y'; L=4096; % framelenght r_1 = hanning (L)'; k= round((length(y)-L)/(L/2)); R=L/2; for i=1:k i_i= 1+(i-1)*(R); %indice inicial i_f=i_i+L-1; %indice final Yi=y(i_i:i_f).*r_1; %producto seal ventana en i-sima posicin % C(i,:)= fft(Yi); Esta forma de escribir evitaria el condicional if i==1 C=Yi; else C = vertcat(C,Yi); % concateno el ltimo vector generado con la matriz C end end C=abs(fft(C'));

&&

(m)lementaci*n de algoritmo S" "

$%&'

size=size(C); j=size(2); f=(fs/2)*linspace(0,1,L/2); % Vector frecuencia C = abs(C(1:(j/2),:)); % Tomo la mitad del fft porque solo considero parte real del espectro C=2*C/L; max(max(C)) subplot(4,1,3) imagesc(f,t,C') set(gca,'YDir','normal'); title('STFT con cdigo propio ventana Hann') ylabel(' Tiempo [s]') xlabel(' Frecuencia [Hz]') %% Espectrograma clear fs=10000; [y, Fs, nbits] = wavread('Seal Audio por Radio - Frecuencia muestreo 8 kHz - 16 bits'); t=[1:length(y)]/Fs; subplot(4,1,4) spectrogram(y,128,64,128,fs) title('Espectrograma utilizando funcin de librera')

&$

También podría gustarte