ENGENHARIA DE TELECOMUNICAÇÕES PROCESSAMENTO DIGITAL DE SINAIS Assunto: Transformada Discreta de Fourier (DFT) Das últimas aulas sabemos que a transformada de Fourier de um sinal discreto é contínua e dada por: +∞ X (e ) = jΩ porém contínua de −∞ x[n].e − j .n.Ω , onde Ω é a freqüência de sinal discreto , [−π , π ] e a transformada inversa é dada por : 1 x[n] = 2.π π −π X (e jΩ ).e j .Ω.n dΩ A idéia agora é discretizar o domínio da freqüência na tentativa de obter o espectro do sinal . É evidente que se discretizarmos o domínio da freqüência, o sinal no domínio do tempo se torna periódico, ou seja: X [e j 2π .k N ]= 1 x[ n ] = N N −1 n =0 x[n].e N −1 k =0 − j. X [e j 2π .k .n N 2π .k N ]. e DFT j. 2π .k .n N IDFT Observe que o número de harmônicos é o mesmo do número de pontos. A DTFS é totalmente discreta em ambos os domínios e X[k} tem o mesmo período de x[n]. É importante notar que o comprimento da seqüência x[n]( L) deve ser menor ou no máximo igual a N para evitar o aliasing na reconstrução. Quanto maior for N melhor será o espectro. Normalmente quando N é maior que L, temos o que é chamado de Zero- ENGENHARIA DE TELECOMUNICAÇÕES padding que é completar x[n] com zeros, pois os dois somatórios devem ter os mesmos limites. OBS: Lembre-se que a DFT assim como a DTFT está localizada no intervalo de [0,2π ] ou de rebatimento da DFT.. [−π , π ] se forem realizadas as operações necessárias de Do mesmo modo que a DTFT, a DFT tem uma diferença de amplitude com o espectro analógico, ou seja devemos sempre multiplicar a espectro DTFT ou DFT pelo tempo de amostragem para obtermos a amplitude verdadeira se for o caso. Exemplo: 1) Seja x[n] dada pela equação abaixo: x[n] = 1 ,0 ≤ n ≤ 3 0 fora a) Encontre a DTFT. b) Encontre a DFT com 4 pontos e reconstrua o sinal. c) Encontre a DFT com 8 pontos e reconstrua o sinal d) Encontre a DFT com 16 pontos e reconstrua o sinal e) Encontre a DFT com 32 pontos O programa abaixo determina a DFT para o sinal dado. Construa outras funções para fazer a reconstrução do sinal pela IDFT. % programa para calcular a DFT de um sinal function ex_1_dft % Sinal de entrada dado no exemplo 1 x = [1 1 1 1 ] n = [0:(length(x) -1)] subplot(2,3,1);stem(n,x);title(['Gráfico do sinal dado']); xlabel('n'); ylabel('x[n]'); [X,s] = DTFT(x,n); subplot(2,3,2);plot(s/pi,abs(X));grid on title('Gráfico da DTFT'); xlabel('freq. em multiplos de pi'); N = 4; [Xd,s] = DFT(x,n,N) subplot(2,3,3);stem(s/pi,abs(Xd));grid on title(['Gráfico da DFT com ' num2str(N)]); xlabel('freq. em multiplos de pi'); N = 8; [Xd,s] = DFT(x,n,N) ENGENHARIA DE TELECOMUNICAÇÕES subplot(2,3,4);stem(s/pi,abs(Xd));grid on title(['Gráfico da DFT com ' num2str(N)]); xlabel('freq. em multiplos de pi'); N = 16; [Xd,s] = DFT(x,n,N) subplot(2,3,5);stem(s/pi,abs(Xd));grid on title(['Gráfico da DFT com ' num2str(N)]); xlabel('freq. em multiplos de pi'); function [Xd,s] = DFT(x,n,N) s= [0:(2*pi/N):(2*pi*(N-1)/(N))] x= [ x zeros(1,N-length(x))] k =[0:(N-1)] n = k; Xd = x*exp(-j*2*pi/N*n'*k); length(x) length(s) function [X,s] = DTFT(x,n) s = [0:0.01:2*pi]; % cálculo da DTFT X = x*exp(-j*n'*s); O resultado para as DFT seriam: ENGENHARIA DE TELECOMUNICAÇÕES Grá fico do sinal dado 1 Grá fico da DTFT 4 0.8 Grá fico da DFT com 4 4 3 3 2 2 1 1 x[n] 0.6 0.4 0.2 0 0 1 2 3 0 0 n Grá fico da DFT com 8 4 3 2 2 1 1 0 0 0.5 1 1.5 freq. em multiplos de pi 2 0 2 0 0 0.5 1 1.5 freq. em multiplos de pi Grá fico da DFT com 16 4 3 0.5 1 1.5 freq. em multiplos de pi 0 0.5 1 1.5 freq. em multiplos de pi 2 Na prática o número N deve ser bem grande para obtermos uma boa precisão. Quando N é uma potênica de 2 , temos algoritmos bem rápidos chamados de FFT( Fast Fourier Transform). O Matlab tem a função fft(x) onde x é o vetor da seqüência. Se desejarmos impor a quantidade de pontos temos a função fft(x,N). Observe que se N for maior que o comprimento de x tem o zero-padding (completar x com zeros), e se N for menor que o comprimento de x o vetor é truncado.l [0,2π ] A função fft faz a transformada no intervalo de , se quisermos de temos que utilizar a função fftshift(fft(x)) para rebater a fft(x). O mesmo exemplo acima utilizando a função do Matlab. % programa para calcular a FFT do Matlab function ex_1_fft % Sinal de entrada dado no exemplo 1 x = [1 1 1 1 ] n = [0:(length(x) -1)] de um sinal [−π , π ] ENGENHARIA DE TELECOMUNICAÇÕES subplot(2,3,1);stem(n,x);title(['Gráfico do sinal dado']); xlabel('n'); ylabel('x[n]'); [X,s] = DTFT(x,n); subplot(2,3,2);plot(s/pi,abs(X));grid on title('Gráfico da DTFT'); xlabel('freq. em multiplos de pi'); N = 4; Xd = fft(x,N) s= [0:(2*pi/N):(2*pi*(N-1)/(N))] subplot(2,3,3);stem(s/pi,abs(Xd));grid on title(['Gráfico da fft com ' num2str(N)]); xlabel('freq. em multiplos de pi'); N = 8; Xd = fft(x,N) s= [0:(2*pi/N):(2*pi*(N-1)/(N))] subplot(2,3,4);stem(s/pi,abs(Xd));grid on title(['Gráfico da fft com ' num2str(N)]); xlabel('freq. em multiplos de pi'); N = 16; Xd = fft(x,N) s= [0:(2*pi/N):(2*pi*(N-1)/(N))] subplot(2,3,5);stem(s/pi,abs(Xd));grid on title(['Gráfico da fft com ' num2str(N)]); xlabel('freq. em multiplos de pi'); function [X,s] = DTFT(x,n) s = [0:0.01:2*pi]; % cálculo da DTFT X = x*exp(-j*n'*s); Os gráficos abaixo mostram que o resultado é o mesmo: ENGENHARIA DE TELECOMUNICAÇÕES Grá fico do sinal dado 1 Grá fico da DTFT 4 0.8 Grá fico da fft com 4 4 3 3 2 2 1 1 x[n] 0.6 0.4 0.2 0 0 1 2 3 0 0 n Grá fico da fft com 8 4 3 2 2 1 1 0 0 0.5 1 1.5 freq. em multiplos de pi 2 0 2 0 0 0.5 1 1.5 freq. em multiplos de pi Grá fico da fft com 16 4 3 0.5 1 1.5 freq. em multiplos de pi 0 0.5 1 1.5 freq. em multiplos de pi 2 Exercícios. 1) O Matlab tem a função ifft(xd) para reconstruir o sinal a partir de usa transformada xd.; Construa um programa para reconstruir o sinal do exemplo 1. 2) Plotar a DFT dos sinais abaixo par N= 16 , N = 32, N = 256. a) x1[n] = 2 * cos(0.2π .n)(u[n] − u[n − 10]) b) x 2[n] = 5 * (0.9e jπ / 4 ) n .u[n] 3) Seja o sinal x(t ) = ∆ 2 (t ) a) amostre este sinal com as freqüências : Fs= 10/s; Fs = 100/s e a freqüência de Nyquist. Construa os gráficos. b) Determine a fft em todos os casos. c) Reconstrua o sinal utilizando a ifft do Matlab.