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();");
------------------------------------------------------------
Eita que a interface esta bonita em professor. :)
ResponderExcluirEita que a interface esta bonita em professor. :)
ResponderExcluirEu estou no blogg?
ResponderExcluir