一、nmea数据格式介绍
nmea数据如下:
$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
$GNRMC,230134.00,A,2237.12422,N,11408.08310,E,9.291,215.59,310518,,,A*75
$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04
$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D
说明:NMEA0183格式以“$”开始,主要语句有GPGGA,GPVTG,GPRMC等
1、 GPS DOP and Active Satellites(GSA)当前卫星信息
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>
<1>模式 :M = 手动, A = 自动。
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。
<4> PDOP位置精度因子(0.5~99.9)
<5> HDOP水平精度因子(0.5~99.9)
<6> VDOP垂直精度因子(0.5~99.9)
<7> Checksum.(检查位).
2、 GPS Satellites in View(GSV)可见卫星信息
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>
<1> GSV语句的总数
<2> 本句GSV的编号
<3> 可见卫星的总数,00 至 12。
<4> 卫星编号, 01 至 32。
<5>卫星仰角, 00 至 90 度。
<6>卫星方位角, 000 至 359 度。实际值。
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。
<8>Checksum.(检查位).
第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。
3、Global Positioning System Fix Data(GGA)GPS定位信息
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度半球E(东经)或W(西经)
<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
<8> HDOP水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
<10> 地球椭球面相对大地水准面的高度
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
<12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)
4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
5、 Track Made Good and Ground Speed(VTG)地面速度信息
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF>
<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
<3> 地面速率(000.0~999.9节,前面的0也将被传输)
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
二、gps数据解析与生成类
-
/
/CommonFunction.h
-
#pragma once
-
-
#include
<
string
>
-
#include
<vector
>
-
-
/
/ 字符串分割
-
int StringSplit(std
::vector
<std
::
string
>
& dst, const std
::
string
& src, const std
::
string
& separator);
-
-
/
/ 去掉前后空格
-
std
::
string
& StringTrim(std
::
string
&str);
-
/
/CommonFunction.cpp
-
#include
"stdafx.h"
-
#include
"CommonFunction.h"
-
-
/
/ 字符串分割
-
int StringSplit(std
::vector
<std
::
string
>
& dst, const std
::
string
& src, const std
::
string
& separator)
-
{
-
if (src.empty() || separator.empty())
-
return
0;
-
-
int nCount
=
0;
-
std
::
string temp;
-
size_t pos
=
0, offset
=
0;
-
-
/
/ 分割第
1~n-
1个
-
while ((pos
= src.find_
first_
of(separator, offset)) !
= std
::
string
::npos)
-
{
-
temp
= src.substr(offset, pos
- offset);
-
if (temp.
length()
>=
0) {
-
dst.push_back(temp);
-
nCount
+
+;
-
}
-
offset
= pos
+
1;
-
}
-
-
/
/ 分割第n个
-
temp
= src.substr(offset, src.
length()
- offset);
-
if (temp.
length()
>=
0) {
-
dst.push_back(temp);
-
nCount
+
+;
-
}
-
-
return nCount;
-
}
-
-
/
/去前后空格
-
std
::
string
& StringTrim(std
::
string
&str)
-
{
-
if (str.empty()) {
-
return str;
-
}
-
str.erase(
0, str.find_
first_
not_
of(
" "));
-
str.erase(str.find_
last_
not_
of(
" ")
+
1);
-
return str;
-
}
-
/
/GpsNmeaData.h
-
/
/gps nmea 数据解析与生成
-
-
#pragma once
-
#include
"CommonFunction.h"
-
-
/
/gpsdata格式
-
enum GpsDataFormat
-
{
-
GpsDataFormat_None
=
0,
/
/none
-
GpsDataFormat_GNRMC
=
1,
/
/GNRMC
-
GpsDataFormat_GPRMC
=
2,
/
/GPRMC
-
GpsDataFormat_GPGGA
=
3,
/
/GPGGA
-
};
-
-
/
/
Status
-
enum GpsStatus
-
{
-
GpsStatus_
Valid
=
'A',
/
/数据有效(GPRMC
/GNRMC)
-
GpsStatus_
Invalid
=
'V',
/
/数据无效(GPRMC
/GNRMC)
-
GpsStatus_NoLocation
=
'0',
/
/未定位(GPGGA)
-
GpsStatus_NoDiffLocation
=
'1',
/
/非差分定位(GPGGA)
-
GpsStatus_DiffLocation
=
'2',
/
/差分定位(GPGGA)
-
GpsStatus_Estimating
=
'6',
/
/正在估算(GPGGA)
-
};
-
-
/
/纬度方向
-
enum GpsLatDirect
-
{
-
GpsLatDirect_N
=
'N',
/
/北纬
-
GpsLatDirect_S
=
'S',
/
/南纬
-
};
-
-
/
/经度方向
-
enum GpsLngDirect
-
{
-
GpsLngDirect_E
=
'E',
/
/东经
-
GpsLngDirect_W
=
'W',
/
/西经
-
};
-
-
/
/磁偏角方向,E
=东,W
=西
-
enum GpsDeclinationDirect
-
{
-
GpsDeclinationDirect_
Invalid
=
'0',
-
GpsDeclinationDirect_E
=
'E',
-
GpsDeclinationDirect_W
=
'W',
-
};
-
-
/
/模式,A
=自动,D
=差分,E
=估测,N
=数据无效
-
enum GpsMode
-
{
-
GpsMode_A
=
'A',
-
GpsMode_D
=
'D',
-
GpsMode_E
=
'E',
-
GpsMode_N
=
'N',
-
};
-
-
class GpsNmeaData
-
{
-
public:
-
GpsNmeaDat
a();
-
virtual ~GpsNmeaDat
a();
-
-
/
/设置初始gps数据格式
-
void SetInitGpsDataFormat(unsigned char ucInitGpsDataFormat);
-
-
/
/加载GPS字符串
-
bool LoadGPSString(char
*pInputString, bool bIsCompareChecksum
=
true);
-
/
/生成GPS字符串
-
bool CreateGPSString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/加载GPRMC字符串
-
bool LoadGPRMCString(char
*pInputString,std
::vector
<std
::
string
> vecValue,bool bIsCompareChecksum
=
true);
-
/
/生成GPRMC字符串
-
bool CreateGPRMCString(char
*pOutputString, int
& nOutputStringSize,bool bIsHasEndFlag);
-
-
/
/加载GNRMC字符串
-
bool LoadGNRMCString(char
*pInputString,std
::vector
<std
::
string
> vecValue, bool bIsCompareChecksum
=
true);
-
/
/生成GNRMC字符串
-
bool CreateGNRMCString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/加载GPGGA字符串
-
bool LoadGPGGAString(char
*pInputString, std
::vector
<std
::
string
> vecValue, bool bIsCompareChecksum
=
true);
-
/
/生成GPGGA字符串
-
bool CreateGPGGAString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/计算经纬度(根据速度和方向计算下一经纬度)
-
void CalcLngLat(float fDirect, float fSpeed, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat);
-
void CalcLngLatEx(float fDirect, float fSpeed, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat, int nKeepSeconds
=
1);
-
/
/计算经纬度(根据距离和方向计算下一经纬度)
-
void CalcLngLatByDistanceAndDirect(float fDirect, double fDistance, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat);
-
-
/
/获取与设置参数
-
void GetLng(double
& fLng,unsigned char
& ucDirect);
-
void SetLng(double fLng, unsigned char ucDirect);
-
-
void GetLat(double
& fLat,unsigned char
& ucDirect);
-
void SetLat(double fLat, unsigned char ucDirect);
-
-
float GetSpeed();
-
void SetSpeed(float fSpeed);
-
-
float GetDirect();
-
void SetDirect(float fDirect);
-
-
unsigned char GetStatus();
-
void SetStatus(unsigned char ucStatus);
-
-
unsigned char GetDeclination();
-
void SetDeclination(unsigned char ucDeclination);
-
-
unsigned char GetDeclinationDirect();
-
void SetDeclinationDirect(unsigned char ucDeclinationDirect);
-
-
unsigned char GetMode();
-
void SetMode(unsigned char ucMode);
-
-
unsigned char GetSatelliteNum();
-
void SetSatelliteNum(unsigned char ucSatelliteNum);
-
-
float GetHDOP();
-
void SetHDOP(float fHDOP);
-
-
float GetHigh();
-
void SetHigh(float fHigh);
-
-
float GetEarthHigh();
-
void SetEarthHigh(float fHigh);
-
-
unsigned int GetDiffTime();
-
void SetDiffTime(unsigned int uiDiffTime);
-
-
unsigned short GetDiffSiteId();
-
void SetDiffSiteId(unsigned short usDiffSiteId);
-
-
unsigned char GetChecksum();
-
void SetChecksum(unsigned char ucChecksum);
-
-
void GetTime(unsigned short
& usYear, unsigned short
& usMonth, unsigned short
& usDay, unsigned short
& usHour,
-
unsigned short
& usMiniute, unsigned short
& usSecond, unsigned short
& usMillsSecond);
-
void SetTime(unsigned short usYear, unsigned short usMonth, unsigned short usDay, unsigned short usHour,
-
unsigned short usMiniute, unsigned short usSecond, unsigned short usMillsSecond);
-
void SetNowTime();
-
-
public:
-
/
/度分转换度
-
static double dm_
to_degree(double dm);
-
-
/
/度转换度分
-
static double degree_
to_dm(double ddd_dddd);
-
-
/
/计算两点经纬度之间的距离
-
static double GpsNmeaDataDistance(double latitude
1, double longitude
1, double latitude
2, double longitude
2);
-
-
protected:
-
/
/计算校验和
-
unsigned char CalcChecksum(unsigned char
*pInput, int nInputSize);
-
-
protected:
-
unsigned char m_ucGpsDataFormat;
/
/GPS数据格式
-
double m_fLng;
/
/经度
-
unsigned char m_ucGpsLngDirect;
-
double m_fLat;
/
/纬度
-
unsigned char m_ucGpsLatDirect;
-
float m_fSpeed;
/
/速度,千米/小时 (一节也是
1.852千米/小时)
-
float m_fDirect;
/
/方向
-
unsigned char m_ucStatus;
/
/GPS状态 A
=数据有效;V
=数据无效
-
unsigned char m_ucDeclination;
/
/磁偏角,(
000
-
180)度(前导位数不足则补
0)
-
unsigned char m_ucDeclinationDirect;
/
/磁偏角方向,E
=东,W
=西
-
unsigned char m_ucMode;
/
/模式,A
=自动,D
=差分,E
=估测,N
=数据无效
-
unsigned char m_ucChecksum;
/
/校验和
-
-
unsigned char m_ucSatelliteNum;
/
/卫星数
-
float m_fHDOP;
/
/HDOP水平精度因子(
0.5~
99.9)
-
float m_fHigh;
/
/海拔高度(-
9999.9~
99999.9)
-
float m_fEarthHigh;
/
/地球椭球面相对大地水准面的高度
-
unsigned int m_uiDiffTime;
/
/差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
-
unsigned short m_usDiffSiteId;
/
/差分站ID号
0000~
1023(前面的
0也将被传输,如果不是差分定位将为空)
-
unsigned short m_usYear;
-
unsigned short m_usMonth;
-
unsigned short m_usDay;
-
unsigned short m_usHour;
-
unsigned short m_usMinute;
-
unsigned short m_usSecond;
-
unsigned short m_usMillsSecond;
-
};
-
//GpsNmeaData.cpp
-
#include "stdafx.h"
-
#include "GpsNmeaData.h"
-
-
-
#define GpsNmeaData_StringSplitMinCount 8 //Gprmc字符串分解子字符串最小个数
-
#define GpsNmeaData_Gnrmc_Head "$GNRMC" //Gps nmea帧头,$GNRMC
-
#define GpsNmeaData_Gprmc_Head "$GPRMC" //Gps nmea帧头,$GPRMC
-
#define GpsNmeaData_Gpgga_Head "$GPGGA" //Gps nmea帧头,$GPGGA
-
-
const
double PI =
3.14159265358979323846;
-
const
double Ea =
6378137;
// 赤道半径
-
const
double Eb =
6356725;
// 极半径
-
-
GpsNmeaData::
GpsNmeaData()
-
{
-
m_ucGpsDataFormat = GpsDataFormat_None;
-
m_fLng =
0.0f;
-
m_ucGpsLngDirect = GpsLngDirect_E;
-
m_fLat =
0.0;
-
m_ucGpsLatDirect = GpsLatDirect_N;
-
m_fSpeed =
0;
-
m_fDirect =
0;
-
m_ucStatus = GpsStatus_Valid;
-
m_ucDeclination =
0;
-
m_ucDeclinationDirect = GpsDeclinationDirect_E;
-
m_ucMode = GpsMode_A;
-
m_ucChecksum =
0;
-
m_usYear =
0;
-
m_usMonth =
0;
-
m_usDay =
0;
-
m_usHour =
0;
-
m_usMinute =
0;
-
m_usSecond =
0;
-
m_usMillsSecond =
0;
-
m_ucSatelliteNum =
0;
-
m_fHDOP =
0.5;
-
m_fHigh =
0;
-
m_fEarthHigh =
0;
-
m_uiDiffTime =
0;
-
m_usDiffSiteId =
0;
-
}
-
-
GpsNmeaData::~
GpsNmeaData()
-
{
-
}
-
-
//设置初始gps数据格式
-
void GpsNmeaData::SetInitGpsDataFormat(unsigned char ucInitGpsDataFormat)
-
{
-
m_ucGpsDataFormat = ucInitGpsDataFormat;
-
}
-
-
//获取与设置参数
-
void GpsNmeaData::GetLng(double & fLng, unsigned char & ucDirect)
-
{
-
fLng = m_fLng;
-
ucDirect = m_ucGpsLngDirect;
-
}
-
void GpsNmeaData::SetLng(double fLng, unsigned char ucDirect)
-
{
-
m_fLng = fLng;
-
m_ucGpsLngDirect = ucDirect;
-
}
-
-
void GpsNmeaData::GetLat(double & fLat, unsigned char & ucDirect)
-
{
-
fLat = m_fLat;
-
ucDirect = m_ucGpsLatDirect;
-
}
-
void GpsNmeaData::SetLat(double fLat, unsigned char ucDirect)
-
{
-
m_fLat = fLat;
-
m_ucGpsLatDirect = ucDirect;
-
}
-
-
float GpsNmeaData::GetSpeed()
-
{
-
return m_fSpeed;
-
}
-
void GpsNmeaData::SetSpeed(float fSpeed)
-
{
-
m_fSpeed = fSpeed;
-
}
-
-
float GpsNmeaData::GetDirect()
-
{
-
return m_fDirect;
-
}
-
void GpsNmeaData::SetDirect(float fDirect)
-
{
-
m_fDirect = fDirect;
-
}
-
-
unsigned char GpsNmeaData::GetStatus()
-
{
-
return m_ucStatus;
-
}
-
void GpsNmeaData::SetStatus(unsigned char ucStatus)
-
{
-
m_ucStatus = ucStatus;
-
}
-
-
unsigned char GpsNmeaData::GetDeclination()
-
{
-
return m_ucDeclination;
-
}
-
void GpsNmeaData::SetDeclination(unsigned char ucDeclination)
-
{
-
m_ucDeclination = ucDeclination;
-
}
-
-
unsigned char GpsNmeaData::GetDeclinationDirect()
-
{
-
return m_ucDeclinationDirect;
-
}
-
void GpsNmeaData::SetDeclinationDirect(unsigned char ucDeclinationDirect)
-
{
-
m_ucDeclinationDirect = ucDeclinationDirect;
-
}
-
-
unsigned char GpsNmeaData::GetMode()
-
{
-
return m_ucMode;
-
}
-
void GpsNmeaData::SetMode(unsigned char ucMode)
-
{
-
m_ucMode = ucMode;
-
}
-
-
unsigned char GpsNmeaData::GetSatelliteNum()
-
{
-
return m_ucSatelliteNum;
-
}
-
void GpsNmeaData::SetSatelliteNum(unsigned char ucSatelliteNum)
-
{
-
m_ucSatelliteNum = ucSatelliteNum;
-
}
-
-
float GpsNmeaData::GetHDOP()
-
{
-
return m_fHDOP;
-
}
-
void GpsNmeaData::SetHDOP(float fHDOP)
-
{
-
m_fHDOP = fHDOP;
-
}
-
-
float GpsNmeaData::GetHigh()
-
{
-
return m_fHigh;
-
}
-
void GpsNmeaData::SetHigh(float fHigh)
-
{
-
m_fHigh = fHigh;
-
}
-
-
float GpsNmeaData::GetEarthHigh()
-
{
-
return m_fEarthHigh;
-
}
-
void GpsNmeaData::SetEarthHigh(float fHigh)
-
{
-
m_fEarthHigh = fHigh;
-
}
-
-
unsigned int GpsNmeaData::GetDiffTime()
-
{
-
return m_uiDiffTime;
-
}
-
void GpsNmeaData::SetDiffTime(unsigned int uiDiffTime)
-
{
-
m_uiDiffTime = uiDiffTime;
-
}
-
-
unsigned short GpsNmeaData::GetDiffSiteId()
-
{
-
return m_usDiffSiteId;
-
}
-
void GpsNmeaData::SetDiffSiteId(unsigned short usDiffSiteId)
-
{
-
m_usDiffSiteId = usDiffSiteId;
-
}
-
-
unsigned char GpsNmeaData::GetChecksum()
-
{
-
return m_ucChecksum;
-
}
-
void GpsNmeaData::SetChecksum(unsigned char ucChecksum)
-
{
-
m_ucChecksum = ucChecksum;
-
}
-
-
void GpsNmeaData::GetTime(unsigned short & usYear, unsigned short & usMonth, unsigned short & usDay, unsigned short & usHour,
-
unsigned
short & usMiniute,
unsigned
short & usSecond,
unsigned
short & usMillsSecond)
-
{
-
usYear = m_usYear;
-
usMonth = m_usMonth;
-
usDay = m_usDay;
-
usHour = m_usHour;
-
usMiniute = m_usMinute;
-
usSecond = m_usSecond;
-
usMillsSecond = m_usMillsSecond;
-
}
-
void GpsNmeaData::SetTime(unsigned short usYear, unsigned short usMonth, unsigned short usDay, unsigned short usHour,
-
unsigned
short usMiniute,
unsigned
short usSecond,
unsigned
short usMillsSecond)
-
{
-
m_usYear = usYear;
-
m_usMonth = usMonth;
-
m_usDay = usDay;
-
m_usHour = usHour;
-
m_usMinute = usMiniute;
-
m_usSecond = usSecond;
-
m_usMillsSecond = usMillsSecond;
-
}
-
void GpsNmeaData::SetNowTime()
-
{
-
//格林威治时间
-
time_t timep;
-
time(&timep);
-
struct
tm* zeroTM =
gmtime(&timep);
-
SetTime(zeroTM->tm_year +
1900,zeroTM->tm_mon+
1,zeroTM->tm_mday,zeroTM->tm_hour,zeroTM->tm_min,zeroTM->tm_sec,
0);
-
}
-
-
//加载GPS字符串
-
bool GpsNmeaData::LoadGPSString(char *pInputString, bool bIsCompareChecksum)
-
{
-
bool bRet =
false;
-
std::vector<std::string> vecValue;
-
int nStringSplitRet =
StringSplit(vecValue, pInputString,
",");
-
if (nStringSplitRet >= GpsNmeaData_StringSplitMinCount)
-
{
-
if (
strcmp(vecValue[
0].
c_str(), GpsNmeaData_Gprmc_Head) ==
0)
-
{
-
//gprmc
-
m_ucGpsDataFormat = GpsDataFormat_GPRMC;
-
bRet =
LoadGPRMCString(pInputString,vecValue, bIsCompareChecksum);
-
}
-
else
if (
strcmp(vecValue[
0].
c_str(), GpsNmeaData_Gnrmc_Head) ==
0)
-
{
-
//gnrmc
-
m_ucGpsDataFormat = GpsDataFormat_GNRMC;
-
bRet =
LoadGNRMCString(pInputString,vecValue, bIsCompareChecksum);
-
}
-
else
if (
strcmp(vecValue[
0].
c_str(), GpsNmeaData_Gpgga_Head) ==
0)
-
{
-
//gpgga
-
m_ucGpsDataFormat = GpsDataFormat_GPGGA;
-
bRet =
LoadGPGGAString(pInputString, vecValue, bIsCompareChecksum);
-
}
-
else
-
{
-
//非法数据格式
-
return
false;
-
}
-
}
-
-
return bRet;
-
}
-
-
//生成GPS字符串
-
bool GpsNmeaData::CreateGPSString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag)
-
{
-
bool bRet =
false;
-
if (m_ucGpsDataFormat == GpsDataFormat_GNRMC)
-
{
-
//GNRMC
-
bRet =
CreateGNRMCString(pOutputString, nOutputStringSize, bIsHasEndFlag);
-
}
-
else
if (m_ucGpsDataFormat == GpsDataFormat_GPRMC)
-
{
-
//GPRMC
-
bRet =
CreateGPRMCString(pOutputString, nOutputStringSize, bIsHasEndFlag);
-
}
-
else
if (m_ucGpsDataFormat == GpsDataFormat_GPGGA)
-
{
-
//GPGGA
-
bRet =
CreateGPGGAString(pOutputString, nOutputStringSize, bIsHasEndFlag);
-
}
-
else
-
{
-
bRet =
CreateGNRMCString(pOutputString, nOutputStringSize, bIsHasEndFlag);
-
}
-
return bRet;
-
}
-
-
//加载GPRMC字符串
-
bool GpsNmeaData::LoadGPRMCString(char *pInputString,std::vector<std::string> vecValue, bool bIsCompareChecksum)
-
{
-
//$GPRMC,212744.000,A,3721.3623,N,12706.8308,E,5.40,161.91,050317,,,A*65
-
bool bRet =
false;
-
//utc时间
-
sscanf(vecValue[
1].
c_str(),
"%2d%2d%2d.%d", &m_usHour, &m_usMinute, &m_usSecond, &m_usMillsSecond);
-
//状态
-
if (vecValue[
2].
size() >
0)
-
{
-
m_ucStatus = vecValue[
2].
c_str()[
0];
-
}
-
else
-
{
-
m_ucStatus = GpsStatus_Invalid;
-
}
-
//纬度
-
double fLatMD =
atof(vecValue[
3].
c_str());
-
m_fLat =
dm_to_degree(fLatMD);
-
//北纬/南纬
-
if (vecValue[
4].
size() >
0)
-
{
-
m_ucGpsLatDirect = vecValue[
4].
c_str()[
0];
-
}
-
//经度
-
double fLngMD =
atof(vecValue[
5].
c_str());
-
m_fLng =
dm_to_degree(fLngMD);
-
//东经/西经
-
if (vecValue[
6].
size() >
0)
-
{
-
m_ucGpsLngDirect = vecValue[
6].
c_str()[
0];
-
}
-
//速度,单位节,一节也是1.852千米/小时
-
float fSpeedByNodeUnit =
atof(vecValue[
7].
c_str());
-
m_fSpeed = fSpeedByNodeUnit *
1.852;
-
//方位角
-
m_fDirect =
atof(vecValue[
8].
c_str());
-
//UTC日期
-
char szDate[
12] = {
0 };
-
strcpy(szDate, vecValue[
9].
c_str());
-
int usYear =
0;
-
int usMonth =
0;
-
int usDay =
0;
-
sscanf(szDate,
"%02d%02d%02d", &usDay, &usMonth, &usYear);
-
m_usYear = usYear;
-
m_usMonth = usMonth;
-
m_usDay = usDay;
-
m_usYear +=
2000;
-
//磁偏角
-
if (vecValue[
10].
size() >
0)
-
{
-
m_ucDeclination = vecValue[
10].
c_str()[
0];
-
}
-
//磁偏角方向
-
if (vecValue[
11].
size() >
0)
-
{
-
m_ucDeclinationDirect = vecValue[
11].
c_str()[
0];
-
}
-
else
-
{
-
m_ucDeclinationDirect = GpsDeclinationDirect_Invalid;
-
}
-
//模式指示、校验
-
sscanf(vecValue[
12].
c_str(),
"%c*%X", &m_ucMode, &m_ucChecksum);
-
//计算校验和比对
-
if (bIsCompareChecksum)
-
{
-
char *pFindStarChar =
strrchr(pInputString,
'*');
-
if (pFindStarChar !=
NULL)
-
{
-
unsigned
char ucTempChecksum =
0;
-
ucTempChecksum =
CalcChecksum((
unsigned
char *)pInputString, pFindStarChar - pInputString +
1);
-
if (ucTempChecksum == m_ucChecksum)
-
{
-
bRet =
true;
-
}
-
}
-
}
-
else
-
{
-
bRet =
true;
-
}
-
-
return bRet;
-
}
-
//生成GPRMC字符串
-
bool GpsNmeaData::CreateGPRMCString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag)
-
{
-
//$GPRMC,212744.000,A,3721.3623,N,12706.8308,E,5.40,161.91,050317,,,A*65
-
bool bRet =
true;
-
//memset(pOutputString, 0, nOutputStringSize);
-
//纬度
-
double fLatMD =
degree_to_dm(m_fLat);
-
//经度
-
double fLngMD =
degree_to_dm(m_fLng);
-
//速度(节)
-
float fSpeedByNodeUnit = m_fSpeed/
1.852;
-
if (m_ucStatus == GpsStatus_Invalid)
-
{
-
//数据无效
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,,,,,,,%02d%02d%02d,,,N*",
-
GpsNmeaData_Gprmc_Head,m_usHour,m_usMinute,m_usSecond,m_usMillsSecond,m_ucStatus,m_usDay,m_usMonth,m_usYear
-2000);
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen(pOutputString);
-
}
-
else
-
{
-
//数据有效
-
if (m_ucDeclinationDirect == GpsDeclinationDirect_Invalid)
-
{
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,%.5f,%c,%.5f,%c,%.2f,%.2f,%02d%02d%02d,,,%c*",
-
GpsNmeaData_Gprmc_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, fSpeedByNodeUnit, m_fDirect,
-
m_usDay, m_usMonth, m_usYear -
2000, m_ucMode);
-
}
-
else
-
{
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,%.5f,%c,%.5f,%c,%.2f,%.2f,%02d%02d%02d,%d,%c,%c*",
-
GpsNmeaData_Gprmc_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, fSpeedByNodeUnit, m_fDirect,
-
m_usDay, m_usMonth, m_usYear -
2000, m_ucDeclination, m_ucDeclinationDirect, m_ucMode);
-
}
-
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen(pOutputString);
-
}
-
return bRet;
-
}
-
-
//加载GNRMC字符串
-
bool GpsNmeaData::LoadGNRMCString(char *pInputString,std::vector<std::string> vecValue,bool bIsCompareChecksum)
-
{
-
//$GNRMC,230134.00,A,2237.12422,N,11408.08310,E,9.291,215.59,310518,,,A*75
-
bool bRet =
false;
-
//utc时间
-
sscanf(vecValue[
1].
c_str(),
"%2d%2d%2d.%d", &m_usHour, &m_usMinute, &m_usSecond, &m_usMillsSecond);
-
//状态
-
if (vecValue[
2].
size() >
0)
-
{
-
m_ucStatus = vecValue[
2].
c_str()[
0];
-
}
-
else
-
{
-
m_ucStatus = GpsStatus_Invalid;
-
}
-
//纬度
-
double fLatMD =
atof(vecValue[
3].
c_str());
-
m_fLat =
dm_to_degree(fLatMD);
-
//北纬/南纬
-
if (vecValue[
4].
size() >
0)
-
{
-
m_ucGpsLatDirect = vecValue[
4].
c_str()[
0];
-
}
-
//经度
-
double fLngMD =
atof(vecValue[
5].
c_str());
-
m_fLng =
dm_to_degree(fLngMD);
-
//东经/西经
-
if (vecValue[
6].
size() >
0)
-
{
-
m_ucGpsLngDirect = vecValue[
6].
c_str()[
0];
-
}
-
//速度,单位节,一节也是1.852千米/小时
-
float fSpeedByNodeUnit =
atof(vecValue[
7].
c_str());
-
m_fSpeed = fSpeedByNodeUnit *
1.852;
-
//方位角
-
m_fDirect =
atof(vecValue[
8].
c_str());
-
//UTC日期
-
char szDate[
12] = {
0 };
-
strcpy(szDate, vecValue[
9].
c_str());
-
int usYear =
0;
-
int usMonth =
0;
-
int usDay =
0;
-
sscanf(szDate,
"%02d%02d%02d", &usDay, &usMonth, &usYear);
-
m_usYear = usYear;
-
m_usMonth = usMonth;
-
m_usDay = usDay;
-
m_usYear +=
2000;
-
//磁偏角
-
if (vecValue[
10].
size() >
0)
-
{
-
m_ucDeclination = vecValue[
10].
c_str()[
0];
-
}
-
//磁偏角方向
-
if (vecValue[
11].
size() >
0)
-
{
-
m_ucDeclinationDirect = vecValue[
11].
c_str()[
0];
-
}
-
else
-
{
-
m_ucDeclinationDirect = GpsDeclinationDirect_Invalid;
-
}
-
//模式指示、校验
-
std::vector<std::string> vecChecksum;
-
StringSplit(vecChecksum, vecValue[
12].
c_str(),
"*");
-
if (vecChecksum.
size() >=
2)
-
{
-
if (vecChecksum[
0].
c_str() >
0)
-
{
-
sscanf(vecChecksum[
0].
c_str(),
"%c", &m_ucMode);
-
}
-
char *stop =
NULL;
-
m_ucChecksum =
strtol(vecChecksum[
1].
c_str(), &stop,
16);
-
}
-
//计算校验和比对
-
if (bIsCompareChecksum)
-
{
-
char *pFindStarChar =
strrchr(pInputString,
'*');
-
if (pFindStarChar !=
NULL)
-
{
-
unsigned
char ucTempChecksum =
0;
-
ucTempChecksum =
CalcChecksum((
unsigned
char *)pInputString, pFindStarChar - pInputString +
1);
-
if (ucTempChecksum == m_ucChecksum)
-
{
-
bRet =
true;
-
}
-
}
-
}
-
else
-
{
-
bRet =
true;
-
}
-
-
return bRet;
-
}
-
//生成GNRMC字符串
-
bool GpsNmeaData::CreateGNRMCString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag)
-
{
-
//$GNRMC,230134.00,A,2237.12422,N,11408.08310,E,9.291,215.59,310518,,,A*75
-
bool bRet =
true;
-
//memset(pOutputString, 0, nOutputStringSize);
-
//纬度
-
double fLatMD =
degree_to_dm(m_fLat);
-
//经度
-
double fLngMD =
degree_to_dm(m_fLng);
-
//速度(节)
-
float fSpeedByNodeUnit = m_fSpeed /
1.852;
-
if (m_ucStatus == GpsStatus_Invalid)
-
{
-
//数据无效
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,,,,,,,%02d%02d%02d,,,N*",
-
GpsNmeaData_Gnrmc_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus, m_usDay, m_usMonth, m_usYear -
2000);
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen(pOutputString);
-
}
-
else
-
{
-
//数据有效
-
if (m_ucDeclinationDirect == GpsDeclinationDirect_Invalid)
-
{
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,%.5f,%c,%.5f,%c,%.3f,%.2f,%02d%02d%02d,,,%c*",
-
GpsNmeaData_Gnrmc_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, fSpeedByNodeUnit, m_fDirect,
-
m_usDay, m_usMonth, m_usYear -
2000, m_ucMode);
-
}
-
else
-
{
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%c,%.5f,%c,%.5f,%c,%.3f,%.2f,%02d%02d%02d,%d,%c,%c*",
-
GpsNmeaData_Gnrmc_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, fSpeedByNodeUnit, m_fDirect,
-
m_usDay, m_usMonth, m_usYear -
2000, m_ucDeclination, m_ucDeclinationDirect, m_ucMode);
-
}
-
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen(pOutputString);
-
}
-
return bRet;
-
}
-
-
//加载GPGGA字符串
-
bool GpsNmeaData::LoadGPGGAString(char *pInputString, std::vector<std::string> vecValue,bool bIsCompareChecksum)
-
{
-
//$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
-
bool bRet =
false;
-
//utc时间
-
sscanf(vecValue[
1].
c_str(),
"%2d%2d%2d.%d", &m_usHour, &m_usMinute, &m_usSecond, &m_usMillsSecond);
-
//纬度
-
double fLatMD =
atof(vecValue[
2].
c_str());
-
m_fLat =
dm_to_degree(fLatMD);
-
//北纬/南纬
-
if (vecValue[
3].
size() >
0)
-
{
-
m_ucGpsLatDirect = vecValue[
3].
c_str()[
0];
-
}
-
//经度
-
double fLngMD =
atof(vecValue[
4].
c_str());
-
m_fLng =
dm_to_degree(fLngMD);
-
//东经/西经
-
if (vecValue[
5].
size() >
0)
-
{
-
m_ucGpsLngDirect = vecValue[
5].
c_str()[
0];
-
}
-
//状态
-
if (vecValue[
6].
size() >
0)
-
{
-
m_ucStatus = vecValue[
6].
c_str()[
0];
-
}
-
else
-
{
-
m_ucStatus =
'0';
-
}
-
//卫星数
-
m_ucSatelliteNum =
atoi(vecValue[
7].
c_str());
-
//HDOP水平精度因子(0.5~99.9)
-
m_fHDOP =
atof(vecValue[
8].
c_str());
-
//海拔高度( - 9999.9~99999.9)
-
m_fHigh =
atof(vecValue[
9].
c_str());
-
//M
-
//地球椭球面相对大地水准面的高度
-
m_fEarthHigh =
atof(vecValue[
11].
c_str());
-
//M
-
//差分时间
-
m_uiDiffTime =
atol(vecValue[
13].
c_str());
-
//差分站ID号、校验
-
std::vector<std::string> vecDiffIno;
-
StringSplit(vecDiffIno, vecValue[
14].
c_str(),
"*");
-
if (vecDiffIno.
size() >=
2)
-
{
-
m_usDiffSiteId =
atoi(vecDiffIno[
0].
c_str());
-
char *stop =
NULL;
-
m_ucChecksum =
strtol(vecDiffIno[
1].
c_str(), &stop,
16);
-
}
-
//计算校验和比对
-
if (bIsCompareChecksum)
-
{
-
char *pFindStarChar =
strrchr(pInputString,
'*');
-
if (pFindStarChar !=
NULL)
-
{
-
unsigned
char ucTempChecksum =
0;
-
ucTempChecksum =
CalcChecksum((
unsigned
char *)pInputString, pFindStarChar - pInputString +
1);
-
if (ucTempChecksum == m_ucChecksum)
-
{
-
bRet =
true;
-
}
-
}
-
}
-
else
-
{
-
bRet =
true;
-
}
-
-
return bRet;
-
}
-
//生成GPGGA字符串
-
bool GpsNmeaData::CreateGPGGAString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag)
-
{
-
//$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
-
bool bRet =
true;
-
//memset(pOutputString, 0, nOutputStringSize);
-
//纬度
-
double fLatMD =
degree_to_dm(m_fLat);
-
//经度
-
double fLngMD =
degree_to_dm(m_fLng);
-
//m_ucStatus 0=未定位,1=非差分定位,2=差分定位,6=正在估算
-
if (m_ucStatus ==
'0')
-
{
-
//数据无效
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,,,,,%c,,,,M,,M,,0000*",
-
GpsNmeaData_Gpgga_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond, m_ucStatus);
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen(pOutputString);
-
}
-
else
-
{
-
//数据有效
-
if (m_ucStatus ==
'2')
-
{
-
//差分定位
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%.4f,%c,%.4f,%c,%c,%02d,%.1f,%.1f,M,%.1f,M,%u,%04d*",
-
GpsNmeaData_Gpgga_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, m_ucStatus,
-
m_ucSatelliteNum,m_fHDOP,m_fHigh,m_fEarthHigh,m_uiDiffTime,m_usDiffSiteId);
-
}
-
else
if (m_ucStatus ==
'1')
-
{
-
//非差分定位
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%.4f,%c,%.4f,%c,%c,%02d,%.1f,%.1f,M,%.1f,M,,0000d*",
-
GpsNmeaData_Gpgga_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, m_ucStatus,
-
m_ucSatelliteNum, m_fHDOP, m_fHigh, m_fEarthHigh);
-
}
-
else
-
{
-
sprintf_s(pOutputString, nOutputStringSize -
1,
"%s,%02d%02d%02d.%03d,%.4f,%c,%.4f,%c,%c,%02d,%.1f,%.1f,M,%.1f,M,,0000*",
-
GpsNmeaData_Gpgga_Head, m_usHour, m_usMinute, m_usSecond, m_usMillsSecond,
-
fLatMD, m_ucGpsLatDirect, fLngMD, m_ucGpsLngDirect, m_ucStatus,
-
m_ucSatelliteNum, m_fHDOP, m_fHigh, m_fEarthHigh);
-
}
-
unsigned
char ucChecksum =
CalcChecksum((
unsigned
char *)pOutputString,
strlen(pOutputString));
-
char szChecksum[
4] = {
0 };
-
sprintf_s(szChecksum,
"%02X", ucChecksum);
-
strcat(pOutputString, szChecksum);
-
if (bIsHasEndFlag)
-
{
-
//是否带结束标记符号,0x0d0x0a
-
char szEndFlag[
4] = {
0 };
-
sprintf_s(szEndFlag,
"%c%c",
0x0d,
0x0a);
-
strcat(pOutputString, szEndFlag);
-
}
-
nOutputStringSize =
strlen
Github个人博客:https://joeyos.github.io
基本脉冲和连续波CW雷达操作
雷达距离方程
function [snr] = radar_eq(pt, freq, g, sigma, b, nf, loss, range)
% 代L的雷达方程
%
% Inputs:
% pt == 峰值功率 in Watts
% freq == 雷达中心频率 in Hz
% g == 天线增益 in dB
% sigma == 目标截面积 in meter squared
% b == 带宽 in Hz
% nf == 噪声系数 in dB
% loss == 雷达损耗 in dB
% range == 目标距离 in Km
%
% Outputs:
% snr == SNR in dB
%
c = 3.0e+8; % speed of light
lambda = c / freq; % wavelength
p_peak = 10*log10(pt); % convert peak power to dB
lambda_sqdb = 10*log10(lambda^2); % compute wavelength square in dB
sigmadb = 10*log10(sigma); % convert sigma to dB
four_pi_cub = 10*log10((4.0 * pi)^3); % (4pi)^3 in dB
k_db = 10*log10(1.38e-23); % Boltzman's constant in dB
to_db = 10*log10(290); % noise temp. in dB
b_db = 10*log10(b); % bandwidth in dB
range_pwr4_db = 10*log10(range.^4); % vector of target range^4 in dB
% Implement Equation (2.22)
num = p_peak + g + g + lambda_sqdb + sigmadb;
den = four_pi_cub + k_db + to_db + b_db + nf + loss + range_pwr4_db;
snr = num - den;
return
- 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
比较三种不同RCS值下的SNR随探测距离变化的曲线:
比较三种不同雷达峰值功率值情况下SNR随探测距离变化的曲线:
% Use this program to reproduce Fig. 2.1 of text.
close all
clear all
pt = 1.5e+6; % peak power in Watts
freq = 5.6e+9; % radar operating frequency in Hz
g = 45.0; % antenna gain in dB
sigma = 0.1; % radar cross section in m squared
b = 5.0e+6; % radar operating bandwidth in Hz
nf = 3.0; % noise figure in dB
loss = 6.0; % radar losses in dB
range = linspace(25e3,165e3,1000); % range to target from 25 Km 165 Km, 1000 points
snr1 = radar_eq(pt, freq, g, sigma, b, nf, loss, range);
snr2 = radar_eq(pt, freq, g, sigma/10, b, nf, loss, range);
snr3 = radar_eq(pt, freq, g, sigma*10, b, nf, loss, range);
% plot SNR versus range
figure(1)
rangekm = range ./ 1000;
plot(rangekm,snr3,'k',rangekm,snr1,'k -.',rangekm,snr2,'k:','linewidth',1.5)
grid
legend('\sigma = 0 dBsm','\sigma = -10dBsm','\sigma = -20 dBsm')
xlabel ('Detection range - Km');
ylabel ('SNR - dB

1131

被折叠的 条评论
为什么被折叠?



