top of page

exercise 10.16

ZIP with MATLAB scripts and note:

Small tag OK.jpg

 exercise 10.16 note:

Small tag OK.jpg
pozar_10_exercise_16_question.jpg
001.jpg

The question imposes sign(a1)==-sign(a3) to be true.

 

 

1.- IP1dB(IP3) with single-tone input :

003.jpg

syms w1 V0 a1 a2 a3    

       

y1=a1*V0*cos(w1) + ...

      a2*V0^2*(cos(w1))^2 + ...

      a3*V0^3*(cos(w1))^3

 

y2=combine(expand(y1),'sincos')

[POZAR] 10.47 (not (10.44) as referred in solutions manual [1] ) Vip3=(4/3*abs(a1/a3))^.5

syms Vip

 

Z0=1;

 

P3f1=1/(2*Z0)*(3/4*a3*V0^3)^2

 

Pf1=1/(2*Z0)*(a1*V0)^2

 

% input voltage amplitude that'd cause IP3 is Vip

 

eq1=(3/4*a3*Vip^3)^2==(a1*Vip)^2

 

 

Vip3=solve(eq1,Vip)

 

Vip3([1 2])=[];   % trivial out

 

 

 

 

 

Vip3(1)==Vip3(4)

 

Vip3(2)==Vip3(3)

 

% since Vip is amplitude and signs apart all ~0 values are equal

 

Vip3=Vip3(4)

 

% checking Vip=(4/3*a1/a3)^.5

a1=1;a3=1;

subs(Vip3,a1,1);

subs(Vip3,a3,1);

 

round(eval(Vip3),5)==round((4/3)^.5,5)

 

 

 

 

y2 =

(V0^2*a2)/2 + (3*V0^3*a3*cos(w1))/4 + (V0^2*a2*cos(2*w1))/2 + (V0^3*a3*cos(3*w1))/4 + V0*a1*cos(w1)

 

 

 

P3f1 =

(9*V0^6*a3^2)/32

Pf1 =

(V0^2*a1^2)/2

 

 

eq1 =

(9*Vip^6*a3^2)/16 == Vip^2*a1^2

 

Vip3 =

                                 0

                                 0

 -(8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  (8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  -(8*((3*a1*a3)/16)^(1/2))/(3*a3)

   (8*((3*a1*a3)/16)^(1/2))/(3*a3)

 

 =

-(8*(-(3*a1*a3)/16)^(1/2))/(3*a3) == (8*((3*a1*a3)/16)^(1/2))/(3*a3)

 =

(8*(-(3*a1*a3)/16)^(1/2))/(3*a3) == -(8*((3*a1*a3)/16)^(1/2))/(3*a3)

 

 

Vip3 =

(8*((3*a1*a3)/16)^(1/2))/(3*a3)

 

 

 =

  logical

1

Vip3 : input fundamental amplitude that would cause IP3

syms Vip a1 a3

 

Z0=1;

 

% output power on fundamental from input f1

Pf1=1/(2*Z0)*(a1*V0)^2

 

 

% output power on fundamental from spur 3*f1

P3f1=1/(2*Z0)*(3/4*a3*V0^3)^2

 

 

eq1=(3/4*a3*Vip^3)^2==(a1*Vip)^2

Vip3=solve(eq1,Vip)

 

% trivial and complex out

Vip3([1 2])=[]

 

% since Vip is amplitude and signs apart all ~0 values are equal

 

Vip3=Vip3(4)

 

% checking Vip=(4/3*a1/a3)^.5

Vip3_check=Vip3

a1=1;a3=1;

subs(Vip3_check,a1,1);

subs(Vip3_check,a3,1);

 

round(eval(Vip3_check),5)==round((4/3)^.5,5)

 

 

 

 

Pf1 =

(V0^2*a1^2)/2

 

P3f1 =

(9*V0^6*a3^2)/32

 

eq1 =

(9*Vip^6*a3^2)/16 == Vip^2*a1^2

 

Vip3 =

                                 0

                                 0

 -(8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  (8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  -(8*((3*a1*a3)/16)^(1/2))/(3*a3)

   (8*((3*a1*a3)/16)^(1/2))/(3*a3)

Vip3 =

 -(8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  (8*(-(3*a1*a3)/16)^(1/2))/(3*a3)

  -(8*((3*a1*a3)/16)^(1/2))/(3*a3)

   (8*((3*a1*a3)/16)^(1/2))/(3*a3)

Vip3 =

(8*((3*a1*a3)/16)^(1/2))/(3*a3)

Vip3_check =

(8*((3*a1*a3)/16)^(1/2))/(3*a3)

 

 =

  logical

   1

V1dB with 1 input tone

syms a1 a3 V0

 

eq2=(a1-3/4*a3*V0^2)-10^(-1/20)*a1==0

V1dB=solve(eq2,V0)

 

V1dB=V1dB(1)

 

% again check that when output 1dB compression then

% V01dBcomp=((1-10^(-1/20))*4/3)^.5*(a1/a3)^.5

 

V1dB_check=V1dB

a1=1;a3=1

 

subs(V1dB_check,a1,1);

subs(V1dB_check,a3,1);

 

round(eval(V1dB_check),5)          % obtained

 

((1-10^(-1/20))*4/3)^.5   % solutions manual

 

 

 

eq2 =

(979524468995509*a1)/9007199254740992 - (3*V0^2*a3)/4 == 0

V1dB =

 -(6^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

  (6^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

 

V1dB =

-(6^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

 

V1dB_check =

-(6^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

a3 =

     1

 

 

=

  -0.380790000000000

 =

   0.380787012849711

So the solutions manual rounds 5th decimal, but it's the same result.

 

 

 

ratio IIP1dB/IIP3

ratio_IIP1dB_IIP3=V1dB/Vip3

 

% using command simplify in default mode doesn't

% detect a1^(1/2)*a3^(1/2)/(a1*a3)^(1/2)=1

 

simplify(ratio_IIP1dB_IIP3)

 

% but with IgnoreAnaliticConstraints=true then it works ok

 

10*log10((double(simplify(ratio_IIP1dB_IIP3, ...

'IgnoreAnalyticConstraints',true)))^2)   % [dB]

ratio_IIP1dB_IIP3 =

-(6^(1/2)*979524468995509^(1/2)*a1^(1/2)*a3^(1/2))/(536870912*((3*a1*a3)/16)^(1/2))

 

 

 

=

-(1959048937991018^(1/2)*a1^(1/2)*a3^(1/2))/(134217728*(a1*a3)^(1/2))

 

 

=

  -9.635744808383029

This is the known ratio between 1dB input power and IIP3, allowing skipping IP3 direct measurements, calculating IP3 values from 1dB compression measurements.

 

 

2.- IP1dB(IP3) with double-tone input:

010.jpg

syms w1 w2 y V0

syms a1 a2 a3

y=a1*V0*(cos(w1)+cos(w2))+ ...

a2*V0^2*(cos(w1)+cos(w2))^2+ ...

a3*V0^3*(cos(w1)+cos(w2))^3

 

y2=combine(expand(y),'sincos')

 

 

 

syms w1 w2 y V0

syms a1 a2 a3

y=a1*V0*(cos(w1)+cos(w2))+ ...

a2*V0^2*(cos(w1)+cos(w2))^2+ ...

a3*V0^3*(cos(w1)+cos(w2))^3

 

y2=combine(expand(y),'sincos')

 

 

 

 

 

 

 

 

% output power on fundamental frequency f1 [Hz]

Pf1=.5*(a1*V0+9/4*a3*V0^3)^2

 

% output power on nearest spur to fundamental

P2f1_f2=3/4*a3*V0^3   

% or P2f2_f1 whichever closer to f1

Vip3 with 2 input tones

clear Vip a1 a3

syms a1 a3 Vip_2t

 

eq5=(9/4*a3*Vip_2t^3)^2==(a1*Vip_2t)^2

Vip3_2t=solve(eq5,Vip_2t)

 

 

 

 

 

 

 

 

 

 

 

 

% trivial out

Vip3_2t([1 2])=[]

 

 

Vip3_2t=Vip3_2t(4)

 

% check, same as done above

Vip3_2t_check=Vip3_2t

a1=1;a3=1;

subs(Vip3_2t_check,a1,1);

subs(Vip3_2t_check,a3,1);

 

eval(Vip3_2t_check)

 

% now Vip3_2t=2/3*(a1/a3)^.5

 

 

 

 

 

y2 =

V0^2*a2 + V0^2*a2*cos(w1 + w2) + (9*V0^3*a3*cos(w1))/4 + (9*V0^3*a3*cos(w2))/4 + V0^2*a2*cos(w1 - w2) + (3*V0^3*a3*cos(w1 - 2*w2))/4 + (3*V0^3*a3*cos(w1 + 2*w2))/4 + (3*V0^3*a3*cos(2*w1 + w2))/4 + (V0^2*a2*cos(2*w1))/2 + (V0^2*a2*cos(2*w2))/2 + (V0^3*a3*cos(3*w1))/4 + (V0^3*a3*cos(3*w2))/4 + (3*V0^3*a3*cos(2*w1 - w2))/4 + V0*a1*cos(w1) + V0*a1*cos(w2)

y =

V0*a1*(cos(w1) + cos(w2)) + V0^2*a2*(cos(w1) + cos(w2))^2 + V0^3*a3*(cos(w1) + cos(w2))^3

 

y2 =

V0^2*a2 + V0^2*a2*cos(w1 + w2) + (9*V0^3*a3*cos(w1))/4 + (9*V0^3*a3*cos(w2))/4 + V0^2*a2*cos(w1 - w2) + (3*V0^3*a3*cos(w1 - 2*w2))/4 + (3*V0^3*a3*cos(w1 + 2*w2))/4 + (3*V0^3*a3*cos(2*w1 + w2))/4 + (V0^2*a2*cos(2*w1))/2 + (V0^2*a2*cos(2*w2))/2 + (V0^3*a3*cos(3*w1))/4 + (V0^3*a3*cos(3*w2))/4 + (3*V0^3*a3*cos(2*w1 - w2))/4 + V0*a1*cos(w1) + V0*a1*cos(w2)

 

Pf1 =

((9*a3*V0^3)/4 + a1*V0)^2/2

 

P2f1_f2 =

(3*V0^3*a3)/4

 

 

eq5 =(81*Vip_2t^6*a3^2)/16 == Vip_2t^2*a1^2

Vip3_2t =

                                 0

                                 0

 -(8*(-(9*a1*a3)/16)^(1/2))/(9*a3)

  (8*(-(9*a1*a3)/16)^(1/2))/(9*a3)

  -(8*((9*a1*a3)/16)^(1/2))/(9*a3)

   (8*((9*a1*a3)/16)^(1/2))/(9*a3)

 

ip3_2t =

 -(8*(-(9*a1*a3)/16)^(1/2))/(9*a3)

  (8*(-(9*a1*a3)/16)^(1/2))/(9*a3)

  -(8*((9*a1*a3)/16)^(1/2))/(9*a3)

   (8*((9*a1*a3)/16)^(1/2))/(9*a3)

 

Vip3_2t =

(8*((9*a1*a3)/16)^(1/2))/(9*a3)

 

Vip3_2t_check =

(8*((9*a1*a3)/16)^(1/2))/(9*a3)

 

 

 

 

 

 =

  0.666666666666667

V1dB with 2 input tones

syms a1 a3 V0

 

eq6=(a1-9/4*a3*V0^2)-10^(-1/20)*a1==0

 

V1dB_2t=solve(eq6,V0)

 

V1dB_2t =V1dB_2t(2)

 

% again check that when output 1dB

% compression (1-10^(-1/20))^.5

 

V1dB_2t_check=V1dB_2t

a1=1;a3=1

 

subs(V1dB_2t_check,a1,1);

subs(V1dB_2t_check,a3,1);

 

eval(V1dB_2t_check)

 

 

 

(979524468995509*a1)/9007199254740992 - (9*V0^2*a3)/4 == 0

 

V1dB_2t =

 -(2^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

  (2^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

 

V1dB_2t =

(2^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

 

V1dB_2t_check =

(2^(1/2)*979524468995509^(1/2)*a1^(1/2))/(201326592*a3^(1/2))

 

 

 

 

 

 

=

   0.219847484372694

IIP1dB/IIP3 2 input tones
ratio_IIP1dB_IIP3_2t=V1dB_2t/Vip3_2t

% using command simplify in default mode

% doesn't detect

a1^(1/2)*a3^(1/2)/(a1*a3)^(1/2)=1

 

simplify(ratio_IIP1dB_IIP3_2t)

 

% but with IgnoreAnaliticConstraints=true

% then it works ok

 

10*log10((double(simplify(ratio_IIP1dB_IIP3_2t, ...

'IgnoreAnalyticConstraints',true)))^2)   % [dB]

 

 

(3*2^(1/2)*979524468995509^(1/2)*a1^(1/2)*a3^(1/2))/(536870912*((9*a1*a3)/16)^(1/2))

 

 =

(1959048937991018^(1/2)*a1^(1/2)*a3^(1/2))/(134217728*(a1*a3)^(1/2))

 

 =

  -9.63574480838302

 

 

 

=

  -9.635744808383029

As expected, whether input is 1 or 2 tones, for same system meeting sign(a1)=-sign(a3) same IP1dB compression input to IIP3 is obtained, which is why the solutions manual only shows 1 case despite question asking for both single and double input tones.

 

 

Mathworks standard examples regarding IP3 and spurs

 

Interesting Mathworks standard Symbolic Toolbox example to capture spurs amplitudes here.

 

Example Analyzing Harmonic Distortion comes without support functions that are needed to run the script. For Measure Total Harmonic Distortion I changed the fairly low frequencies of the original example to f_1=2.1e9;f_2=2.3e9 and Fs=f_1*10 but then the script hits MATLAB default max size upper limit.

Note 1: Example IP3 for OFDM Modulated carrier

[POZAR] explains IP3 IP2 and IP1dB for unmodulated sine cosine (narrowband) carriers, but regulators apply on wireless network operators quality constraints based upon same parameters for modulated signals.

 

From [RCIR] example UMTS receiver system capacity to stand interference (PHY OSI layer) key parameters:

 

  • NF = 8.8 dB

  • IP1dB = -15 dBm

  • ACPR at 5MHz = 33.2 dBm

  • IIP2 = 49.2 dBm

  • IIP3 = -16.8 dBm

 

A typical UMTS UTRA FDD channel, a real measurement, looks like this:

 

A receiver for this signal has to be quiet enough to meet

NF = Ec + Gp + Gc - EbN0_eff - Pn

 

NF: [dB] required receiver noise figure.

Ec: [dBm] Average energy per bit on 'channel' DPCH .

Gp: [dB] de-spreading Processing gain. Gp=10*log10(SF) where SF is the

       spreading factor, amount bits.

       In [RCIR] example each bit before spreading becomes 128 spread bits.

Gc: [dB] Baseband (convolutional coding) processing coding gain.

EbN0_eff: [dB(bit/Hz)] Effective Eb/N0 bit energy to noise spectral density.

Pn: [dBm] noise power within the measured 3.84MHz UTRA FDD channel.

050.jpg
So, except Pn, one can obtain NF out of knowing how the signal is coded: Know how signal is coded by obtaining Gp Gc and the effective Eb/N0, measure noise ground, and NF can be calculated.
052.jpg

An OFDM pack of orthogonal carriers at higher power level next to signal being received also causes same need for IP3 robustness: IEEE802.11a  WLAN

 

Observe that C/I (a.k.a. CIR) in turn compresses OIP3(IIP3) up and right.

Mobile operators require mobile phone manufacturers to produce quiet enough mobile devices, and all mobile network cells are so crowded, that even the ground noise measurement may be obviated just focusing on C/I as the only noise ground level to be taken into account.

Operators can control C/I caused by nearby base stations, but cannot tell where mobile phones are going to be located, although operators can fairly and do forecast mobile phone movements.

 

Mobile phone operators have evolved to dynamically allocate time and frequency wireless channel slots, not to those mobile phones further away from base stations, or in poor coverage spots, but for those mobile phones 'making money' out of requiring higher data traffic. The 'water filling' tank algorithm is presented to students right at the beginning of university undergraduate courses introducing mobile phone networks dynamic resources allocation as a reminder that 'we are here for the money' . Yes military and health operations require coverage to all mobile users regardless of generated traffic, but the bulk of mobile network operators, meaning most of the operators, their revenue comes from as high as possible, more or less regular volumes of traffic, and there is where, in urban context, mobile operator resources are allocated, to secure revenue securing data traffic from those who cause (generate and/or demand) data traffic.

 

 

Note 2: BER measurements are cheaper, faster, and no additional test instrument required.

 

IP3 IP2 and IP1dB measurements require a test unit to focus on such specific measurement. In production lines, in the 90s one would have sampled units, carried out measurements and then inferred that because the production line was reliable enough to keep small standard deviation sigma on key parameters, the entire production would comply with those few samples.

 

But it's far more practical to measure on the go, obtain IP1dB (and as shown from IP1dB to IP3) while using a test unit, that in turn allows one and each unit in the production line to be unequivocally tested, no more statistician sigma extrapolation guessing.

Well, all that one has to do is to implement in each unit a [BER IP1dB] mapping, like for instance this one:

 

When one measures IP1dB one can tell where the coded BER should be.

 

If a transceiver is 'talking'  to fast, BER worsens, so slow down.

 

Or if 'talking too slow'  then the wireless channel has data rate margin to offer higher rate, so use it.

 

By focusing R&D effort on coding, one can reduce or outsource  the need to bring test units to an expensive test bench.

 

Now one can tell IP1dB out of BER measurements 'on the go' , while establishing and sustaining wireless channels to/from base stations.

 

And why nitty-gritty check each received bit, whether it's as expected or it has to be counted as erroneous, isn't it penny wise pound fool? focus on Packet Error Rate instead of BER only, BER measurements must be done, but keep them on a corner, and focus on counting whether packets are or not.

 

The same way that a standard may require BER<1e-3, equivalent (yet less costly in terms of CPU cycles diverted to measurements) requirement may be imposed, like for instance PER<10 %percent

054.jpg
051.jpg

References

 

 

[RCIR]

Study on Resistive Mixer Circuits in Reconfigurable Mobile Communication Systems,

author: Radu Circa. Thesis, 2008, Berlin Universität.

 

040.jpg

Comments

 

 

[1] comment solutions manual

print_error_pg514_10_43.jpg
bottom of page