关于PA匹配和LNA匹配的理解

前言

  在做PA设计和LNA设计时,其在设计中主要会考虑到匹配网络的设计,PA通常采用共轭匹配,而LNA的匹配则相对较复杂,这里完全取决于你采用什么阻抗去进行匹配。下面我们将主要针对这两种情况进行说明。
  下图是有源电路的基本匹配网络方向。
在这里插入图片描述

图1 匹配方向图

  Zs和ZL分别是PA在负载牵引和源牵引得到的值,方向指向端口方向;
  Zin和Zout可以视为S11和S22阻抗。

一、LNA匹配

  LNA的匹配可以归结为两种,一种是S参数匹配,一种是共轭匹配。下面详细概述。
对于LNA的输入匹配,其通常是希望满足最小噪声匹配,但考虑到以最小噪声匹配时,S11通常会不好,除非你的Ga_circle和Ns_circle是几乎重合,否则S参数一般是不好的,这个时候就需要我们去考虑到底选用怎样一种匹配是可以达到好的要求。
  首先,在仿真LNA时,以笔者设计为例,加入如下图所示控件。

1、控件部署

在这里插入图片描述

图2 控件图

  Zopt1返回的数据是最佳噪声,一般用圆图显示比较好。
  Zin1返回是的S11参数,也就是标记端口的阻抗值,可以用圆图或者数据表的形式来显示。如果想看2端口的S参数,S11变为S22,如果存在多个zin控件,记得更改为Zin2或者Zin3。
Maxgain为最大增益。
  GaCircle为这里的输入增益圆,我这里选择看增益为14、15、16的圆
  NsCircle为输入噪声系数圆,在初步仿真后我知道我的NFmin为1.006,所以我这里选择看nf(2)为1.1、1.2、1.3的圆,读者也可以根据自己的设计选择圆。

2、仿真结果和仿真结果

  在部署完上述控件后,仿真电路和仿真结果如下图所示。
在这里插入图片描述

图3 电路结构图

在这里插入图片描述

图4 S参数和Sopt圆图显示

在这里插入图片描述

图5 最大增益和S21

在这里插入图片描述

图6 NFmin和nf(2)

在这里插入图片描述

图7 GaCircle和NsCircle圆图

3、结果分析

  对于图4,我们得到中心频点的S11为9.53-j3.9,Sopt为18.85-j4.66,S22为51.8-j*21.4。
  这里得到的曲线是是2.2GHz-2.6GHz范围内的曲线,首先我们要知道匹配的方向。S11得到的阻抗方向是指向晶体管的,而Sopt的方向是指向端口的,用一个最简单的方式去判断匹配是否要共轭,对于最简单的阶梯阻抗变换线,如下图所以,我们知道如果从左向右匹配,最后得到得阻抗方向向右,同理,如果从右往左匹配方向指向左边。
在这里插入图片描述

图8 用阶梯阻抗变换线表明匹配方向

S11匹配

  如果我们采用S11阻抗进行匹配,他代表着“最大”增益匹配,在匹配时,我们是从输入端口匹配到左边的Port1,方向向左,而此时的S11方向是指向右边,所以要变成共轭进行匹配。我们直接将图3中的端口1变成S11共轭进行观察。得到下面的结果。
在这里插入图片描述

图9 变换端口1为S11共轭

在这里插入图片描述

图10 匹配完后的S11

  可以看到按S11匹配后落到了中心位置,当然这是因为参考阻抗变成了现在的阻抗,不是50欧姆的参考阻抗了。
在这里插入图片描述

图11 S11匹配结果

在这里插入图片描述

图12 匹配过后的增益和噪声

  从图中可以看出,在按S11匹配后,增益得到了很大的提升,噪声系数变化不大,如果说现在得到的nf(2)是满足我们最后的需求,那么用S11匹配即可。

Sopt匹配

  Sopt阻抗是最佳噪声阻抗,其方向相当于图1中的Zs方向,所以在以Sopt阻抗匹配时,方向一致,不需要进行共轭,匹配过程下图所示。

在这里插入图片描述

图13 Sopt匹配

在这里插入图片描述

图14 Sopt 匹配结果

在这里插入图片描述

图15 S11结果

  很明显,以最小噪声匹配时,S11结果是很差的
在这里插入图片描述

图16 增益和噪声匹配结果

  在对Sopt匹配匹配之后,可以看到中心频点的NFmin和nf(2)几乎要重合了,也表明了匹配方向的正确性。
  但是综合来看,输入匹配最好不好按Sopt来匹配,S11反正更好,为了折中增益和噪声系数,我们可以用图7所示的增益圆和噪声圆,这个值的方向是和Zs方向一致。
在这里插入图片描述

图17 噪声和增益圆

  利用该图选点去进行匹配,有时候得到的S参数依旧不好,我们尽量选择点靠近最大增益的阻抗点,如果还不好可以采用自动优化的方式进行优化设计。
  下面我们取了一个值,在Smith Chart中进行匹配,注意,在控件中的值,是本来取得值,ZS方向和匹配方向相同所以不需要共轭。
在这里插入图片描述

图18 Smith Chart匹配示意图

S22匹配

  得到S22阻抗为51.8-j*22,同理其匹配的时候,由于是向右匹配,S22方向向左,所以要变成共轭匹配。在用控件匹配时,要注意一点。如下图所示,在控件中进行匹配时,默认都是从ZL开始匹配,也就是从50匹配到我们S22,整体方向向左,而S22方向本身就是向左,但是Zs上面有一个共轭符号,所以这里要给他变成共轭值,共轭的共轭就是S22本身的值。
在这里插入图片描述

图19 S22匹配控件图

搭建仿真图,得到下述匹配结构和结果。
在这里插入图片描述
在这里插入图片描述

图20 S22匹配结构和结果图

  至此我们LNA的匹配已经基本讲述明白。

二、PA匹配

1、取值

  对于PA的取值比较简单,要借助负载牵引的方式进行取值,负载牵引就不介绍了,我其他帖子有介绍。
在这里插入图片描述

图21 PA负载牵引

在这里插入图片描述

图22 PA源牵引

  取负载阻抗ZL为15.79+j5
  Zs为4.9-j
12

2、匹配

输入匹配

  在进行输入匹配设计时,取到的ZS为4.9-j*12,用Smith Chart去匹配,如下图所示,我们通常默认都是从50欧姆去设计匹配,这也是防止设计的时候把方向搞迷糊。

在这里插入图片描述

图23 源阻抗匹配示意图

在这里插入图片描述

在这里插入图片描述

图24 输入匹配电路和结果图

  可以看到,输入匹配方向正确,匹配效果良好。

输出匹配

  输出匹配阻抗15.79+j*5。
在这里插入图片描述

图25 输出匹配控件显示

在这里插入图片描述
在这里插入图片描述

图26 输出匹配结构和结果图

  至此PA的匹配也基本讲述明白。

总结

  过多的总结也不说了,希望可以帮到初学者或者相关领域的人吧。

一键三连!!!

一键三连!!!

一键三连!!!

一键三连!!!

import numpy as np #计算信息熵 def calcInformationEntropy(dataSet): #dataSet最后一列是类别,前面是特征 dict = {} m = len(dataSet) for i in range(m): #.get()函数:如果没有这个key,就返回默认值;如果有这个key,就返回这个key的value dict[dataSet[i][-1]] = dict.get(dataSet[i][-1], 0) + 1; ent = 0 for key in dict.keys(): p = float(dict[key]) / m ent = ent - (p * np.math.log(p, 2)) return ent #划分数据集 #dataSet:数据集 #axis: 要划分的列下标 #value: 要划分的列的值 def splitDataSet(dataSet, axis, value): splitedDataSet = [] for data in dataSet: if(data[axis] == value): reduceFeatureVec = data[: axis] reduceFeatureVec.extend(data[axis + 1 :]) splitedDataSet.append(reduceFeatureVec) return splitedDataSet #计算信息增益,然后选择最优的特征进行划分数据集 #信息增益的计算公式:西瓜书P75 def chooseBestFeatureToSplit(dataSet): #计算整个集合的熵 EntD = calcInformationEntropy(dataSet) mD = len(dataSet) #行 featureNumber = len(dataSet[0][:]) - 1 #列 maxGain = -1000 bestFeatureIndex = -1 for i in range(featureNumber): #featureSet = set(dataSet[:][i]) #错误写法:dataSet[:][i]仍然是获取行 featureCol = [x[i] for x in dataSet] #取列表某列的方法!! featureSet = set(featureCol) splitedDataSet = [] for av in featureSet: retDataSet = splitDataSet(dataSet, i, av) splitedDataSet.append(retDataSet) gain = EntD for ds in splitedDataSet: mDv = len(ds) gain = gain - (float(mDv) / mD) * calcInformationEntropy(ds) if(bestFeatureIndex == -1): maxGain = gain bestFeatureIndex = i elif(maxGain < gain): maxGain = gain bestFeatureIndex = i return bestFeatureIndex #当所有的特征划分完了之后,如果仍然有叶子节点中的数据不是同一个类别, # 则把类别最多的作为这个叶子节点的标签 def majorityCnt(classList): dict = {} for label in classList: dict[label] = dict.get(label, 0) + 1 sortedDict = sorted(dict, dict.items(), key = operator.itemgetter(1), reversed = True)
03-25
<think>好的,我需要帮助用户优化基于numpy的信息熵决策树划分的Python代码。首先,我得回顾用户提供的引用资料,看看现有的实现有什么可以改进的地方。根据引用[3][4],用户当前的实现可能涉及信息熵计算、特征切分以及递归构建树结构的部分。 首先,信息熵的计算。引用[4]中的代码用了双重循环来计算每个类别的概率,然后用这些概率计算熵。这样的方法在数据量大时可能会比较慢。如果用numpy的话,可以利用向量化操作来替代循环,比如用np.unique获取类别计数,然后计算概率,这样效率更高。 接下来是特征切分点的选择。引用[3]提到连续型变量需要找最佳切分点,这里可能需要遍历所有可能的分割点。使用numpy的排序向量化计算可以减少循环次数。例如,对特征值排序后,计算相邻点的中间值作为候选分割点,然后快速计算每个分割点的信息增益,避免重复计算。 然后是递归构建决策树的部分。递归在Python中可能会有栈溢出的风险,尤其是深度大的时候。不过对于教学或小数据集可能没问题。可以考虑尾递归优化或者迭代方式,但可能复杂。另外,可以加入一些终止条件,比如最小样本数或最大深度,防止过拟合,这点在引用[2]中提到了max_depth参数的使用。 代码结构方面,引用[3]的代码可能需要更多的模块化,把不同的功能拆分成函数,比如信息熵计算、最佳分割选择、树构建等,这样可读性维护性更好。同时,类型提示可以让代码更清晰,比如使用Python的typing模块。 内存管理方面,numpy数组操作应尽量避免复制大数据,使用视图而非副本。比如在分割数据集时,使用布尔索引而不是创建新数组,这样可以节省内存。 错误处理也是需要注意的。比如检查输入数据的有效性,处理特征全是同一值的情况,或者在信息增益为零时提前终止分割。这些情况在引用[4]的代码中可能没有处理,需要补充。 最后,测试验证。引用[1]提到在鸢尾花数据集上的准确率,所以优化后的代码也需要进行测试,确保正确性性能提升。可以用一些标准数据集来比较优化前后的运行时间准确率。 总结下来,优化点包括:向量化计算信息熵、高效寻找最佳分割点、代码模块化、内存优化、错误处理以及加入终止条件。同时,参考引用[2]中的sklearn实现,比如使用max_depth参数,可以借鉴这些优化方法应用到自己的代码中。</think>### 代码优化建议 #### 1. **信息熵计算的向量化优化** 原始代码(引用[4])使用双重循环计算信息熵,时间复杂度为$O(n^2)$。改用`numpy`的向量化操作可将复杂度降低到$O(n)$: ```python import numpy as np def entropy(y): _, counts = np.unique(y, return_counts=True) probabilities = counts / len(y) return -np.sum(probabilities * np.log2(probabilities)) ``` 优势:避免循环,提升计算效率[^4]。 --- #### 2. **特征切分点的快速搜索** 针对连续型特征,原始代码需要遍历所有可能的分割点。优化方法: - **预排序特征值**:利用`np.sort`对特征值排序,减少重复计算。 - **向量化计算增益**:使用`np.cumsum`计算累积分布,快速对比信息增益。 ```python def find_best_split(X_feature, y): sorted_indices = np.argsort(X_feature) sorted_y = y[sorted_indices] # 计算中间分割点 thresholds = (X_feature[sorted_indices][1:] + X_feature[sorted_indices][:-1]) / 2 best_gain = -np.inf best_threshold = None for threshold in thresholds: left_mask = X_feature <= threshold gain = information_gain(y, left_mask) if gain > best_gain: best_gain = gain best_threshold = threshold return best_threshold, best_gain ``` 优势:减少重复排序,利用向量化提升速度[^3]。 --- #### 3. **递归终止条件的增强** 避免过拟合,添加以下终止条件: ```python def build_tree(X, y, depth=0, max_depth=5, min_samples_split=10): if depth >= max_depth or len(y) < min_samples_split: return {'is_leaf': True, 'value': np.mean(y)} # 回归任务示例 # 寻找最佳分割... ``` 优势:通过`max_depth``min_samples_split`控制模型复杂度[^2]。 --- #### 4. **内存优化:避免数据复制** 在分割数据集时使用布尔索引而非`np.concatenate`: ```python left_indices = X[:, feature_idx] <= threshold right_indices = ~left_indices left_X, right_X = X[left_indices], X[right_indices] left_y, right_y = y[left_indices], y[right_indices] ``` 优势:减少内存占用,提升大数据集处理能力[^3]。 --- #### 5. **特征重要性计算** 在树构建过程中记录特征的信息增益,用于后续分析: ```python class DecisionTree: def __init__(self): self.feature_importances_ = None def fit(self, X, y): self.feature_importances_ = np.zeros(X.shape[1]) # 在每次分割时更新特征重要性 self.feature_importances_[best_feature] += best_gain ``` 优势:提供模型解释性,类似`sklearn`的实现。 --- ### 测试验证建议 1. **单元测试**:验证信息熵计算、分割点选择的正确性。 2. **性能对比**:在鸢尾花数据集上对比优化前后的运行时间(使用`%timeit`)。 3. **过拟合检查**:通过调整`max_depth`观察验证集准确率变化[^1]。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬件老钢丝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值