Escolar Documentos
Profissional Documentos
Cultura Documentos
Escola Politécnica
São Paulo
2020
Sumário
1. Função analogButter ______________________________ 3
2. Utilização da função analogButter ___________________ 3
3. Filtragem do sinal ________________________________ 5
4. Verificação do resultado com funções já prontas ______ 7
5. Filtragem pelo critério min-max _____________________ 9
6. Código em Julia 1.4.0 ____________________________ 11
7. Conclusão _____________________________________ 17
2
1. Função analogButter
Como pedido na primeira parte foi criada uma função analogButter em
Julia 1.4.0, a função tem como entrada 𝛿𝑟 , 𝛿𝑝 , Ὢ𝑟 𝑒 Ὢ𝑝 .
∆2
𝑙𝑛(∆1) ∆1 ∆2
𝑁≥ 𝑒 ≤C≤
𝑙𝑛(Ὢ𝑟𝑛 ) Ὢ𝑝𝑛 𝑁 Ὢ𝑟𝑛 𝑁
Sendo assim, N foi escolhido como sendo o menor valor inteiro dentro
deste intervalo e C a média do limite inferior e superior do intervalo
dado.
Com N e C calculados pode-se calcular os polos, zeros e ganhos. Os
zeros num filtro Butterworth só existem no infinito então aproximamos
para um vetor com 0 elementos. Todos os polos 𝑠𝑘 não são adequados
para se utilizar no filtro, já que possuem parte real positiva, logo
seleciona só os N elementos com parte real negativa
1 𝜋 𝜋 𝜋
𝑝𝑘 = 𝑁 𝑒 𝑗∗( 2 +2𝑁+𝑁𝑘) 0 ≤ 𝑘 ≤ 𝑁
√𝐶
E 𝑘𝑛 𝑠𝑒 𝑑𝑎 𝑝𝑜𝑟 𝑘𝑛 =1/C.
Ὢ𝑝 N
𝑝c = Ὢ𝑝 *𝑝𝑘 e kc =
C
2. Utilização da função analogButter
No enunciado da experiência recebeu a seguintes especificações para o
projeto:
• Faixa de passagem: 0 ≤ ω ≤ ωp = 0,05π rad/amostra
• Faixa de rejeição: 0,5π rad/amostra = ωr ≤ ω ≤ π rad/amostra
• Atenuação mínima na faixa de rejeição: 40 dB
• Queda máxima na faixa de passagem δp = 0,05.
3
Como a função não funciona adequadamente com valores nesse
formato, precisou alterar para a entrada aceitada. A atenuação na faixa
de rejeição precisa estar em módulo, logo:
40 = -20 log (δr)
Chega-se no resultado de δr=0,01.
4
Gráfico 2 – Representação somente dos polos com parte real negativa do filtro
proposto.
Após isso precisa voltar o filtro para digital utilizando uma transformação
bilinear novamente onde:
𝑧−1 1+𝑠
𝑠= ↔ 𝑧=
𝑧+1 1−𝑠
Após transformar os polos e obter-se os zeros, se obtém o k:
∏𝑖(−𝑝𝑧𝑖 )
𝑘 =
∏𝑗(−𝑧𝑧𝑗 )
3. Filtragem do sinal
O sinal de entrada se dar por:
𝜋
𝑠[𝑛] = 𝑠𝑒𝑛( 𝑛) + 𝑣[𝑛]
20
Aonde v[n] é um ruído branco Gaussiano com média nula e variância
0,04 e n = 0 ... 1000
Utilizou a função randn* 𝜎 (desvio padrão) para se obter um ruído com
essa variância desejada pelo enunciado, isso pode se ver pelo resultado
da própria definição da variância
5
∑𝑛𝑖=1(𝑥𝑖 − 𝑥̅ )²
𝜎² =
𝑛−1
6
Gráfico 4 – Comparação do sinal limpo, sinal com ruído e sinal filtrado.
7
Gráfico 5 – Resposta do Filtro Butterworth Passa-Baixa analógico utilizando a
biblioteca Scipy do Python
Assim com o filtro feito, utilizou a função filt de Julia para filtrar o sinal
8
Gráfico 7 – Comparação do Sinal de saída utilizando a biblioteca Scipy (ynovo[n]) e
filtro projetado (y[n])
9
No caso da banda passante o ganho e o peso desejado é 1 para ambos,
já na banda de rejeição, o ganho desejado é 0 e o peso é dado por
δp/δr.
10
Gráfico 10 – Comparação do Sinal de saída entre o sinal filtrado por Butterworth (sf[n])
e o sinal filtrado pelo critério de min-max (yminmax[n])
using DSP;
using PyPlot;
using Statistics;
using Polynomials;
using PyCall;
function analogButter(δp,δr,Ωp,Ωr)
###Frequencias normalizadas
Ωpn = 1.0
Ωrn = Ωr / Ωp
∆1=sqrt(2*δp-δp^2)/(1-δp);
∆2= sqrt(1-δr^2)/(δr);
N=ceil(Int, log(∆2/∆1)/log(Ωrn/Ωpn));
11
C=0.5*((∆1/(Ωpn^N)) + (∆2/(Ωrn^N)))
kn = 1/C
zn= Array{Float64,1}();
#voltando
pc= Ωp*pn
kc = Ωp^N / C
return zn,pc,kc
end
ωp = 0.05π
ωr= 0.5π
δp = 0.05
δr = 0.01 ###−40 = 20 log10 (δr)
Ωp=tan(ωp/2)
Ωr=tan(ωr/2)
(zc,pc,kc)=analogButter(δp,δr,Ωp,Ωr)
coefa(filtrozpk)
coefb(filtrozpk)
filtro=convert(PolynomialRatio, filtrozpk)
plot(real.(pc),imag.(pc),"xr")
plot([0;0],1.1*[minimum(imag.(pc));maximum(imag.(pc))])
axis("square")
grid();
title("Polos do filtro analógico")
xlabel("Re{z}")
ylabel("Imag{z}")
Hs = ZeroPoleGain(zc, pc,kc)
hsfiltro=convert(PolynomialRatio, Hs)
Ω = range(0,1,length=200)
Hf = freqs(Hs,Ω)
f=plt.figure()
plot(Ω, amp2db.(abs.(Hf)))
grid()
title("Resposta em frequência do filtro analógico")
plot([0;ωp/pi],amp2db(1-δp)*[1;1],"r")
plot([0.64;1], amp2db(δr)*[1;1],"r")
xlabel(L"$\hat{\Omega}$");
ylabel(L"$|H{j\Omega})|$");
f.add_subplot(223,position=[0.6,0.4,0.25,0.25])
plot(Ω, amp2db.(abs.(Hf)))
plot([0;ωp/pi],amp2db(1-δp)*[1;1],"r")
axis([0,1.2*Ωp,amp2db(1-δp)-0.05,0.05])
grid()
title("Banda passante")
12
xlabel(L"$\hat{\Omega}$");
function z2s(z)
if abs(z) == Inf
return 1
else
return (z-1)/(z+1)
end
end
function s2z(s)
if s == Inf
return -1.0
elseif s == -Inf
return 1.0
else
return (1+s)/(1-s)
end
end
pz = s2z.(pc)
Ωpn = 1.0
Ωrn = Ωr / Ωp
∆1=sqrt(2*δp-δp^2)/(1-δp);
∆2= sqrt(1-δr^2)/(δr);
N=ceil(Int, log(∆2/∆1)/log(Ωrn/Ωpn));
zz = s2z.(Inf * ones(N))
print("k = ",k)
H = ZeroPoleGain(zz, pz,k)
a=coefa(H)
for i=1:4
print("a[",i,"] =",a[i],"\n")
end
b=coefb(H)
for i=1:4
print("b[",i,"] =",b[i],"\n")
end
n=0:1000;
sf=sin.((pi/20).*n);
v=0.2.*randn(Float64, 1001);
var(v) #variancia de v
s=sf+v;
plot(n,s);
13
title("Sinal de Entrada")
xlabel("n")
ylabel("s[n]")
grid();
function filtragem(H,x)
y=zeros(1001);
a=coefa(H);
b=coefb(H);
y[1]=b[1]*x[1]
y[2]=b[1]*x[2]+b[2]*x[1]-a[2]*y[1]
y[3]=b[1]*x[3]+b[2]*x[2]+b[3]*x[1]-a[2]*y[2]-a[3]*y[1]
for i=4:1001
y[i] = -a[2]*y[i-1] -a[3]*y[i-2] -a[4]*y[i-3] + b[1]*x[i] +
b[2]*x[i-1]+b[3]*x[i-2]+ b[4]*x[i-3]
end
return y
end
y=filtragem(H,s)
subplot(311)
plot(n,sf);
ylabel("s[n] limpo")
grid()
subplot(312)
plot(n,s)
grid()
ylabel("s[n]")
subplot(313)
plot(n,y)
ylabel("sf[n]")
xlabel("n")
grid()
var(y)
sig = pyimport("scipy.signal");
ω = range(0, π, length=500)
coefbutt = PolynomialRatio(b,a)
Hbcoef = freqz(coefbutt, ω)
f=plt.figure()
plot(ω/π, amp2db.(abs.(Hbcoef)))
plot([0;ωp/π],amp2db(1-δp)*[1;1],"r")
plot([ωr/π;1],amp2db(δr)*[1;1],"r")
xlabel(L"$\omega/\pi$")
ylabel(L"$|H_{b}(e^{j\omega})|$")
axis([0, 1, -50, 1])
14
grid();
f.add_subplot(222)
plot(ω/π, amp2db.(abs.(Hbcoef)))
plot([0;ωp/π],amp2db(1-δp)*[1;1],"r")
xlabel(L"$\omega/\pi$")
ylabel(L"$|H_{b}(e^{j\omega})|$")
axis([0, 1.1ωp/π, 2*amp2db(1-δp), amp2db(1+δp)])
title("Zoom da banda passante")
grid();
[b a]
zpkbutt=ZeroPoleGain(z,p,k)
Hbzpk = freqz(zpkbutt, ω)
f=plt.figure()
plot(ω/π, amp2db.(abs.(Hbzpk)))
plot([0;ωp/π],amp2db(1-δp)*[1;1],"r")
plot([ωr/π;1],amp2db(δr)*[1;1],"r")
xlabel(L"$\omega/\pi$")
ylabel(L"$|H_{b}(e^{j\omega})|$")
title("Filtro de Butterworth")
axis([0, 1, -50, 1])
grid();
f.add_subplot(222,position=[0.5,0.5,0.33,0.33])
plot(ω/π, amp2db.(abs.(Hbzpk)))
plot([0;ωp/π],amp2db(1-δp)*[1;1],"r")
xlabel(L"$\omega/\pi$")
ylabel(L"$|H_{b}(e^{j\omega})|$")
axis([0, 1.1ωp/π, 2*amp2db(1-δp), amp2db(1+δp)])
title("Zoom da banda passante")
grid();
[coefb(zpkbutt) coefa(zpkbutt)]
ynovo=filt(zpkbutt,s)
subplot(211)
grid()
plot(n,ynovo)
ylabel("ynovo[n]");
15
subplot(212)
plot(n,y)
ylabel("y[n]");
xlabel("n");
grid()
Δω = ωr - ωp
ωc = (ωp+ωr)/2
A=-20*log10(min(δp, δr))
N = ceil(Int,(-10*log10(δp*δr)-13)/(2.324*Δω))+1
h = remez(N, [(0, ωp/2π) => (1, 1), (ωr/2π, 0.5) => (0,
δp/δr)]);
M = N-1
L = M/2
n=0:M
stem(n,h)
xlabel(L"$n$")
title("Resposta ao impulso, min-max")
ylabel(L"$h[n]$");
hf = PolynomialRatio(h,[1])
H = freqz(hf,ω)
subplot(211)
plot(ω/π,20*log10.(abs.(H)))
plot([0;ωp/π],20*log10.([1-δp;1-δp]),"r")
plot([0;ωp/π],20*log10.([1+δp;1+δp]),"r")
#plot([ωp;ωp]/π,[-65;5])
axis([0,ωc/π,-0.5,0.5])
grid()
ylabel(L"$|H(e^{j\omega})|$")
xlabel(L"$\omega/\pi$");
ylabel("Banda passante")
subplot(212)
plot(ω/π,20*log10.(abs.(H)))
plot([ωr;π]/π,20*log10.([δr;δr]),"r")
plot([ωr;ωr]/π,[-A-15,5],"r")
axis([ωc/π,1,-A-15,-A+5])
ylabel("Banda de rejeição")
#plot(ω/π,angle.(H)*180/π)
grid()
xlabel(L"$\omega/\pi$");
yminmax=filt(h,s)
x=0:1000;
subplot(211)
plot(x,yminmax)
ylabel("yminmax[n]");
grid()
subplot(212)
plot(x,y)
ylabel("y[n]");
xlabel("n");
grid()
16
7. Conclusão
Nessa experiência permitiu aprender a projetar um filtro Butterworth
desde o início e como também projetar uma função de filtragem utilizando
métodos recursivos. Foi possível verificar o resultado usando funções de
bibliotecas da própria linguagem utilizada para o projeto, sendo assim
permitirá utiliza-las em vez de fazer novamente o filtro, porem o
conhecimento obtido de como funciona o algoritmo e para que serve se
torna de suma importância para o entendimento da área de
processamento de sinais.
Além disso a comparação de resultados com um filtro FIR pelo critério de
min-max e um filtro IIR de Butterworth, conseguimos aprender a diferença
entre um filtro FIR e um filtro IIR em número de coeficientes e resultado,
quando precisamos de um filtro com frequência de passagem e de
rejeição muito próximas entre si. Já que o filtro IIR de Butterworth nesse
caso se mostrou muito mais eficiente que o filtro FIR com algoritmo de
Parks-McClellan.
17