Interfacing function
eng


RIFGEN_f

File content


//FILTER_f Scicos Temporal RIF with WFIR Impulse Response Calculation block
//Classical interface function ver1.0 - scilab-2.7
//19 novembre 2003 - IRCOM GROUP - Author : A.Layec
function [x,y,typ]=RIFGEN_f(job,arg1,arg2)
// Copyright INRIA
x=[];y=[];typ=[]
select job
case 'plot' then
  standard_draw(arg1)
case 'getinputs' then
  [x,y,typ]=standard_inputs(arg1)
case 'getoutputs' then
  [x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
  [x,y]=standard_origin(arg1)
case 'set' then
   x=arg1;
   model=arg1.model
   graphics=arg1.graphics

   exprs1=graphics.exprs(1:2)
   exprs2=graphics.exprs(3:6)
   exprs3=graphics.exprs(7:13)
   exprs4=graphics.exprs(14:19)
   exprs5=graphics.exprs(20:25)
   exprs6=graphics.exprs(26:31)

   while %t do

     [ok,typ,herit,exprs1]=getvalue('Scicos FIR Block',...
     ['Type of FIR';'Inherit (no:0, yes:1)'],list('vec',1,'vec',1),exprs1);

     if ~ok then break,end;
     //Attention il y a un bug à corriger sur le 
     //comportement de la var ok (fait!)

     if typ==1 then
       [ok2,in_sz,Nu,nb_coef,pulse,exprs2]=get_genfir(exprs2)
     elseif typ==2 then
       [ok2,in_sz,Nu,nb_coef,pulse,exprs3]=get_wfir(exprs3)
     elseif typ==3 then
       [ok2,in_sz,Nu,nb_coef,pulse,exprs4]=get_rrcfir(exprs4)
     elseif typ==4 then
       [ok2,in_sz,Nu,nb_coef,pulse,exprs5]=get_rcfir(exprs5)
     elseif typ==5 then
       [ok2,in_sz,Nu,nb_coef,pulse,exprs6]=get_gfir(exprs6)
     else
       message('Type must be in the range [1..5]');
       ok=%f;
     end

     if ok&ok2 then
      model.in=sum(in_sz);
      model.out=sum(in_sz);
      model.dstate=zeros(sum(nb_coef),1);
      model.ipar=[Nu;nb_coef(:);in_sz(:)];
      model.rpar=pulse(:);
      exprs=[exprs1(:)',exprs2(:)',exprs3(:)',exprs4(:)',exprs5(:)',exprs6(:)'];
      graphics.exprs=exprs;
      sz=model.in;
      if herit==1 then
       model.dep_ut=[%t %f];
       [model,graphics,ok]=check_io(model,graphics,[sz],[sz],[],[]);
      else
       model.dep_ut=[%t %f];
       [model,graphics,ok]=check_io(model,graphics,[sz],[sz],1,[]);
      end
      x.graphics=graphics
      if typ==1 then
       gr_i=['txt=[''FIR''];';
             'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
             'txt=''Generic'';'
             'style=5;'
             'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
             'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
             'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
             'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
             'e=gce();'
             'e.font_style=style;'
           ]
      elseif typ==2 then
       gr_i=['txt=[''FIR''];';
             'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
             'txt=''Wfir'';'
             'style=5;'
             'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
             'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
             'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
             'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
             'e=gce();'
             'e.font_style=style;'
           ]
      elseif typ==3 then
       gr_i=['txt=[''FIR''];';
             'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
             'txt=''RRCF'';'
             'style=5;'
             'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
             'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
             'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
             'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
             'e=gce();'
             'e.font_style=style;'
           ]
      elseif typ==4 then
       gr_i=['txt=[''FIR''];';
             'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
             'txt=''RCF'';'
             'style=5;'
             'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
             'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
             'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
             'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
             'e=gce();'
             'e.font_style=style;'
           ]
      elseif typ==5 then
       gr_i=['txt=[''FIR''];';
             'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
             'txt=''Gauss'';'
             'style=5;'
             'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
             'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
             'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
             'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
             'e=gce();'
             'e.font_style=style;'
           ]
      end
      graphics.gr_i=gr_i
      x.graphics=graphics
      x.model=model
     end
     break
   end
case 'define' then
  Nu=1
  typ=1
  herit=0
  nb_coef=255
  plot_rep=0
  in_sz=1

  //Generic
  pulse_gen=[1;-1;1]

  //WFIR
  filtype="bp";
  win_type="re";
  low=0.05;
  high=0.5;
  dp=0.2;
  df=0.1;
  freq_ech=2;
  [pulse,wfm,fr]=wfir(filtype,nb_coef,[low,high],win_type,[dp;df]);
  freqband=string(low)+' '+ string(high);
  dpdf=string(dp)+' '+string(df);

  //filter_tap
  fe=12
  gain=1
  r=0.35
  b=0.5

  model=scicos_model()
  model.sim=list('nfilter',4)
  model.in=Nu
  model.out=Nu
  model.evtin=1
  model.evtout=[]
  model.dstate=zeros(nb_coef*Nu,1)
  model.rpar=pulse(:)
  model.ipar=nb_coef
  model.blocktype='d'
  model.firing=[]
  model.dep_ut=[%t %f]

  exprs1=[string(typ),string(herit)] //global
  exprs2=[string('-1'),sci2exp(pulse_gen),string(in_sz),string(plot_rep)] //genfir
  exprs3=[string(nb_coef),string(freq_ech),string(filtype),string(freqband),string(win_type),string(dpdf),string(plot_rep)] //wfir
  exprs4=[sci2exp(nb_coef),string(in_sz),sci2exp(fe),sci2exp(r),sci2exp(gain),string(plot_rep)] //rrcfir
  exprs5=[sci2exp(nb_coef),string(in_sz),sci2exp(fe),sci2exp(r),sci2exp(gain),string(plot_rep)] //rcfir
  exprs6=[sci2exp(nb_coef),string(in_sz),sci2exp(fe),sci2exp(b),sci2exp(gain),string(plot_rep)] //gfir

  gr_i=['txt=[''FIR''];';
        'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');'
        'txt=''Generic'';'
        'style=5;'
        'rectstr=stringbox(txt,orig(1),orig(2),0,style,1);'
        'w=(rectstr(1,3)-rectstr(1,2))*%zoom;'
        'h=(rectstr(2,2)-rectstr(2,4))*%zoom;'
        'xstringb(orig(1)+sz(1)/2-w/2,orig(2)-h-4,txt,w,h,''fill'');'
        'e=gce();'
        'e.font_style=style;'
       ]

  exprs=[exprs1,exprs2,exprs3,exprs4,exprs5,exprs6]
  x=standard_define([2.5 2],model,exprs,gr_i)
end
endfunction

function [ok,in_sz,Nu,nb_coef,pulse,exprs]=get_wfir(exprs)
  in_sz=[];Nu=[];nb_coef=[];pulse=[];
  while %t do
    text=[
        ' WFIR Filter features. DELAY = (n-1) / 2    ';'';..
        '                  PARAMETERS';..
        'Size of the filter: filter order';..
        'Type of the filter: filter definition';..
        '                     lp - low pass';..
        '                     hp - high pass';..
        '                     bp - band pass';..
        '[low,high] freq:  2-vector of cutoff';..
        '                  frequencies (0<low,high<.5)';..
        '                  only low is used when';..
        '                  ftype=''lp'' or ''hp'' ';..
        'Type of window: filtering window';..
        '                re - rectangular tr - triangular';..
        '                hn - Hanning     hm - Hamming';..
        '                kr - Kaiser      ch - Chebychev';..
        '       NB the last two parameters are used only';..
        '          for Chebychev and Kaiser window.';'';..
        'It is defined as the convolution between';
        'the input signal and the WFIR as defined in scilab.'
        ]
    [ok,nb_coef,freq_ech,filtype,lowhigh,win_type,dpdf,plot_rep,exprs]=getvalue(text,..
       ['Size of the filter';..
        'Sampling frequency';..
        'Type of wfir filter (lp,hp,bp,sb)';..
        'Low - High frequency cutoff';..
        'Type of filtering window (re,tr,hn,hm,kr,ch)';..
        'Chebychev or Kaiser window parameters: ';..
        'Plot impulse response (0:No/Windows Id)?'
       ],..
    list("vec",[1],"vec",[1],"str",[1],"vec",[2],"str",[1],"vec",[2],"vec",[1]),exprs)
    low=lowhigh(1);high=lowhigh(2)
    dp=dpdf(1);df=dpdf(2);
    if ~ok then break,end
    if  ((filtype~="lp")&(filtype~="hp")&(filtype~="bp")&(filtype~="sb")) then
         if (exists(filtype)) then
           filtype = eval(filtype)
         end
       end
    if  ((win_type~="re")&(win_type~="tr")&(win_type~="hn")&..
        (win_type~="hm")&(win_type~="kr")&(win_type~="ch")) then
         if (exists(win_type)) then
           win_type = eval(win_type)
         end
       end
    if (nb_coef<0) then
      message('size of the filter must be positive')
    else
      if (freq_ech<=0) then
         message(' wrong sampling frequency value')
       else
         if (high<0)|(high/freq_ech>=0.5)|(low<=0)|(low>=high) then
           message('wrong filter frequency cutoff values')
         else
           if (~((filtype=="bp")|(filtype=="lp")|(filtype=="hp")|..
               (filtype=="sb"))) then
           message('wrong filter type lp, hp, bp, sb')
         else
           if (~((win_type=="re")|(win_type=="tr")|(win_type=="hn")|..
               (win_type=="hm")|(win_type=="kr")|(win_type=="ch"))) then
                message('wrong filtering window type re,tr,hn, hm, kr or ch')
           else
             if ((win_type=="kr")&(dp<0)) then
               message('wrong parameter value in Kaser window: beta>0')
             else
               if ((win_type=="ch")&((dp<=0)|(dp>=0.5)|(df<=0))) then
                 message('wrong parameter value in chebyshev window')
               else
                 if ok then
                   low=low/freq_ech
                   high=high/freq_ech
                   [pulse,wfm,fr]=wfir(filtype,nb_coef,[low,high],win_type,[dp;df])
                   if plot_rep<>0 then
                    win=xget("window")
                    xset("window",int(plot_rep))
                    xset("wdim",300,200)
                    xbasc()
                    plot2d(fr*freq_ech,wfm,3,'111',' '+filtype+' Filters feature',[0,0,high*freq_ech*2,1]);
                    graph_title=['Chosen filter transfer function';'     for '+filtype+' WFIR block']
                    x_label='Frequency';
                    y_label=['Gain values'];
                    xtitle(graph_title,x_label,y_label)
                    xset("window",win);
                   end
                   //To Be Done
                   Nu=1
                   in_sz=1
                   break
                 end
               end
             end
           end
         end
       end
     end
   end
  end
endfunction

function [ok,in_sz,Nu,nb_coef,pulse,exprs]=get_genfir(exprs)
  Nu=[];
  while %t do
   [ok,nb_coef,pulse,in_sz,plot_rep,exprs]=getvalue('Set Generic Impulse Response Vector',...
   ['Number of coefficients';...
    'Vector of impulse response';...
    'Size of input vectors'
    'Plot impulse response (0:No/Windows Id)?'],...
   list('vec',-1,'vec',-1,'vec',-1,'vec',1),exprs)
   
   if ~ok then break,end;
   
   if ok then
    //
    if size(nb_coef,'*')<>1 then
     Nu=prod(size(nb_coef))
     nb_coef=nb_coef(:)
     ptri=1
     ptrf=nb_coef(1)
    elseif nb_coef==-1 then
     Nu=1;
     nb_coef=size(pulse,'*')
     ptri=1
     ptrf=nb_coef
    else
     Nu=1;
     ptri=1
     ptrf=nb_coef
    end
    
    pulse=pulse(:);
    for j=1:Nu
     if j>1 then
     ptri=ptrf+1
     ptrf=ptri+nb_coef(j)-1
     end
     if plot_rep<>0 then
        puls=pulse(ptri:ptrf);
        win=xget("window");
        xset("window",int(plot_rep+j-1));
        xset("wdim",300,200);
        xbasc();
        plot2d3(1:nb_coef(j),puls,,"111",,rect=[0,min(puls),nb_coef(j),max(puls)]);
        xset("window",win);
     end
    end
    break;
   end
  end
endfunction

function [ok,in_sz,Nu,nb_coef,pulse,exprs]=get_rrcfir(exprs)
  Nu=[];pulse=[];
  while %t do
   [ok,nb_coef,in_sz,fe,r,gain,plot_rep,exprs]=getvalue('FIR with Root Raised Cosinus Response',...
   ['Size of the filter';...
   'Size of input vectors';...
   'Frequency Sampling';'Roll-Off Factor';'Output Gain';...
   'Plot impulse response (0:No/Windows Id)?'],...
   list('vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',1),exprs);
   
   if ~ok then break,end;
   
   if size(fe)==size(r)&size(r)==size(gain)&size(r)==size(nb_coef) then
     Nu=prod(size(r))
     r=r(:)
     gain=gain(:)
     nb_coef=nb_coef(:)
     for j=1:Nu
      if execstr('puls=filter_tap(1,nb_coef(j),fe(j),r(j),gain(j))','errcatch')<>0 then
       message('Un paramètre est incorrect')
       ok=%f
       break
      end
      if j==1 then
       ptri=1;
       ptrf=nb_coef(1);
      else
       ptri=ptrf+1;
       ptrf=ptri+nb_coef(j)-1;
      end
      pulse(1,ptri:ptrf)=puls
      if plot_rep<>0 then
       win=xget("window")
       xset("window",int(plot_rep+j-1))
       xset("wdim",300,200)
       xbasc()
       plot2d3(1:nb_coef(j),puls,,"111",,rect=[0,min(puls),nb_coef(j),max(puls)]);
       xset("window",win);
      end
     end
     if ok then 
       break;
     end
   else
     message('Frequency sampling vector,Vector Roll-Off, Vector Gain and Vector nb_coef must have the same size');
   end
  end
endfunction

function [ok,in_sz,Nu,nb_coef,pulse,exprs]=get_rcfir(exprs)
 Nu=[];pulse=[];
 while %t do
   [ok,nb_coef,in_sz,fe,r,gain,plot_rep,exprs]=getvalue('FIR with Raised Cosinus Response',...
   ['Size of the filter';...
   'Size of input vectors';...
   'Frequency Sampling';'Roll-Off Factor';'Output Gain';...
   'Plot impulse response (0:No/Windows Id)?'],...
   list('vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',1),exprs);
   
   if ~ok then break,end;
   
   if size(fe)==size(r)&size(r)==size(gain)&size(r)==size(nb_coef) then
     Nu=prod(size(r))
     r=r(:)
     gain=gain(:)
     nb_coef=nb_coef(:)
     for j=1:Nu
      if execstr('puls=filter_tap(2,nb_coef(j),fe(j),r(j),gain(j))','errcatch')<>0 then
       message('Un paramètre est incorrect')
       ok=%f
       break
      end
      if j==1 then
       ptri=1;
       ptrf=nb_coef(1);
      else
       ptri=ptrf+1;
       ptrf=ptri+nb_coef(j)-1;
      end
      pulse(1,ptri:ptrf)=puls
      if plot_rep<>0 then
       win=xget("window")
       xset("window",int(plot_rep+j-1))
       xset("wdim",300,200)
       xbasc()
       plot2d3(1:nb_coef(j),puls,,"111",,rect=[0,min(puls),nb_coef(j),max(puls)]);
       xset("window",win);
      end
     end
     if ok then 
       break;
     end
   else
     message('Frequency sampling vector,Vector Roll-Off, Vector Gain and Vector nb_coef must have the same size');
   end
  end
endfunction

function [ok,in_sz,Nu,nb_coef,pulse,exprs]=get_gfir(exprs)
 Nu=[];pulse=[];
 while %t do
   [ok,nb_coef,in_sz,fe,r,gain,plot_rep,exprs]=getvalue('FIR with Gaussian Response',...
   ['Size of the filter';...
   'Size of input vectors';...
   'Frequency Sampling';'BT Factor';'Output Gain';...
   'Plot impulse response (0:No/Windows Id)?'],...
   list('vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',-1,'vec',1),exprs);

   if ~ok then break,end;

   if size(fe)==size(r)&size(r)==size(gain)&size(r)==size(nb_coef) then
     Nu=prod(size(r))
     r=r(:)
     gain=gain(:)
     nb_coef=nb_coef(:)
     for j=1:Nu
      if execstr('puls=filter_tap(3,nb_coef(j),fe(j),r(j),gain(j))','errcatch')<>0 then
       message('Un paramètre est incorrect')
       ok=%f
       break
      end
      if j==1 then
       ptri=1;
       ptrf=nb_coef(1);
      else
       ptri=ptrf+1;
       ptrf=ptri+nb_coef(j)-1;
      end
      pulse(1,ptri:ptrf)=puls
      if plot_rep<>0 then
       win=xget("window")
       xset("window",int(plot_rep+j-1))
       xset("wdim",300,200)
       xbasc()
       plot2d3(1:nb_coef(j),puls,,"111",,rect=[0,min(puls),nb_coef(j),max(puls)]);
       xset("window",win);
      end
     end
     if ok then 
       break;
     end
   else
     message('Frequency sampling vector,Vector Roll-Off, Vector Gain and Vector nb_coef must have the same size');
   end
  end
endfunction