资源描述
VC++绘制天线辐射方向图
题 目: VC++绘制天线辐射方向图
学 院: 信息工程学院
分 组: 4
成 员: 钟信星(20130608521107)
张红梅(20130608100005)
指导老师: 张 晓 燕
提交日期:2014年6月30日
电磁场与计算机辅助设计期末课程设计
数据提交: 论文 PPT 程序代码
考查成绩
分组:(4) 姓名: 钟信星 分工: 程序编写、答辩
评分标准
论文撰写
工作量
答辩质量
团队合作
总分
分值
10
50
20
20
100
得分
分组:(4) 姓名: 张红梅 分工: 公式推导、论文撰写
评分标准
论文撰写
工作量
答辩质量
团队合作
总分
分值
10
50
20
20
100
得分
分组:(X) 姓名: XXX 分工: 例如:程序编写、文献调研、论文撰写
评分标准
论文撰写
工作量
答辩质量
团队合作
总分
分值
10
50
20
20
100
得分
第一章 天线介绍
天线是一种用来发射或接收无线电波或更广泛来讲——电磁波的电子器件。天线应用于广播和电视、点对点无线电通信、雷达和太空探索等系统。天线通常在空气和外层空间中工作,也可以在水下运行,甚至在某些频率下工作于土壤和岩石之中。
从物理学上讲,天线是一个或多个导体的组合,由它可因施加的交变电压和相关联交变电流而产生辐射的电磁场,或者可以将它放置在电磁场中,由于场的感应而在天线内部产生交变电流并在其终端产生交变电压。
基于特定三维(通常指水平或垂直)平面,可以把天线分为两大基本类型:全向天线(在平面中均匀辐射);定向天线(又称指向天线,在某方向辐射较多)。在自由空间内,任何天线都向各个方向辐射能量,但是特定的架构会使天线在某个方向上获得较大方向性,而其它方向的能量辐射则可以忽略。通过增加附加导体棒或线圈(称之为单元)并改变其长度、间距和方位(或者改变天线波束方向),可以制造出拥有既定特性的天线,如八木天线。“天线阵列”或“天线阵”是指相当数量的有源天线共用源或负载来产生定向的天线辐射方向图。天线的空间关系通常也会影响其方向性。“有源单元”是指此天线单元的能量输出由该单元内部的能量源所决定(而不是仅由通过电路的信号能量)或者该单元能量输出的能量源由信号输入所控制。“天线引入线”是在信号源和有源天线之间传输信号能量的传导装置(如传输线或馈线)。它由有源天线延伸出来直达源。“天线馈电”则是指有源天线和放大器之间的元件。
影响天线性能的临界参数有很多,通常在天线设计过程中可以进行调整,如谐振频率、阻抗、增益、孔径或辐射方向图、极化、效率和带宽等。另外,发射天线还有最大额定功率,而接收天线则有噪声抑制参数。
谐振频率:“谐振频率”和“电谐振”与天线的电长度相关。电长度通常是电线物理长度除以自由空间中波传输速度与电线中速度之比。天线的电长度通常由波长来表示。天线一般在某一频率调谐,并在此谐振频率为中心的一段频带上有效。但其它天线参数(尤其是辐射方向图和阻抗)随频率而变,所以天线的谐振频率可能仅与这些更重要参数的中心频率相近。天线可以在与目标波长成分数关系的长度所对应的频率下谐振。一些天线设计有多个谐振频率,另一些则在很宽的频带上相对有效。最常见的宽带天线是对数周期天线,但它的增益相对于窄带天线则要小很多。
天线设计中,“增益”指天线最强辐射方向的天线辐射方向图强度与参考天线的强度之比取对数。如果参考天线是全向天线,增益的单位为dBi。比如,偶极子天线的增益为2.14dBi。偶极子天线也常用作参考天线(这是由于完美全向参考天线无法制造),这种情况下天线的增益以dBd为单位。天线增益是无源现象,天线并不增加激励,而是仅仅重新分配而使在某方向上比全向天线辐射更多的能量。如果天线在一些方向上增益为正,由于天线的能量守恒,它在其他方向上的增益则为负。因此,天线所能达到的增益要在天线的覆盖范围和它的增益之间达到平衡。比如,航天器上碟形天线的增益很大,但覆盖范围却很窄,所以它必须精确地指向地球;而广播发射天线由于需要向各个方向辐射,它的增益就很小。
方向图:是指离天线一定距离处,辐射场的相对场强随方向变化的曲线图,通常采用天线最大辐射方向上的两个相互垂直的平面方向图表示。辐射方向图则是表示增益的三维图,但通常只考虑辐射方向图的水平和垂直二维截面。高增益天线辐射方向图常伴有“副瓣”。副瓣是指增益中除主瓣(增益最高“波束”)外的波束。副瓣在如雷达等系统需要判定信号方向的时候,会影响天线质量,由于功率分配副瓣还会使主瓣增益降低。
带宽:天线的带宽是指它有效工作的频率范围,通常以其谐振频率为中心。天线带宽可以通过以下多种技术增大,如使用较粗的金属线,使用金属“网笼”来近似更粗的金属线,尖端变细的天线元件(如馈电喇叭中),以及多天线集成的单一部件,使用特性阻抗来选择正确的天线。小型天线通常使用方便,但在带宽、尺寸和效率上有着不可避免的限制。
阻抗:“阻抗”类似于光学中的折射率。电波穿行于天线系统不同部分(电台、馈线、天线、自由空间)是会遇到阻抗差异。在每个接口处,取决于阻抗匹配,电波的部分能量会反射回源,在馈线上形成一定的驻波。此时电波最大能量与最小能量比值可以测出,称之为驻波比(SWR)。驻波比为1:1是理想情况。1.5:1的驻波比在能耗较为关键的低能应用上被视为临界值。而高达6:1的驻波比也可出现在相应的设备中。极小化各处接口的阻抗差(阻抗匹配)将减小驻波比并极大化天线系统各部分之间的能量传输。天线的复阻抗涉及该天线工作时的电长度。通过调节馈线的阻抗,即将馈线当作阻抗变换器,天线的阻抗可以和馈线和电台相匹配。更为常见的是使用天线调谐器、巴伦、阻抗变换器、包含电容和电感的匹配网络,或者如伽马匹配的匹配段。
本课设主要是使用C++绘制一种基本天线偶极子天线的其中一个性能参数----辐射方向图。
第二章 VC++6.0编译环境介绍
Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。
Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual C++.NET(Visual C++7.0),但它的应用有很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
第三章 辐射方向图
辐射方向图是天线发射或接受相对场强度的图形描述。由于天线向三维空间辐射,需要数个图形来描述。如果天线辐射相对某轴对称(如双极子天线、螺旋天线和某些抛物面天线),则只需一张方向图。所谓天线方向图,是指在离天线一定距离处,辐射场的相对场强(归一化模值)随方向变化的图形,通常采用通 过天线最大辐射方向上的两个相互垂直的平面方向图来表示,它由天线电磁场辐射决定。
对称偶极子天线是一种最基本天线,其远场区电磁场辐射公式:
E平面方向图即电场方向辐射图,且包含最大电场辐射方向,归一化方向函数为 ,H面方向图即磁场方向辐射图,且包含最大磁场辐射方向,归一化方向函数。
天线阵就是将若干个单元天线按一定方式排列而成的天线系统。排列方式可以是直线阵、平面阵和立体阵。实际的天线阵多用相似元组成。所谓相似元,是指各阵元的类型、尺寸相同,架设方位相同。天线阵的辐射场是各单元天线辐射场的矢量和。只要调整好各单元天线辐射场之间的相位差,就可以得到所需要的、更强的方向性。其辐射方向图同单个的天线的很相似,只是其辐射能量更加集中。
方向图乘积定理,此式表明,天线阵的方向函数可以由两项相乘而得。第一项称为元因子(Primary Pattern),它与单元天线的结构及架设方位有关;第二项称为阵因子(Array Pattern),取决于天线之间的电流比以及相对位置,与单元天线无关。方向函数(或方向图)等于单元天线的方向函数(或方向图)与阵因子(或方向图)的乘积,这就是方向图乘积定理。
已知对称振子以波腹电流归算的方向函数为:
则对称天线的空间辐射特性E面方向函数:
第四章 天线辐射方向图利用C++实现
辐射方向图的主要是根据天线辐射特性决定的,不同辐射特性的天线的方向图也是不一样的。本课程设计主要是实现一种简单天线——偶极子天线辐射方向图。根据前面偶极子天线方向函数的分析将用C把方向函数表示出来,使用画图函数便可将辐射图绘制出。由于C中没有画图函数,可通过调用Matlab中绘图函数实现绘图。
天线方向图绘制步骤:
(1)在VC++6.0中建立对称天线二维极坐标空间E面辐射方向函数的数学模型;
(2)调用matlab软件中的画图函数,实现方向图的绘制;
(3)观察并分析仿真图中不同长度对称天线的空间辐射特性E面方向函数。
4.1 VC++6.0配置
在用C++写程序时,有时会遇到数值计算问题,如矩阵的计算、优化问题、解微分方程等等。这些数值计算问题如果用C++语言实现的话,一来太费时间,二来实现方案效率未必高。所以遇到这些数值计算问题时可以依靠matlab。我们这里绘制方向图c++环境下计算方向函数,调用matlab的绘图函数即可生成方向图。在进行联合编程前需要经行配置,具体如下:
1、在VC++6.0选择"工具"→"Options"→"Directories"→"Include files",如下图所示添加路径。
2、在VC++6.0选择"工具"→"Options"→"Directories"→"Library files",如下图所示添加路径。
3、在VC++6.0选择"工程"→"Link",如下图所示添加库文件。
4.2matlab的配置
在matlab命令行输入mex-setup,按提示选择合适的编译器(VC++6.0)即可。
在matlab命令行输入mbuild-setup,按提示选择合适的编译器(VC++6.0)即可。
4.3调用matlab引擎
为了调用matlab引擎,首先需要引入相应的头文件#include "engine.h"
然后需要加如下几行代码,这样顺利地完成连接。
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
接下来就可以在需要的地方调用matlab引擎了。使用时首先需要打开引擎:
Engine *ep;
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
接下来将C++程序中相关的变量变为matlab需要的格式,一般使用mxCreateDoubleMatrix 和 memcpy函数。
完成转换后使用engPutVariable将数据送到matlab引擎。
最后调用engEvalString,将matlab命令作为其参数,就可以利用matlab引擎进行计算了。计算完成后需要使用mxDestroyArray清除mxCreateDoubleMatrix产生的变量,最后使用engClose关闭引擎。
4.4程序运行结果
为方便计算,这里选取300Mhz,即波长为1m,分别绘制了天线长度为1/4,1/2,3/4,1,3/2,2波长时的E面方向图(程序中只需改变对应宏定义L0的值即可)。
4.4.1 时的方向图
4.4.2 时的方向图
4.4.3 时的方向图
4.4.4 时的方向图
4.4.5 时的方向图
4.4.6 时的方向图
第五章 附录
5.1头文件
engine_h
#if defined(_MSC_VER)
# pragma once
#endif
#if defined(__GNUC__)&&(__GNUC__ >3||(__GNUC__==3&&__GNUC_MINOR__>3))
# pragma once
#endif
#ifndef engine_h
#define engine_h
#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
#endif
#include "matrix.h" /* mx Routines used in module */
typedef struct engine Engine; /* Incomplete definition for Engine */
EXTERN_C int engEvalString(
Engine *ep, /* engine pointer */
const char *string /* string for matlab t execute */
);
EXTERN_C Engine *engOpenSingleUse(
const char *startcmd, /* exec command string used to start matlab */
void *reserved, /* reserved for future use, must be NULL */
int *retstatus /* return status */
);
EXTERN_C int engSetVisible(
Engine *ep, /* engine pointer */
bool newVal
);
EXTERN_C int engGetVisible(
Engine *ep, /* engine pointer */
bool* bVal
);
EXTERN_C Engine *engOpen(
const char *startcmd /* exec command string used to start matlab */
);
EXTERN_C int engClose(
Engine *ep /* engine pointer */
);
EXTERN_C mxArray *engGetVariable(
Engine *ep, /* engine pointer */
const char *name /* name of variable to get */
);
EXTERN_C int engPutVariable(
Engine *ep, /* engine pointer */
const char *var_name,
const mxArray *ap /* array pointer */
);
EXTERN_C int engOutputBuffer(
Engine *ep, /* engine pointer */
char *buffer, /* character array to hold output */
int buflen /* buffer array length */
);
#endif /* engine_h */
5.2主程序
main.cpp
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "engine.h"
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
#define lambda 1.0
#define L0 1.0
int main()
{
Engine *ep;
if(!(ep=engOpen("\0")))
{
fprintf(stderr,"\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
double k;
double L;
int N=3601;
double theta0=0;
const double PI=3.1415926;
double *theta=new double[N];
double *fe=new double[N];
k=2*PI/lambda;
L=L0*lambda;
for(int i=0;i<N;i++)
{
theta[i]=theta0*PI/180;
fe[i]=fabs((cos(k*L*cos(theta[i]))-cos(k*L))/sin(theta[i]));
theta0=theta0+0.1;
}
mxArray *THETA=NULL;
mxArray *FE=NULL;
THETA=mxCreateDoubleMatrix(1,N,mxREAL);
FE=mxCreateDoubleMatrix(1,N,mxREAL);
memcpy((void*)mxGetPr(THETA),(void*)theta,N*sizeof(theta[0]));
memcpy((void*)mxGetPr(FE),(void*)fe,N*sizeof(fe[0]));
engPutVariable(ep,"THETA",THETA);
engPutVariable(ep,"FE",THETA);
engEvalString(ep,"polar(THETA,FE/max(FE));");
printf("Hit return to continue\n\n");
fgetc(stdin);
mxDestroyArray(THETA);
mxDestroyArray(FE);
engEvalString(ep,"close;");
engClose(ep);
return EXIT_SUCCESS;
}
展开阅读全文