Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Procesamiento digital de seales En este trabajo se desarrolla un algoritmo que realiza la transformada corta de ourier !S" "# en MatLab
$%&'
$%&'
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.
'
$%&'
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
$%&'
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');
$%&'
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
$%&'
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]')
$%&'
%% 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
$%&'
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')
$%&'
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
&%
$%&'
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'));
&&
$%&'
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')
&$