quarta-feira, 16 de outubro de 2013

Projetando filtros FIR - programa (script) Scilab

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();");
------------------------------------------------------------

3 comentários: