⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smithchart.cpp

📁 多功能史密斯圆图
💻 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 + -