|
Janela principal. Dados básicos para o projeto do filtro. |
|
Filtro passa-faixa usando janela retangular. |
|
Mesmo parâmetro do filtro passa-faixa, mas usando a janela de Hamming. |
Esta postagem é para quem já tem um bom conhecimento tanto em Scilab
quanto em projeto de filtros digitais. Mas você se tiver coragem, siga
em frente! No código (
script) foi criada uma janela de controles onde o
projetista altera os parâmetros básicos do filtro digital. Existem
várias possibilidades de melhoria do programa: apresentar uma tabela com
os coeficientes calculados, gráfico de ganho em
dB, por exemplo. Um outro desafio ainda maior é jogar fora a função
wfir() e criar a sua própria versão de projeto de filtros FIR. Um detalhe: aqui não estamos usando um gabarito para o cálculo da ordem do fitro ou de outros parâmetros de projeto.
Código Scilab:
--------------------------------------------
//[h,hm,fr]=wfir("lp",33,[.2 0],"hm",[0 0])
function calcular()
// tipo de filtro:
popc = findobj("Tag", "lista_mod");
t_filtro = get(popc, "Value");
//disp(t_filtro);
select t_filtro
case 1 then tf = "lp";
case 2 then tf = "hp";
case 3 then tf = "bp";
case 4 then tf = "sb";
end;
// tipo de jan:
tj = 're';
popc = findobj("Tag", "lista_jan");
t_jan = get(popc, "Value");
//disp(t_filtro);
select t_jan
case 1 then tj = "re";
case 2 then tj = "tr";
case 3 then tj = "hm";
case 4 then tj = "hn";
end;
// ordem do filtro:
popc = findobj("Tag", "Nfilt");
n_ordem = evstr(get(popc,'string'));
//a ordem do filtro tem que ser ímpar para filtro passa-faixa ou rejeita faixa;
if round(n_ordem/2) == (n_ordem/2) then
n_ordem = n_ordem + 1;
end
// freq. 1:
popc = findobj("Tag", "ww1"); w1 = evstr(get(popc,'string'));
// freq. 2:
popc = findobj("Tag", "ww2"); w2 = evstr(get(popc,'string'));
// Filtro:
[h,hm,fr]=wfir(tf,n_ordem,[w1 w2],tj,[0 0]);
// Gráficos:
hg = figure();
hg.figure_name = "Projeto de filtros usando janelas. Prof. Fco. José";
xaltura = 450; xlargura = 600;
hg.position = [15 7 xlargura xaltura];
hg.info_message = 'Dr. Francisco Aquino, PPGET.'
subplot(2,1,1); plot(h,'-o'); xgrid;
subplot(2,1,2); plot(fr,abs(hm)); xgrid;
// simulacao - transmitindo o sinal:
buttonf = uicontrol(hg, "Position", [xlargura-80 xaltura-22 75 20], ...
"Style", "pushbutton", "FontWeight", "bold", "FontSize", 12, ...
"String", "Fechar !", "Foregroundcolor",[0.9 0.1 0.1], "callback", "close();");
endfunction
close;
clc;
f1 = figure();
f1.figure_name = "Projeto de filtros usando janelas. Prof. Fco. José";
altura = 130;
largura = 600;
f1.position = [10 5 largura altura];
f1.info_message = 'Dr. Francisco Aquino, PPGET.'
//f1.figure_size = [largura altura];
////// controles:
text_00 = uicontrol(f1, "Position", [20 altura-60 80 20], ...
"Style", "text", "FontSize", 11, "String", "Tipo de filtro:", ...
"BackgroundColor", [1 0.5 0.5]);
// Listbox usado para tipo de filtro
tfiltro = strcat([gettext("Passa baixa") gettext("Passa alta") ...
gettext("Passa Faixa") gettext("Rejeita Faixa")], "|");
lista_mod = uicontrol(f1, "Position", [20 altura-90 80 20], ...
"Style", "popupmenu", "FontSize", 11, ...
"String", tfiltro, "BackgroundColor", [1 1 1], ...
"Tag", "lista_mod");
////// controles:
text_01 = uicontrol(f1, "Position", [110 altura-60 80 20], ...
"Style", "text", "FontSize", 11, "String", "Ordem do filtro:", ...
"BackgroundColor", [1 0.5 0.5]);
// Ordem do filtro:
Nfilt = uicontrol(f1, "Position", [110 altura-90 80 20], ...
"Style", "edit", "FontSize", 11, "String", gettext("21"), ...
"BackgroundColor", [1 1 1], "Tag", "Nfilt");
// frequencias:
t1 = "0 < w1 < w2:";
text_02 = uicontrol(f1, "Position", [200 altura-60 80 20], ...
"Style", "text", "FontSize", 11, "String", t1, ...
"BackgroundColor", [1 0.5 0.5]);
// Freq. w1:
ww1 = uicontrol(f1, "Position", [200 altura-90 80 20], ...
"Style", "edit", "FontSize", 11, "String", gettext("0.2"), ...
"BackgroundColor", [1 1 1], "Tag", "ww1");
// frequencias:
t2 = "w1 < w2 < 0.5:";
text_03 = uicontrol(f1, "Position", [290 altura-60 80 20], ...
"Style", "text", "FontSize", 11, "String", t2, ...
"BackgroundColor", [1 0.5 0.5]);
// Freq. w2:
ww2 = uicontrol(f1, "Position", [290 altura-90 80 20], ...
"Style", "edit", "FontSize", 11, "String", gettext("0.4"), ...
"BackgroundColor", [1 1 1], "Tag", "ww2");
////// tipo de janela:
text_tp = uicontrol(f1, "Position", [380 altura-60 80 20], ...
"Style", "text", "FontSize", 11, "String", "Tipo de janela:", ...
"BackgroundColor", [1 0.5 0.5]);
// Listbox usado para tipo de janela
tjan = strcat([gettext("retangular") gettext("Trapezoidal") ...
gettext("Hamming") gettext("Hanning")], "|");
lista_jan = uicontrol(f1, "Position", [380 altura-90 80 20], ...
"Style", "popupmenu", "FontSize", 11, ...
"String", tjan, "BackgroundColor", [1 1 1], ...
"Tag", "lista_jan");
// Calculando o filtro!
button01 = uicontrol(f1, "Position", [470 altura-60 80 20], ...
"Style", "pushbutton", "FontWeight", "bold", "FontSize", 12, ...
"String", "Calcular!", "Foregroundcolor",[0.1 0.1 1], "callback", "calcular();");
------------------------------------------------------------