domingo, 11 de março de 2012

Scilab: criando uma janela com controles.

Exemplo de uma Janela com Controles no Scilab.
No Scilab (home aqui) é possível se criar uma janela com diversos tipos de controles (botões, caixa de texto, etc.) que pode deixar o seu programa com uma aparência bem mais profissional, além de permitir que se refaça a simulação várias vezes alterando-se os parâmetro facilmente.

O código fonte abaixo foi usado para gerar a janela do início desta postagem. Se você nunca estudou ou usou o Scilab nem tente entender o código.

*******************************************
*********************************
*********************


function ajuda();
    messagebox(['Exemplo de Janela com controles. ';
    'Versão: 0000.510/22.02.2012';
    ' ';
    'Prof. Dr. Francisco J. A. de Aquino';
    'IFCE - Campus Fortaleza';
    'Contato: fcoalves_aq@ifce.edu.br';],"modal");
endfunction

// funcao M_QAM
// entrada: bits e M (modulacao)
// saida: simbolos
function s=m_qam(bts, M);
    j = %i;
    p = 1;
    ps = 1;
    v = [1+j, 1-j, -1+j, -1-j, 3+j, 3-j, -3+j, -3-j, 1+3*j, 1-3*j, -1+3*j, -1-3*j, 3+3*j, 3-3*j, -3+3*j, -3-3*j];
    n = max(size(bts)); // bits de entrada
    m = log2(M);  // indice de modulacao
    ts = round(n/m);
    s = zeros(ts,1);
    vbb = s;
    while p<(n-2)
        bb=0;
        for k=0:(m-1)
            bb = bb+bts(p+k)*2^k;
        end
        bb=bb+1;
        s(ps)=v(bb);
        vbb(ps)=bb;
        ps=ps+1;
        p=p+m;
    end
endfunction

function s=m_psk(bts, M);
    j = %i;
    p = 1;
    ps = 1;
    dteta = %pi/M;
    n = max(size(bts)); // bits de entrada
    m = log2(M);  // indice de modulacao
    ts = round(n/m);
    s = zeros(ts,1);
    vbb = s;
    while p<(n-m)
        bb=0;
        for k=0:(m-1)
            bb = bb+bts(p+k)*2^k;
        end
        s(ps)=cos(2*bb*%pi/M)+j*sin(2*bb*%pi/M);
        vbb(ps)=bb;
        ps=ps+1;
        p=p+m;
    end
endfunction

function s=m_ask(bts, M);
    j = %i;
    p = 1;
    ps = 1;
    dm = (M-1)/2;
    n = max(size(bts)); // bits de entrada
    m = log2(M);  // indice de modulacao
    ts = round(n/m);
    s = zeros(ts,1);
//    disp('ok ate aqui');
    vbb = s;
    while p<(n-2)
        bb=0;
        for k=0:(m-1)
            bb = bb+bts(p+k)*2^k;
        end
        //bb=bb+1;
        //disp(bb)
        s(ps)=2*(bb-dm);
        vbb(ps)=bb;
        ps=ps+1;
        p=p+m;
        //disp(p)
    end
    //disp(vbb')
    //s = s + 0.01*(rand(ts,1,'normal')+j*(rand(ts,1,'normal')));
endfunction

// Começando a simulação:
function grafico();

// Indice M de modulação:
pop1 = findobj("Tag", "lista_indice");
indc = get(pop1, "String");
sel_indc = get(pop1, "Value");
disp(sel_indc);

msg01 = msprintf(gettext("Você selecionou ''%s''."), indc(sel_indc));
M = 4;
select sel_indc
  case 1 then M = 4;
  case 2 then M = 8;
  case 3 then M = 16;
end
     
// Tipo de modulação:
pop2 = findobj("Tag", "lista_mod");
modc = get(pop2, "String");
sel_modc = get(pop2, "Value");

msg02 = msprintf(gettext("Você selecionou ''%s''."), modc(sel_modc));
messagebox(msg01, msg02, gettext("Popupmenu selection"), "info", "modal");

i_mod = sel_modc;  // ASK = 1, PSK = 2, QAM = 3;
vb = sign(rand(1,3000,'normal')) + 1;
vb = vb/2;

select i_mod
  case 1 then s1 = m_ask(vb,M);
  case 2 then s1 = m_psk(vb,M);
  case 3 then s1 = m_qam(vb,M);
end

fs1 = max(size(s1)) - 3;
s1 = s1(1:fs1);

// ruido:
sel_ruido = get(lista_ruido, "Value");
AA = 0.1*(sel_ruido-1)*(sel_ruido-1);
sn = AA*(rand(1,fs1,'normal')+ %i*rand(1,fs1,'normal'));

s1 = s1 + sn';

// mostrando gráfico:
subplot(2,2,3); plot(real(s1),imag(s1),'.'); xgrid;
endfunction

////////////// Programa-Janela Principal
clc;
close; close; close;

// Janale Principal:
f1 = figure();
// Remove Scilab 'standard' menus
delmenu(f1.figure_id, gettext("Arquivo"));
delmenu(f1.figure_id, gettext("&Tools"));
delmenu(f1.figure_id, gettext("Editar"));
delmenu(f1.figure_id, gettext("?"));
// Disable graphics toolbar
toolbar(f1.figure_id, "off");
// Adjust figure size after toolbar removing
altura = 400;
largura = 500;
f1.position = [50 50 largura altura];
f1.figure_name = "Janela com controles";
f1.auto_resize = "off"

// simulacao - gerando o gráfico:
button01 = uicontrol(f1, "Position", [largura-80 altura-30 75 20], ...
    "Style", "pushbutton", "FontSize", 11, ...
    "String", "Gráfico!", "callback", "grafico()");

// Indica texto:
text_00 = uicontrol(f1, "Position", [20 altura-30 70 20], ...
    "Style", "text", "FontSize", 11, "String", "Caixa de texto:", ...
    "BackgroundColor", [1 0.5 0.5]);
 
// texto a ser transmitido:
Ltxt = 300;  // largura da caixa de texto.
ttx= ['Fim do texto. '];
edit01 = uicontrol(f1, "Position", [100 altura-30 Ltxt 20], ...
    "Style", "edit", "FontSize", 11, "String", ttx, ...
    "BackgroundColor", [1 1 1]);
    

// dados do modulador:
text_mod = uicontrol(f1, "Position", [20 altura-90 70 20], ...
    "Style", "text", "FontSize", 11, "String", ". Modulação:", ...
    "BackgroundColor", [1 1 1]);
    
// Listbox used to tipo de modulacao
modula = strcat([gettext("ASK") gettext("PSK") gettext("QAM") gettext("BPSK")], "|");
lista_mod = uicontrol(f1, "Position", [100 altura-90 60 20], ...
    "Style", "popupmenu", "FontSize", 11, ...
    "String",  modula, "BackgroundColor", [1 1 1], ...
    "Tag", "lista_mod");       

// Listbox - popmenu - indice de modulacao
indice = strcat([gettext("M=4") gettext("M=8") gettext("M=16")], "|");
lista_indice = uicontrol(f1, "Position", [170 altura-90 60 20], ...
    "Style", "popupmenu", "FontSize", 11, ...
    "String",  indice, "BackgroundColor", [1 1 1], ...
    "Tag", "lista_indice");       

// Indica texto:
text_rr = uicontrol(f1, "Position", [20 altura-120 70 20], ...
    "Style", "text", "FontSize", 11, "String", "Nivel de ruido:", ...
    "BackgroundColor", [1 0.5 0.5]);
    
// Listbox - popmenu - indice de ruido
indice_r = strcat([gettext("Sem ruido") gettext("Pouco ruido") gettext("Muito ruido")], "|");
lista_ruido = uicontrol(f1, "Position", [100 altura-120 90 20], ...
    "Style", "popupmenu", "FontSize", 11, ...
    "String",  indice_r, "BackgroundColor", [1 1 1], ...
    "Tag", "lista_ruido");  
    
// Ajuda 
ajuda_button = uicontrol(f1, "Position", [largura-110 28 80 20], ...
    "Style", "pushbutton", "String", gettext("Ajuda?"), ...
    "FontWeight", "bold", "FontSize", 11, "Callback", "ajuda()");

// Botao de saida
quit_button = uicontrol(f1, "Position", [largura-130 5 120 20], ...
    "Style", "pushbutton", "String", gettext("Fechar janela!"), ...
    "FontWeight", "bold", "FontSize", 11, "Callback", "close();");

subplot(2,2,3);

Nenhum comentário:

Postar um comentário