📄 smithchart.cpp
字号:
#include "stdafx.h"
#include "SmithChart.h"
/***************************************************
功能:知道归一化阻抗,计算出导纳
输入参数:归一化阻抗结构体
输出:导纳
***************************************************/
DAONA CSmithChart::CacuDAONA(RLXL rlxl,double a)
{
double temg,temb;
rlxl.r=rlxl.r*a;
rlxl.x=rlxl.x*a;
temg=rlxl.r/(rlxl.r *rlxl.r+rlxl.x*rlxl.x);
temb=-rlxl.x/(rlxl.r *rlxl.r+rlxl.x*rlxl.x);
DAONA tem;
tem.Yb =temb;
tem.Yg=temg;
return tem;
}
/******************************************************
功能:圆图位置初始化
输入参数:左上角坐标,右下角坐标,原点坐标
输出:无
******************************************************/
void CSmithChart::SetRange(CPoint leftToptmp,CPoint rightBottomtmp,CPoint origintmp)
{
leftTop = leftToptmp;
rightBottom = rightBottomtmp;
origin = origintmp;
}
/***************************************************
功能:知道负载阻抗和特性阻抗,计算归一化阻抗
输入参数:阻抗结构体
输出:归一化阻抗结构体
***************************************************/
RLXL CSmithChart::CacuRLXL(IMPEDANCE impedance)
{
double r,x;
r = impedance.Rx/impedance.Z0;
x = impedance.Ry/impedance.Z0;
RLXL tmp;
tmp.r = r;
tmp.x = x;
return tmp;
}
/***************************************************
功能:知道归一化阻抗,计算出反射系数(复数形式)
输入参数:归一化阻抗结构体
输出:反射系数结构体
***************************************************/
FRFL CSmithChart::CacuFRFL(RLXL rlxl)
{
double Fr,Fl;
Fr = (rlxl.r*rlxl.r+rlxl.x*rlxl.x-1)/((1+rlxl.r)*(1+rlxl.r)+rlxl.x*rlxl.x);
Fl = 2*rlxl.x/((1+rlxl.r)*(1+rlxl.r)+rlxl.x*rlxl.x);
FRFL tmp;
tmp.Fr = Fr;
tmp.Fl = Fl;
return tmp;
}
/***************************************************
功能:知道反射系数,计算归一化阻抗
输入参数:反射系数结构体
输出:归一化阻抗结构体
***************************************************/
RLXL CSmithChart::CacuRLXL(FRFL frfl)
{
RLXL tmp;
tmp.r = (1-frfl.Fr*frfl.Fr-frfl.Fl*frfl.Fl)/((1-frfl.Fr)*(1-frfl.Fr)+frfl.Fl*frfl.Fl);
tmp.x = 2*frfl.Fl/((1-frfl.Fr)*(1-frfl.Fr)+frfl.Fl*frfl.Fl);
return tmp;
}
/***************************************************
功能:知道归一化阻抗,计算R圆参数
输入参数:归一化阻抗实部
输出:R圆参数
***************************************************/
CIRCLE CSmithChart::CacuCircleR(double r)
{
double x,y,radius;
y = 0;
x = r/(1+r);
radius = 1/(1+r);
CIRCLE tmp;
tmp.x = x;
tmp.y = y;
tmp.radius = radius;
return tmp;
}
/***************************************************
功能:知道归一化阻抗,计算X圆参数
输入参数:归一化阻抗虚部
输出:X圆参数
***************************************************/
CIRCLE CSmithChart::CacuCircleX(double xx)
{
double x,y,radius;
x = 1;
if(xx==0)
y = 1000;
else
y = 1/xx;
if(xx>0) radius = y;
else
if(xx<0) radius = -y;
else radius = 1000;
CIRCLE tmp;
tmp.x = x;
tmp.y = y;
tmp.radius = radius;
return tmp;
}
/***************************************************
功能:知道反射系数,计算驻波比
输入参数:反射系数结构体
输出:驻波比
***************************************************/
double CSmithChart::GetSWR(FRFL frfl)
{
double reflectValue;
reflectValue = sqrt(frfl.Fl*frfl.Fl+frfl.Fr*frfl.Fr);
return (1+reflectValue)/(1-reflectValue);
}
/***************************************************
功能:知道反射系数,传输线长度
输入参数:反射系数结构体,传输线长度
输出:旋转后的输入点反射系数结构体
***************************************************/
FRFL CSmithChart::Rotate(FRFL frfl,double length)
{
double reflectValue;
reflectValue = sqrt(frfl.Fl*frfl.Fl+frfl.Fr*frfl.Fr);//反射系数大小
double left = length*10-int(length*10);
left = left/10+double(int(length*10)%5)/10;//实际旋转传输线,扣除整半波长
double angleRotated = left/0.5*2*3.14;//实际旋转角度
double angleOld,angle;
angle = acos(frfl.Fr/reflectValue);
if(frfl.Fl>0)//原角度
angleOld = angle;
else angleOld = 2*3.14-angle;
////////////计算新反射系数
double fr,fl;
fr = reflectValue*cos(angleOld-angleRotated);
fl = reflectValue*sin(angleOld-angleRotated);
FRFL tmp;
tmp.Fr = fr;
tmp.Fl = fl;
return tmp;
}
/***************************************************
功能:现实阻抗
输入参数:反射系数结构体,绘图设备句柄
输出:无
***************************************************/
void CSmithChart::ShowImpedance(FRFL frfl,RLXL rlxl,double texing,CDC *pDC)
{
int x = int(frfl.Fr*origin.x+origin.x);
int y = origin.y-int(frfl.Fl*origin.x);
CString str,strShibu,strXubu1,strXubu2;
strShibu.Format("%.2f",rlxl.r*texing);
strXubu1.Format("%.2f",rlxl.x*texing);
strXubu2.Format("%.2f",rlxl.x*texing*(-1));
if(rlxl.x>=0)
str.Format("%s +j %s",strShibu,strXubu1);
else
str.Format("%s -j %s",strShibu,strXubu2);
pDC->TextOut(10,10,str);
CBrush grayBrush(RGB(100,100,100));
CBrush *poldBrush = pDC->SelectObject(&grayBrush);
pDC->Ellipse(x-5,y-5,x+5,y+5);
pDC->SelectObject(poldBrush);
}
/***************************************************
功能:知道反射系数,绘图设备,画等反射系数圆
输入参数:反射系数结构体,绘图设备句柄
输出:无
***************************************************/
void CSmithChart::DrawCircle(FRFL frfl,CDC *pDC)
{
double reflectValue;
reflectValue = sqrt(frfl.Fl*frfl.Fl+frfl.Fr*frfl.Fr);
int radius = int(reflectValue*origin.x);
pDC->Arc(origin.x-radius,origin.y-radius,origin.x+radius,origin.y+radius,origin.x-radius,origin.y,origin.x-radius,origin.y);
}
/***************************************************
功能:知道R圆参数,绘图设备,画R圆
输入参数:R圆参数,绘图设备句柄
输出:无
***************************************************/
void CSmithChart::DrawCircleR(CIRCLE rCircle,CDC *pDC)
{
int rate = origin.x-leftTop.x;//获得比例半径
int x = int(rate*rCircle.x+origin.x);
int y = int(rate*rCircle.y+origin.y);
int radius = int(rate*rCircle.radius);
pDC->Arc(x-radius,y-radius,x+radius,y+radius,x-radius,y,x-radius,y);
}
/***************************************************
功能:知道X圆参数,绘图设备,画X圆
输入参数:X圆参数,绘图设备句柄
输出:无
***************************************************/
void CSmithChart::DrawCircleX(CIRCLE xCircle,CDC *pDC)
{
int rate = origin.x-leftTop.x;//获得比例半径
int x = rightBottom.x;
int radius = int(rate*xCircle.radius);
int y = origin.y-int(rate*xCircle.y);
/////////////////////////////计算交点
double angle = atan(xCircle.radius/xCircle.x);
int xStart = int(origin.x*cos(2*angle)+origin.x);
int yStart;
if(xCircle.y>0)
yStart = int(origin.y-origin.x*sin(2*angle));
else
yStart = int(origin.y+origin.x*sin(2*angle));
int xEnd = rightBottom.x;
int yEnd = origin.y;
////////////////////////////////////////////
if(xCircle.y>0)
pDC->Arc(x-radius,y-radius,x+radius,y+radius,xStart,yStart,xEnd,yEnd);
else
pDC->Arc(x-radius,y-radius,x+radius,y+radius,xEnd,yEnd,xStart,yStart);
}
/***************************************************
功能:SMITH圆图初始化
输入参数:绘图设备句柄
输出:无
***************************************************/
void CSmithChart::InitSmithChart(CDC *pDC)
{
CPen bluePen(PS_SOLID,1,RGB(0,255,0));
CPen greenPen(PS_SOLID,1,RGB(0,0,255));
CPen blackPen(PS_SOLID,1,RGB(0,0,0));
CPen * poldPen = pDC->SelectObject(&greenPen);
pDC->Rectangle(leftTop.x,leftTop.y,rightBottom.x,rightBottom.y);
pDC->SelectObject(&greenPen);
CIRCLE rCircle;
double r = 0;
while(r<=5)
{
rCircle = CacuCircleR(r);
DrawCircleR(rCircle,pDC);
if(r<=1)
r += 0.1;
else r += 0.3;
}
pDC->SelectObject(&bluePen);
CIRCLE xCircle;
double x;
x = -5;
while(x<=5)
{
xCircle = CacuCircleX(x);
DrawCircleX(xCircle,pDC);
if(x>=-1&&x<=1)
x += 0.1;
else x += 0.3;
}
/////画坐标系
pDC->SelectObject(&blackPen);
pDC->MoveTo(origin.x,0);
pDC->LineTo(origin.x,rightBottom.y);
pDC->MoveTo(0,origin.y);
pDC->LineTo(rightBottom.x,origin.y);
pDC->SelectObject(poldPen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -