天线方向图

之前做实验,老师要求用Origin画天线的方向图,结果我实在是整不到破解版,就自己用Matalb整了一个。

代码就不放了,毕竟确实也比较简单。

效果还是不错的。


天线方向图

这里半功率主瓣也标出来了,可以用鼠标点一下上下的点来计算主瓣宽度。

崩坏:星穹铁道 伤害计算器

闲来无事,用QT搓了一个伤害计算器。


大概长这样👇

伤害计算器

左侧是角色的基础面板数据Buff效果怪物属性,选择性输入这三大部分就可以在右侧拿到当前升级词条的价值伤害数值

词条期望是由B站用户 @LucasCheung299 提供的计算式。

伤害公式来自 这篇文章

点击这里即可下载!


其实本来是做了个Matlab App的,但看起来大家都没有Matlab,只能弄个可执行文件分发了…😔

用Unity开发的坦克小游戏

Unity的免费素材包做了个小游戏。


坦克大战

看起来是不是很有意思?点击这里下载

在这个游戏里,坦克会分为四个队伍,互相对战!

每个队还会拥有一座 “强力” 的防御塔,向靠近的敌人喷射怒火!

和AI队友通力协作,打败其他的AI!

联机游戏真是写不动了

死亡后有观战视角,能看AI互锤。

没有退出键,需要ALT+F4退出,致敬刀剑神域!

Matlab史密斯圆图与LNA设计

这几天需要用Matlab设计一个LNA,结果发现Matlab史密斯圆图不太好用…

于是我决定自己整一个史密斯圆图


电阻圆族电抗圆族公式如下:

$${(\Gamma_{r}-\frac{r}{1+r})}^2 + {\Gamma_{i}}^2 = {(\frac{1}{1+r})}^2$$

$${(\Gamma_{r}-1)}^2 + {(\Gamma_{i}-\frac{1}{x})}^2 = {(\frac{1}{x})}^2$$

那么,可以写出代码如下:

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
function [] = smith()
for x = -4 : 0.2 : 4
viscircles([1, 1 / x], 1 / abs(x), "LineWidth", 0.1, "Color", "blue");
xlim([-1, 1]);
ylim([-1, 1]);
end
line([-1, 1], [0, 0], "LineWidth", 0.1, "Color", "blue");

for r = 0 : 0.2 : 5
viscircles([r / (1 + r), 0], 1 / (1 + r), "LineWidth", 0.1, "Color", "blue");
hold on;
axis equal;
xlim([-1, 1]);
ylim([-1, 1]);
end

anglex={-1, -1, 1, 1};
angley={1, -1, -1, 1};
for i = 1 : 4
for theta = pi / 2 * i : pi / 1000 : pi / 2 * ( i + 1 )
x = cos(theta);
y = sin(theta);
x1 = cos(theta + pi / 1000);
y1 = sin(theta + pi / 1000);
fill([x, x1, anglex{i}], [y, y1, angley{i}], "b");
end
end
end

效果是这样的

史密斯圆图


LNA设计基于上文的史密斯圆图来表示。

具体公式比较复杂,可以去看《射频电路设计――理论与应用(第二版)》这本书📕,公式位于第九章

代码如下:

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;

% S11 A11 S21 A21 S12 A12 S22 A22 Topt_m Topt_a Fmin_db Rn/50 顺序
Parameter_demo = [0.3 30 2.5 -80 0.2 -60 0.2 -15 0.5 45 1.5 0.08];
Parameter_2G = [];

% 选择S参数
Sel = Parameter_demo;

% 指定 增益
G_db = 8;
G = power(10, G_db / 10);

% 指定 VSWRimn
VSWRimn = 1.5;

Timn_abs = (VSWRimn - 1) / (VSWRimn + 1);

% 指定 噪声系数
F_db = 1.6;
F = power(10, F_db / 10);

% Rn/50
Rn = Sel(12);

% 最小噪声系数
Fmin_db = Sel(11);
Fmin = power(10, Fmin_db / 10);

% opt反射系数
Topt_a = ang2rad(Sel(10));
Topt = Sel(9) * exp (1i * Topt_a);

% 指定S参数
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");

% 噪声opt
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");

% 下面进行VSWR的优化

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;

% 画出不同角度的VSWR,然后选择一个角度
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值计算
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));

该代码应配合下面的函数使用。

1
2
3
function [rad] = ang2rad(ang)
rad = ang / 360 * 2 * pi;
end
1
2
3
function [ang] = getAngle(z)
ang = angle(z) / 2 / pi * 360;
end

运行结果如下:

计算结果

左图中红圈就是对于$\Gamma_{S}$的等增益圆,绿圈则是等噪声圆

绿圈中的红点是$\Gamma_{opt}$。

左图下方一大片黄点是满足参数要求(增益噪声)的点,红色的则是噪声系数最小的点。

获得噪声系数最小的点后,进行驻波比优化。通过给定IMN驻波比,画出图中蓝色的等驻波比圆。扫描该圆,计算驻波比,画出右图。

右图中实线是OMN驻波比,需要找到一个比较小的点;虚线是IMN驻波比

将找到的OMN对应的角度输入Matlab,即可得到输出。

输出

My First Post

经典图片


欢迎图片

这个博客打算用来写一些我觉得有价值的东西,或者记录一些有意思的事情。之前的那个旧网站就留在那里吧,不少人对于ChatGPT这个功能还挺喜欢的。

旧网站链接:BlueberryCat.site

旧版网站纪念

这次我使用了Hexo框架,终于不用自己手写HTML或者CSS了…

之前VUE版的项目和Quasar的项目写的也差不多了。但是感觉这种框架的工作量太大了,作为个人博客啥的实在是有些杀鸡用牛刀了。

顺便一提,现在在post内可以写数学公式了!

$$E = mc^2$$