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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| clear; close all; clc;
Parameter_demo = [0.3 30 2.5 -80 0.2 -60 0.2 -15 0.5 45 1.5 0.08]; Parameter_2G = [];
Sel = Parameter_demo;
G_db = 8; G = power(10, G_db / 10);
VSWRimn = 1.5;
Timn_abs = (VSWRimn - 1) / (VSWRimn + 1);
F_db = 1.6; F = power(10, F_db / 10);
Rn = Sel(12);
Fmin_db = Sel(11); Fmin = power(10, Fmin_db / 10);
Topt_a = ang2rad(Sel(10)); Topt = Sel(9) * exp (1i * Topt_a);
a11 = ang2rad(Sel(2)); s11 = Sel(1) * exp (1i * a11);
a21 = ang2rad(Sel(4)); s21 = Sel(3) * exp (1i * a21);
a12 = ang2rad(Sel(6)); s12 = Sel(5) * exp (1i * a12);
a22 = ang2rad(Sel(8)); s22 = Sel(7) * exp (1i * a22);
subplot(121); smith();
delta = s11 * s22 -s12 * s21;
k = (1 - power(abs(s11), 2) - power(abs(s22), 2) + power(abs(delta), 2)) / (2 * abs(s12) * abs(s21));
Gmax = abs(s21) / abs(s12) * (k - sqrt(power(k, 2) - 1)); Gmax_db = 10 * log10(Gmax);
g0 = G / power(abs(s21), 2);
dg0 = g0 * conj(s22 - delta * conj(s11)) / (1 + g0 * (power(abs(s22), 2) - power(abs(delta), 2))); rg0 = sqrt(1 - 2 * k * g0 * abs(s12 * s21) + power(g0, 2) * power(abs(s12 * s21), 2)) / abs(1 + g0 * (power(abs(s22), 2) - power(abs(delta), 2)));
dgs = ((1 - s22 * dg0) * conj((s11 - delta * dg0)) - power(rg0, 2) * conj(delta) * s22) / (power(abs(1 - s22 * dg0), 2) - power(rg0, 2) * power(abs(s22), 2)); rgs = rg0 * abs(s12 * s21) / abs(power(abs(1 - s22 * dg0), 2) - power(rg0, 2) * power(abs(s22), 2));
viscircles([real(dgs), imag(dgs)], rgs, "LineWidth", 2, "Color", "red");
Qk = power(abs(1 + Topt), 2) * (F - Fmin) / (4 * Rn); df = Topt / (1 + Qk); rf = sqrt((1 - power(abs(Topt), 2)) * Qk + power(Qk, 2)) / (1 + Qk);
viscircles([real(df), imag(df)], rf, "LineWidth", 2, "Color", "green");
scatter(real(Topt), imag(Topt), "red");
min_F = inf; VSWRomn_target = inf; for degree = 1:360 Ts = dgs + rgs * exp (1i * ang2rad(degree)); Tl = (s11 - conj(Ts)) / (delta - s22 * conj(Ts));
Tout = s22 + s12 * s21 * Ts / (1 - s11 * Ts); Tomn = (conj(Tout) - Tl) / (1 - Tl * Tout);
VSWRomn = (1 + abs(Tomn)) / (1 - abs(Tomn));
if(abs(Ts - df) < rf && VSWRomn < VSWRomn_target) scan_F = Fmin + 4 * Rn * power(abs(Ts - Topt), 2) / ((1 - power(abs(Ts), 2)) * power(abs(1 + Topt), 2));
if(scan_F < min_F) min_F = scan_F; Ts_final = Ts; Tl_final = Tl; end scatter(real(Ts), imag(Ts), "yellow"); end end
scatter(real(Ts_final), imag(Ts_final), "red");
Tin = s11 + (s21 * s12 * Tl_final) / (1 - s22 * Tl_final);
dv_imn = (1 - power(Timn_abs, 2)) * conj(Tin) / (1 - power(Timn_abs * abs(Ts), 2)); rv_imn = (1 - power(abs(Tin), 2)) * Timn_abs / (1 - power(Timn_abs * abs(Ts), 2));
viscircles([real(dv_imn), imag(dv_imn)], rv_imn, "LineWidth", 2, "Color", "cyan"); VSWRomn_list = zeros(360, 1);
for degree = 1:360 Ts = dv_imn + rv_imn * exp (1i * ang2rad(degree));
Tout = s22 + s12 * s21 * Ts / (1 - s11 * Ts); Tomn = (conj(Tout) - Tl_final) / (1 - Tl_final * Tout);
VSWRomn_list(degree) = (1 + abs(Tomn)) / (1 - abs(Tomn)); end
subplot(122); grid on; xlim([1, 360]); ylim([1, inf]); hold on;
plot(1:360, VSWRomn_list, "Color", "blue"); line([1, 360], [VSWRimn, VSWRimn], "Color", "red", "LineStyle", "--");
prompt = "选择角度:"; degree = input(prompt);
Ts_final = dv_imn + rv_imn * exp (1i * ang2rad(degree)); Tout = s22 + s12 * s21 * Ts_final / (1 - s11 * Ts_final);
Gt = (1 - power(abs(Tl_final), 2)) * power(abs(s21), 2) * (1 - power(abs(Ts_final), 2)) / (power(abs(1 - Ts_final * Tin), 2) * power(abs(1 - s22 * Tl_final), 2)); Gt_db = 10 * log10(Gt);
F_final = Fmin + 4 * Rn * power(abs(Ts_final - Topt), 2) / ((1 - power(abs(Ts_final), 2)) * power(abs(1 + Topt), 2)); F_final_db = 10 * log10(F_final);
fprintf("Ts: %f∠%f°\nTout: %f∠%f°\n", abs(Ts_final), getAngle(Ts_final), abs(Tout), getAngle(Tout)); fprintf("Gt(dB): %f\nF(dB): %f\nVSWRomn: %f\n", Gt_db, F_final_db, VSWRomn_list(degree));
|