summaryrefslogtreecommitdiff
path: root/macros/iqimbal2coef.sci
blob: 2116ca816ee933f57d0a9186688fd82697f24545 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function Comp_Coef = iqimbal2coef(Amp_Imb_dB, Ph_Imb_Deg)
//   This function returns the I/Q imbalance compensator coefficient for given amplitude and phase imbalance.

//   Calling Sequence
//   COMP_COEF = IQIMBAL2COEF(AMP_IMB_DB, PH_IMB_DEG)

//   Description
//   COMP_COEF = IQIMBAL2COEF(AMP_IMB_DB, PH_IMB_DEG) returns the I/Q imbalance 
//   compensator coefficient for given amplitude and phase imbalance.
//   Comp_Coef is a scalar or a vector of complex numbers.
//   AMP_IMB_DB and PH_IMB_DEG are the amplitude imbalance in dB
//   and the phase imbalance in degrees and should be of same size.

//   Examples
//   [a_imb_db,ph_imb_deg] = iqcoef2imbal([4 2 complex(-0.1145,0.1297) complex(-0.0013,0.0029)])
//   disp(a_imb_db,'amplitude imbalance in dB =')
//   disp(ph_imb_deg,'phase imbalance in degrees=')
//   Comp_Coef = iqimbal2coef(a_imb_db, ph_imb_deg)
//   disp(Comp_Coef,'Compensator Coefficients=')

//   Bibliography
//   http://in.mathworks.com/help/comm/ref/iqimbal2coef.html

//   See also
//   iqcoef2imbal

//   Authors
//   Pola Lakshmi Priyanka, IIT Bombay//

//*************************************************************************************************************************************//

//Input argument check
[out_a,inp_a]=argn(0);

if (inp_a > 2) | (out_a > 1) then
    error('comm:iqimbal2coef: Invalid number of arguments')
end

if ( or(Comp_Coef==%nan) | or(Comp_Coef==%inf))
      error('comm:iqimbal2coef: Input arguments should be finte')
end

if ( size(Amp_Imb_dB) ~= size(Ph_Imb_Deg) ) then\
      error('comm:iqimbal2coef: Input arguments should be of same size')
end

Comp_Coef = complex(zeros(size(Amp_Imb_dB)));

for i = 1:length(Amp_Imb_dB)

    Igain = 10^(0.5*Amp_Imb_dB(i)/20);
    Qgain = 10^(-0.5*Amp_Imb_dB(i)/20);
    angle_i = -0.5*Ph_Imb_Deg(i)*%pi/180;
    angle_q = %pi/2 + 0.5*Ph_Imb_Deg(i)*%pi/180;
    K = [Igain*cos(angle_i) Qgain*cos(angle_q); ...
         Igain*sin(angle_i) Qgain*sin(angle_q)];

    R = inv(K);

    w1r = (R(1,1)+R(2,2))/2;
    w1i = (R(2,1)-R(1,2))/2;
    w2r = (R(1,1)-R(2,2))/2;
    w2i = (R(2,1)+R(1,2))/2;
    w1 = w1r + complex(0,1) * w1i;
    w2 = w2r + complex(0,1) * w2i;

    Comp_Coef(i) = w2/w1;
end