% Practica 1 TDS 2004-2005 - UAB % Teorema del muestreo % % 1- Teorema de Nyquist % Sea x(t) una senal de banda limitada % % Un tipo de senales que son casi de banda limitada son las senales de voz % Carguemos un ejemplo [x Fs bits] = wavread('beyonce.wav'); N=size(x,1); wavplay(x, Fs); pause; t=linspace(0,size(x,1)/Fs,N)'; plot(t,x); xlabel('Tiempo (s)'); pause; % El espectro es X=fft(x); f=linspace(0,Fs,N/2)'; plot(f,abs(X(1:N/2))); xlabel('Frecuencia (Hz)'); hold on; pause; % En lineas telefonicas tradicionales se desprecian las % componentes frecuenciales a partir de 4K. % Si eliminamos estas componentes frecuenciales mediante % un filtro PB ideal, el espectro queda asi: % (Por conveniencia filtraremos a 4.4kHz) PB4k=[ones(N/10,1);zeros(N*8/10,1);ones(N/10,1)]; X4k=X.*PB4k; plot(f,abs(X4k(1:N/2)),'r'); pause; % Y la senal se oye asi: x4k=real(ifft(X4k,N)); wavplay(x4k,Fs); pause; % Esta sera la senal sobre la que trabajaremos. % Hemos ampliado el rango de frecuencias de trabajo % mediante zero-padding en frecuencia: xtest=2*real(ifft([X4k(1:N/2);zeros(N,1);X4k(N/2+1:N)],2*N)); Ntest=2*N; Fstest=2*Fs; ttest=linspace(0,size(xtest,1)/Fstest,Ntest)'; Xtest=fft(xtest); ftest=linspace(0,Fstest,Ntest/2)'; hold off; % Sea ahora p(t) una senal periodica: p=zeros(Ntest,1); for i=1:6:Ntest p(i)=6; end stem(ttest(1:50),p(1:50)); xlabel('Tiempo (s)'); pause % Cuyo espectro es un tren de deltas: P=fft(p); plot(ftest,abs(P(1:Ntest/2))); xlabel('Frecuencia (Hz)'); pause; % El producto y(t)=p(t)*x(t) es un "muestreo" de la senal x(t): y=p.*xtest; stem(ttest(1:50),y(1:50)); xlabel('Tiempo (s)'); pause; % Cuyo espectro es, como ya sabemos, una repeticion del espectro % original de x(t): Y=fft(y); plot(ftest,abs(Y(1:Ntest/2))); xlabel('Frecuencia (Hz)'); hold on; plot(ftest,abs(Xtest(1:Ntest/2)),'r'); plot(ftest,abs(P(1:Ntest/2))/max(abs(P))*max(abs(Xtest)),'g'); pause; % Filtrando PB de nuevo obtendriamos la senal original: PB4ktest=[ones(Ntest/20,1);zeros(Ntest*18/20,1);ones(Ntest/20,1)]; plot(ftest,abs(PB4ktest(1:Ntest/2))/max(abs(PB4ktest))*max(abs(Xtest)),'y'); hold off; pause; Xtestrecuperada=PB4ktest.*Y; plot(ftest,abs(Xtestrecuperada(1:Ntest/2))); xlabel('Frecuencia (Hz)'); pause; xtestrecuperada=real(ifft(Xtestrecuperada,Ntest)); wavplay(xtestrecuperada,Fstest); pause; % Vamos a repetir el proceso con un tren de pulsos mas espaciado: paliasing=zeros(Ntest,1); for i=1:15:Ntest paliasing(i)=15; end stem(ttest(1:50),paliasing(1:50)); xlabel('Tiempo (s)'); pause Paliasing=fft(paliasing); plot(ftest,abs(Paliasing(1:Ntest/2))); xlabel('Frecuencia (Hz)'); pause; yaliasing=paliasing.*xtest; stem(ttest(1:50),yaliasing(1:50)); xlabel('Tiempo (s)'); pause; Yaliasing=fft(yaliasing); plot(ftest,abs(Yaliasing(1:Ntest/2))); xlabel('Frecuencia (Hz)'); hold on; plot(ftest,abs(Xtest(1:Ntest/2)),'r'); plot(ftest,abs(Paliasing(1:Ntest/2))/max(abs(Paliasing))*max(abs(Xtest)),'g'); pause; % Vemos que las diversas repeticiones del espectro se solapan. Si % intentamos recuperar la senal original mediante un FPB, no podemos % debido a que el espectro se ha corrompido. A este efecto se le % llama "aliasing". Si escuchamos la senal recuperada tras el filtrado, % oiremos que la senal esta distorsionada. plot(ftest,abs(PB4ktest(1:Ntest/2))/max(abs(PB4ktest))*max(abs(Xtest)),'y'); hold off; pause; Xtestrecuperadaaliasing=PB4ktest.*Yaliasing; plot(ftest,abs(Xtestrecuperadaaliasing(1:Ntest/2))); xlabel('Frecuencia (Hz)'); pause; xtestrecuperadaaliasing=real(ifft(Xtestrecuperadaaliasing,Ntest)); wavplay(xtestrecuperadaaliasing,Fstest); pause;