exercise 10.16
ZIP with MATLAB scripts and note:
exercise 10.16 note:
The question imposes sign(a1)==-sign(a3) to be true.
1.- IP1dB(IP3) with single-tone input :
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:
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.
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.
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
References
[RCIR]
Study on Resistive Mixer Circuits in Reconfigurable Mobile Communication Systems,
author: Radu Circa. Thesis, 2008, Berlin Universität.
Comments
[1] comment solutions manual