Escolar Documentos
Profissional Documentos
Cultura Documentos
δ
1 n=[-5:30];
2 a=exp((0.2+3j)*n);
3 subplot(2,2,1); stem(n, real(a)); title('Parte real');
4 subplot(2,2,2); stem(n, imag(a)); title('Parte imaginária');
5 subplot(2,2,3); stem(n, abs(a)); title('Magnitude');
6 subplot(2,2,4); stem(n, angle(a)); title('Fase');
7 b=exp(0.2*n);
8 c=exp(3j*n);
9 figure;
10 subplot(2,1,1); stem(n, b); title('Módulo');
11 subplot(2,1,2); stem(n, c); title('Fase');
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
1 %% inicializacoes
2 F = 60; %freq analogica
3 Fs = 400; %freq aquisicao
4 ts = 1/Fs; %tempo aquisicao
5 num_ciclos = 3; %(equivale a 3 ciclos)
6 t = 0:1e-6:(num_ciclos*(1/F)); %tempo simulacao
7 n = 0:round(num_ciclos*(Fs/F)); %numero amostras
8
9 %% parte analogica
10 f_analogico = sin(2*pi*F*t);
11 plot(t,f_analogico);
12
13 %% parte digital
14 f_digital = sin(2*pi*(F/Fs)*n);
15 hold on;
16 stem(n.*ts,f_digital);
1 %% inicializacoes
2 F1 = 1000; %freq analogica
3 Fs = 6000; %freq aquisicao
4 ts = 1/Fs; %tempo aquisicao
5 num_ciclos = 1; %(equivale a 3 ciclos)
6 t = 0:1e-6:(num_ciclos*(1/F1)); %tempo simulacao
7 n = 0:round(num_ciclos*(Fs/F1)); %numero amostras
8
9 %% parte analogica
10 f_analogico1 = sin(2*pi*F1*t);
11 f_analogico2 = sin(2*pi*7000*t);
12 f_analogico3 = sin(2*pi*13000*t);
13
14 plot(t,f_analogico1,'r');
15 hold on;
16 plot(t,f_analogico2,'b');
17 plot(t,f_analogico3,'k');
18 legend('1k','7k','13k');
19
20 %% parte digital
21 f_digital = sin(2*pi*(F1/Fs)*n);
22 stem(n.*ts,f_digital);
1 x1 = [1 2 3 2 1];
2 n1 = [-2 -1 0 1 2];
3 x2 = [2 3 4];
4 n2 = [0 1 2];
5 [x3, n3] = sigadd(x1,n1,x2,n2);
6 stem(n3,x3);
1 x1 = [1 2 3 2 1];
2 n1 = [-2 -1 0 1 2];
3 x2 = [2 -3 4];
4 n2 = [-1 0 1];
5 [x3, n3] = sigmult(x1,n1,x2,n2);
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
6 stem(n3,x3);
1 x1 = [1 2 3 2 1];
2 n1 = [0 1 2 3 4];
3 [x2, n2] = sigshift(x1,n1,2); %mesmo que x1(n-2)
4 subplot(2,1,1); stem(n1,x1); title('Original');
5 subplot(2,1,2); stem(n2,x2); title('Atrasada 2 unid');
1 x1 = [1 2 3 4 5];
2 n1 = [0 1 2 3 4];
3 [x2, n2] = sigfold(x1,n1);
4 stem(n2, x2);
Código 3.4 - Uso de janelas para cálculo da DFT visando diminuir o leakage
1 clc; clear;
2 %% gera um sinal "sintetico"
3 Fs = 200;
4 ts = 1/Fs;
5 N = 300;
6 t = (0:N-1)*ts;
7 sinal = 0.6*sin(2*pi*13*t);
8 %% cria um segundo sinal "janelado"
9 janela = window(@hann,N);
10 sinal_jan = sinal'.*janela;
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
π π
Código 3.5 - Código para solução dos dois itens anteriores. Observe que é usada a função DFT da biblioteca empregada neste apostila.
1 clc; clear;
2 n = [0:99];
3 Fs = 100;
4 x = cos(0.48*pi*n) + cos(0.52*pi*n);
5 %% calcula DFT com N=10 e plota
6 n1 = [0:9];
7 sinal1 = x(1:10);
8 Y1 = dft(sinal1, 10);
9 magY1 = abs(Y1(1:6));
10 N1 = 5;
11 m1= 0:5;
12 f1= m1*Fs/N1;
13 subplot(2,3,1); stem(sinal1); xlabel('n'); title('N=10')
14 subplot(2,3,4); stem(f1, magY1); xlabel('freq(Hz)');
15 %% calc DFT com N=10+90 zeros e plota (melhor resol espectro)
16 sinal2 = [x(1:10) zeros(1,90)]; %preencheu sinal que essencialmente eh o mesmo
17 Y2 = dft(sinal2,100);
18 magY2 = abs(Y2(1:50));
19 N2 = 50;
20 m2= 1:50;
21 f2= m2*Fs/N2;
22 subplot(2,3,2); stem(sinal2); xlabel('n'); title('N=10+90 zeros com boa resol. espec.')
23 subplot(2,3,5); stem(f2, magY2); xlabel('freq(Hz)');
24 %% calc DFT com N=100
25 sinal3 = x(1:100);
26 Y3 = dft(sinal3,100);
27 magY3 = abs(Y3(1:50));
28 N3 = 50;
29 m3= 1:50;
30 f3= m3*Fs/N3;
31 subplot(2,3,3); stem(sinal3); xlabel('n'); title('N=100 com boa densid. espec.')
32 subplot(2,3,6); stem(f3, magY3); xlabel('freq(Hz)');
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
o
o
o
o
π π
79 legend('entrada','saída','resp. impulsiva');
80 xlabel('Freq (Hz)');
81 title('Espectros dos sinais e filtro')
82 subplot(2,2,4); plot(n1, entrada_discretizada);
83 hold on;
84 plot(n3, saida,'r');
85 legend('entrada','saída');
86 xlabel('n');
87 title('Sinais discretos do filtro');
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
Código 4.6 - Ilustração do uso da função firpm que executa o algoritmo de Parks-McClellan para encontrar coeficientes de filtro FIR.
1 %coeficientes para filtro passa-faixa:
2 % f = [0 0.4 0.44 0.56 0.6 1];
3 % a = [0 0 1 1 0 0];
4
5 %coeficientes para filtro passa-baixas:
6 f = [0 0.4 0.5 1];
7 m = [1 1 0 0];
8
9 coef = firpm(32,f,m);
10 freqz(coef);
δ δ
Código 4.7 - Uso otimizado do filtro FIR usando Parks-McClellan – Exemplo de um filtro passa-baixas
1 Fs = 8000;
2 [n,fo,ao,w] = firpmord([1500 2000],[1 0],[0.01 0.1],Fs);
3 coef = firpm(n,fo,ao,w);
freqz(coef,1,512)
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
Código 4.9 – Exemplo do uso da função firpmord para o filtro ilustrado na figura.
1 Fs = 40000;
2 k1 = 0.05; % atenuacao nas bandas de rejeicao
3 k2 = 0.01; % ripple nas bandas de passagem
4 [n, fo, ao, w] = firpmord([5000 5500 9500 10000 15000 15500 17500 18000], [0 1 0 1 0], [k1
5 k2 k1 k2 k1], Fs);
6 b = firpm(n, fo, ao, w);
7 %% calcula o eixo da freq
8 [espectro, w] = freqz(b,1,512);
9 freq = (w/pi);
10 freq = freq*(Fs/2);
11 %% plota
12 subplot(2,1,1); plot(freq, 20*log10(abs(espectro))); title('escala dB'); grid on;
13 subplot(2,1,2); plot(freq, abs(espectro)); title('escala linear'); grid on;
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
𝑏0 + 𝑏1 𝑧 −1 +. . . +𝑏𝑀 𝑧 −𝑀
𝑆(𝑧) =
𝑎0 + 𝑎1 𝑧 −1 +. . . +𝑎𝑁 𝑧 −𝑁
𝜋
𝑥[𝑛] = (𝑛 − 2)(0,5)(𝑛−2) 𝑐𝑜𝑠 ( (𝑛 − 2)) 𝑢(𝑛 − 2)
3
𝜋
𝑋(𝑧) = 𝑧 −2 . [𝑛(0,5)𝑛 𝑐𝑜𝑠 ( 𝑛) 𝑢(𝑛)]
3
𝑑 𝜋
𝑋(𝑧) = 𝑧 −2 . [−𝑧 {(0,5)𝑛 𝑐𝑜𝑠 ( 𝑛) 𝑢(𝑛)}]
𝑑𝑧 3
𝜋
𝜋 1 − (0,5𝑐𝑜𝑠 ) 𝑧 −1 1 − 0.25𝑧 −1
𝑛
𝑍 {(0,5) 𝑐𝑜𝑠 ( 𝑛) 𝑢(𝑛)} = 3 =
3 𝜋 −1 −2
1 − 2 (0,5𝑐𝑜𝑠 3 ) 𝑧 −1 + 0,25𝑧 −2 1 − 0.5𝑧 + 0,25𝑧
𝑑 1 − 0.25𝑧 −1
𝑋(𝑧) = −𝑧 −1 . { }
𝑑𝑧 1 − 0.5𝑧 −1 + 0,25𝑧 −2
1 clear; clc;
2 %teste 1: usando na forma de eq. diferencas:
3 n = [0:7];
4 sinal = [(n-2).*(1/2).^(n-2).*cos(pi*(n-2)/3)].*[0 0 1 1 1 1 1 1]
5
6 %teste 2: usando transf z
7 b=[0, 0, 0, 0.25, -0.5, 0.0625]; %coef b do numerador
8 a=[1, -1, 0.75, -0.25, 0.0625]; %coef a do denominador
9 entrada = [1 0 0 0 0 0 0 0];
10 sinal = filter(b, a, entrada)
𝑀 𝑁
∑ 𝑎𝑘 𝑦(𝑛 − 𝑘) = ∑ 𝑏𝑚 𝑥(𝑛 − 𝑚)
𝑘=0 𝑚=0
1 b=[1];
2 a=[1, -1, 0.9];
3 x = impseq(0, -20, 120);
4 n = [-20:120];
5 h = filter (b, a, x);
6 subplot(2,1,1); stem(n, h); title('resposta impulsiva h(n)');
sum(abs(y))
𝑦(𝑛) 1
𝑍( ) = 𝐻(𝑧) =
𝑥(𝑛) 1 − 1𝑧 + 0.9𝑧 −2
−1
1 z = roots(a)
2 z =
3 0.5000 + 0.8062i
0.5000 - 0.8062i
𝑧
𝑋(𝑧) =
3𝑧 2 − 4𝑧 + 1
𝑧 𝑧 −2 𝑧 −1
𝑋(𝑧) = 2 . =
3𝑧 − 4𝑧 + 1 𝑧 −2 3 − 4𝑧 −1 + 𝑧 −2
1 b = [0, 1];
2 a = [3, -4, 1];
3 [R, p, C] = residuez(b,a)
4 R =
5 0.5000
6 -0.5000
7 p =
8 1.0000
9 0.3333
10 C =
11 []
𝑧 0.5 −0.5
𝑋(𝑧) = = +
3𝑧 2 − 4𝑧 + 1 1 − 1.0𝑧 −1 1 − 0.333𝑧 −1
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
1 R = [0.5, -0.5];
2 p = [1.0, 0.3333];
3 C = [];
4 [b, a] = residuez(R, p, C)
5 b =
6 0 0.3334
7 a =
8 1.0000 -1.3333 0.3333
0 + 0.3334𝑧 −1
𝑋(𝑧) =
1.0 − 1.333𝑧 −1 + 0.3334𝑧 −2
1
𝑋(𝑧) = (1−0.9𝑧 −1 )2 (1+0.9𝑧 −1 )
1 b = [1];
2 a = poly( [0.9, 0.9, -0.9] )
3 a =
4 1.0000 -0.9000 -0.8100 0.7290
5 [R, p, C] = residuez(b, a)
6 R =
7 0.2500 + 0.0000i
8 0.5000 - 0.0000i
9 0.2500 + 0.0000i
10 p =
11 0.9000 + 0.0000i
12 0.9000 - 0.0000i
13 -0.9000 + 0.0000i
14 C =
15 []
5
𝑥[𝑛] = 0.25(0.9)𝑛 𝑢(𝑛) + (𝑛 + 1)(0.9)𝑛+1 𝑢(𝑛 + 1) + 0.25(−0.9)𝑛 𝑢(𝑛)
9
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
(𝑧 ± 𝑧0 )(𝑧 ± 𝑧1 ). . . (𝑧 ± 𝑧𝑀 )
𝑋(𝑧) =
(𝑧 ± 𝑝0 )(𝑧 ± 𝑝1 ). . . (𝑧 ± 𝑝𝑁 )
1
𝑦(𝑛) − 0.9𝑦(𝑛 − 1) = 𝑥(𝑛) ⇒ 𝐻(𝑧) =
1 − 0.9𝑧 −1
1 b = [1];
2 a = [1, -0.9];
3 zplane(b, a);
1 b = [1];
2 a = [1, -0.9];
3 [H, w] = freqz(b, a, 100);
4 subplot(2,1,1); plot(w/pi, abs(H));
5 grid on; xlabel('Freq'); ylabel('Mag'); title('resposta em magnitude');
6
7 subplot(2,1,2); plot(w/pi, angle(H)/pi);
8 grid on; xlabel('Freq'); ylabel('Fase'); title('resposta em fase');
1
𝐻(𝑧) = −1
⇒ ℎ(𝑛) = (0,9)𝑛 𝑢(𝑛)
1 − 0.9𝑧 𝑖𝑛𝑣𝑒𝑟𝑠𝑎
Transformação do filtro
Projeto filtro analógico Mudança banda dos filtros
s→z
Código 5.1 - Projeto de um filtro Butterworth passa-baixas analógico a partir da frequência de corte e número de polos.
1 N = 3;
2 OmegaC = 2500/5000; %freq de corte 2.500Hz com taxa de aquisição de 2x5.000Hz (normalizado)
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
3 [b,a] = butter(N,OmegaC,'low','s')
0.1250
1.0s 1.0s 2 0.50 s 0.1250
3
π
π π
Código 5.2 - Projeto de um filtro Butterworth passa-baixas analógico a partir da banda de transição, ripple e atenuação.
1 wp = 0.2*pi; % 0 a 0.2pi = banda passagem
2 ws = 0.3*pi; % 0.3pi a 1pi = banda rejeição
3 rp = 7; %ripple banda passagem em dB
4 as = 16; %atenuação mínima na banda rejeição em dB
5 ripple = 10^(-rp/20); %descobre valor do ripple sem escala log
6 atenuacao = 10^(-as/20); %descobre valor da atenuação sem escala log
7 [b, a] = afd_butt(wp, ws, rp, as)
8 w = 0:pi/1000:pi; %determina um eixo para freq
9 h = freqs(b,a,w); %calcula a resposta em freq do filtro
10 plot(w/pi,abs(h));
0.1238
1.0s 0.9969 s 2 0.4969 s 0.1238
3
Código 5.3 - Exemplo de conversão de uma equação no domínio "s" para o "z" usando o método de invariância ao impulso
1 %% PARTE 1: especificações projeto
2 wp = 0.2*pi; % 0 a 0.2pi = banda passagem
3 ws = 0.3*pi; % 0.3pi a 1pi = banda rejeição
4 rp = 7; %ripple banda passagem em dB
5 as = 16; %atenuação mínima na banda rejeição em dB
6 T = 1; % taxa de amostragem da frequencia
7
8 %% PARTE 2: desenha filtro analógico
9 [b, a] = afd_butt(wp, ws, rp, as);
10 w = 0:pi/1000:pi; %determina um eixo para freq
11
12 h = freqs(b,a,w); %calcula a resposta em freq do filtro
13 subplot(2,1,1); plot(w/pi,abs(h)); title('resp freq analogico');
14
15 %% PARTE 3: digitaliza filtro usando inv ao impulso
16 [bz, az] = impinvar(b,a,T);
17 hz = freqz(bz,az,w);
18 subplot(2,1,2); plot(w/pi,abs(hz)); title('resp freq digital');
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
π π
Código 5.4 - Código de um filtro passa-baixas de 0 a 3.400Hz com transição de 3400 a 4000Hz.
1 Fs = 40000;
2 wp= 3400/(Fs/2);
3 ws= 4000/(Fs/2);
4 [n, wn]=buttord(wp, ws, 1, 20);
5 [b, a]= butter(n,wn);
6 num_freq = 512;
Universidade Federal de Uberlândia
Faculdade de Engenharia Elétrica - Prof. Alan Petrônio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Eng.Eletrônica e Telecomunicações (campus Patos de Minas) - Disciplina de Processamento Digital de Sinais - Versão documento: 1.3
Código 5.5 - Código de um filtro passa-altas de 4000Hz a 20000Hz sendo esta última a máxima frequência.
1 Fs = 40000;
2 wp= 4000/(Fs/2);
3 ws= 3400/(Fs/2);
4 [n, wn]=buttord(wp, ws, 1, 20);
5 [b, a]= butter(n,wn,'high');
6 num_freq = 512;
7 freqz(b, a, num_freq, Fs);
Código 5.6 - Código de um filtro passa-faixas de 4000 a 8000Hz com transições de largura 600Hz.
1 Fs = 40000;
2 ws1= 3400/(Fs/2);
3 wp1= 4000/(Fs/2);
4 wp2= 8000/(Fs/2);
5 ws2= 8600/(Fs/2);
6 [n, wn]=buttord([wp1 wp2], [ws1 ws2], 1, 20);
7 [b, a]= butter(n,wn);
8 num_freq = 512;
9 freqz(b, a, num_freq, Fs);
Código 5.7 - Código de um filtro rejeita-faixas que exclui as faixas de 4500 a 8000Hz e largura de transição de 500Hz.
1 Fs = 40000;
2 wp1= 4000/(Fs/2);
3 ws1= 4500/(Fs/2);
4 wp2= 8500/(Fs/2);
5 ws2= 8000/(Fs/2);
6 [n, wn]=buttord([wp1 wp2], [ws1 ws2], 1, 20);
7 [b, a]= butter(n,wn,'stop');
8 num_freq = 512;
9 freqz(b, a, num_freq, Fs);