%--------------B-format dekoder (Semestralni prace)------------------------
% 19.11.2008
% verze 3
%
% !!zadavani dat: 
% 
% [vyst. signaly]=dekoder(W,X,Y,Z,'druh surroundu','UHJ',pocet kanalu UHJ)
% 
% *pro konverzi do UHJ napiste do 6. vstup. parametru: 'UHJ'
% *pocet kanalu UHJ napiste do 7. vstup. parametru. UHJ podporuje 2,3 a 4 kanaly 
% *Varianty druhu surroundu:
%         
%         pro UHJ:
%             'mono' - mono     
%             'stereo' - stereo
%             'regPoly' - pravidelny polygon
%             'regPoly3D' - pravidelny polygon 3D (Periphonie)
%             'rectangular' - obdelnik
%         
%         pro klasicke W,X,Y,Z:    
%             
%             'mono' - mono
%             'stereoXY' - koincidencni stereo
%             'stereoMS' - Mid-side stereo
%             'stereoS' - super stereo
%             'rectangular3D' - kvadr
%             'rectangular' - obdelnik
%             'ITU51' - doporuceni ITU 5.1
%             'birectangle' - vzajemne kolme obdelniky (vertikalni X horizontalni)
%             'octahedron' - octahedron
%             'tetrahedron' - tetrahedron
%             'regPoly' - pravidelny polygon
%             'regPoly3D' - pravidelny polygon 3D (Periphonie)
% 
% napr:
% [s1 s2 s3 s4]=dekoder(W,X,Y,Z,'rectangular','UHJ',2)
%--------------------------------------------------------------------------

function [varargout]=dekoder(W,X,Y,Z,druh,varargin)

% prirazeni volitelnych vstupnich parametru promennym
[r,s]=size(varargin);

if (s==3) && (ischar(varargin{1})==1)
        UHJ = varargin{1};
        pocetKanalu = varargin{2};
        fc=varargin{3};
elseif (s==4) && (ischar(varargin{1})==1)
        UHJ = varargin{1};
        pocetKanalu = varargin{2};
        fc=varargin{3};
        fiEps = varargin{4};
elseif (s==1) && (ischar(varargin{1})==0)
        UHJ = 0;
        fc=varargin{1};
elseif (s==2) && (ischar(varargin{1})==0)
        UHJ = 0;
        fc=varargin{1};
        fiEps = varargin{2};
elseif (s==3) && (ischar(varargin{1})==0)  
        UHJ = 0;
        fc=varargin{1};
        fi = varargin{2};
        eps = varargin{3};
else
    UHJ = 0;
    pocetKanalu = 0;
end

% zjisteni poctu vystupu
 n = nargout;

% fi je uhel mezi dvema prednimi reproduktory ve stupnich
% eps je elevacni uhel mezi dvema prednimi reproduktory ve stupnich

% volba kodovani do UHJ
if strcmp(UHJ,'UHJ')
    
%  kodovani do UHJ
    SUMA = 0.9397*W + 0.1856*X;
    DELTA = i*(-0.3420*W + 0.5099*X)+ 0.6555*Y;
    T = i*(-0.1432*W + 0.6512*X)- 0.7071*Y;
    Q = 0.9772*Z;

%  vyber poctu kanalu UHJ   
    if pocetKanalu == 2
        
          [WF,XF,YF]=BHJ(SUMA,DELTA,fc);
          
    elseif pocetKanalu == 3
        
          [WF,XF,YF]=THJ(SUMA,DELTA,T,fc);  
          
    elseif pocetKanalu == 4
        
          [WF,XF,YF,ZF]=PHJ(SUMA,DELTA,T,Q,fc); 
          
    else 
        
          disp('V tomto počtu kanálů není UHJ definováno. Zkontrolujte, zda jste správně zadali vstupní parametry.')
          
    end

%   vyber druhu surroundu pro signaly zakodovane do UHJ
    
        switch (druh)
        
            case('mono')
                [varargout{1}]=monoUHJ(SUMA);
            
            case('stereo')
                [varargout{1:n}]=stereoUHJ(SUMA,DELTA);
            
            case('regPoly')
                [varargout{1:n}]=regPolUHJ(WF,XF,YF);    
                
            case('regPoly3D')
                [varargout{1:n}]=regPol3DUHJ(WF,XF,YF,ZF,fiEps); 
                
            case('rectangular')
                [varargout{1:n}]=rectanUHJ(WF,XF,YF,fiEps);    
                
            otherwise
                disp('Tento druh dekonverze není podporován. Možná jste jen špatně zadali vstupní parametry.');
                
        end
    
else
%     vyber druhu surroundu bez kodovani UHJ

    switch (druh)
        
        case('mono')
            [varargout{1}]=monoW(W);
            
        case('stereoS')
            [varargout{1:n}]=stereoS(W,X,Y); 
            
        case('stereoXY')
            [varargout{1:n}]=stereoXY(X,Y);  
        
        case('stereoMS')
            [varargout{1:n}]=stereoMS(W,X,Y);
            
        case('rectangular3D')
            [varargout{1:n}]=rect3D(W,X,Y,Z,fc,fi,eps);
            
        case('rectangular')
            [varargout{1:n}]=rectan(W,X,Y,fc,fiEps);  
            
        case('ITU51')
            [varargout{1:n}]=ITU51(W,X,Y);  
            
        case('birectangle')
            [varargout{1:n}]=birectangle(W,X,Y,Z,fc,fiEps);    
      
        case('octahedron')
            [varargout{1:n}]=octahedron(W,X,Y,Z,fc,fiEps);    
    
        case('tetrahedron')
            [varargout{1:n}]=tetrahedron(W,X,Y,Z,fc);
            
        case('regPoly')
            [varargout{1:n}]=regPol(W,X,Y,fc);
            
        case('regPoly3D')
            [varargout{1:n}]=regPol3D(W,X,Y,Z,fc,fiEps);    
            
        otherwise
                disp('Tento druh dekonverze není podporován. Možná jste jen špatně zadali vstupní parametry.');    
               
    end 
end
            
    
    
   
    