太阳ECEF坐标计算

在电离层研究、导航精密单点定位过程中,经常需要计算太阳的地心地固ECEF坐标下的坐标,下面给出matlab计算代码,供大家参考:

function [sunECEF] = sunPositionECEF(y, m, D, UT)
% calculate approximate position of sun in Earth-Centered-Fixed-Frame [km]
% 
% INPUT:
%   y               year, 4-digit
%   m               month
%   D               day of month
%   UT              hour of day [UTC]
% OUTPUT:
%	sunECEF         3x1, sun position in ECEF [km]


deg2rad = pi/180;                   % conversion from degree to radiant
AU = 1.49597870e8;                  % [km], 1 Astronomical Unit - mean distance earth-sun
JD = cal2jd_GT(y, m, D + UT/24);    % julian date
MJD = JD - 2400000.5;               % modified julian date

% Formulas adapted from glab
fday = MJD - floor(MJD);
JDN  = MJD - 15019.5;

vl   = mod(279.696678 + 0.9856473354*JDN,360);
gstr = mod(279.690983 + 0.9856473354*JDN + 360*fday + 180,360);
g    = mod(358.475845 + 0.985600267*JDN,360)*deg2rad;

slong = vl + (1.91946-0.004789*JDN/36525)*sin(g) + 0.020094*sin(2*g);
obliq = (23.45229-0.0130125*JDN/36525)*deg2rad;

slp  = (slong-0.005686)*deg2rad;
sind = sin(obliq)*sin(slp);
cosd = sqrt(1-sind*sind);
sdec = atan2(sind,cosd)/deg2rad;
	
sra = 180 - atan2(sind/cosd/tan(obliq),-cos(slp)/cosd)/deg2rad;
	
sunECI = [  cos(sdec*deg2rad) * cos((sra)*deg2rad) * AU;
            cos(sdec*deg2rad) * sin((sra)*deg2rad) * AU;
            sin(sdec*deg2rad) * AU];
        
sunECEF = rot(3,gstr*deg2rad)*sunECI;           % transform to ECEF


function jd = cal2jd_GT(yr, mn, dy)
% cal2jd_GT  Converts calendar date to Julian date using algorithm
%   from "Practical Ephemeris Calculations" by Oliver Montenbruck
%   (Springer-Verlag, 1989). Uses astronomical year for B.C. dates
%   (2 BC = -1 yr). 
% Usage:   jd=cal2jd_GT(yr,mn,dy)
% Input:   yr - calendar year (4-digit including century)
%          mn - calendar month
%          dy - calendar day (including fractional day)
% Output:  jd - jJulian date

jd = 0;     % MFG: added initialization of output argument

if nargin ~= 3
  warning('Incorrect number of input arguments');
  return;
end
if mn < 1 | mn > 12
  warning('Invalid input month');
  return
end
if dy < 1
  if (mn == 2 & dy > 29) | (any(mn == [3 5 9 11]) & dy > 30) | (dy > 31)
    warning('Invalid input day');
    return
  end
end

if mn > 2
  y = yr;
  m = mn;
else
  y = yr - 1;
  m = mn + 12;
end

date1=4.5+31*(10+12*1582);   % Last day of Julian calendar (1582.10.04 Noon)
date2=15.5+31*(10+12*1582);  % First day of Gregorian calendar (1582.10.15 Noon)
date=dy+31*(mn+12*yr);

if date <= date1
  b = -2;
elseif date >= date2
  b = fix(y/400) - fix(y/100);
else
  warning('Dates between October 5 & 15, 1582 do not exist');
  return;
end

if y > 0
  jd = fix(365.25*y) + fix(30.6001*(m+1)) + b + 1720996.5 + dy;
else
  jd = fix(365.25*y-0.75) + fix(30.6001*(m+1)) + b + 1720996.5 + dy;
end

function R = rot(ax, alpha)
% Creates rotation matrix
% 
% INPUT:
%   ax        number of axis
%   alpha     angle to rotate
% OUTPUT:
%   rotation matrix

switch ax
    case 3      % z-axis
        R = [ cos(alpha)  sin(alpha)  0
             -sin(alpha)  cos(alpha)  0
                  0            0      1];
    case 2      % y-axis
        R = [ cos(alpha)  0  sin(alpha)
                  0       1      0
             -sin(alpha)  0  cos(alpha)];
    case 1      % x-axis
        R = [1       0           0
             0   cos(alpha)  sin(alpha)
             0  -sin(alpha)  cos(alpha)];
end

测试结果如下:

 [sunECEF] = sunPositionECEF(2024, 6, 24, 5.4)

  sunECEF =

   1.0e+08 *

   -0.2296
    1.3536
    0.5941

计算多普勒频移,可以使用以下公式: $$f_D = -\frac{2v}{c}f_0\sin\theta$$ 其中,$v$ 是接收器和发射器之间的相对速度,$c$ 是光速,$f_0$ 是发射频率,$\theta$ 是信号的仰角。 如果已知接收器和发射器的 ECEF 坐标,可以使用以下方法计算相对速度 $v$ 和信号的仰角 $\theta$: ```MATLAB % 输入参数 f0 = 10e9; % 发射频率 rE = 6378137; % 地球半径 c = 3e8; % 光速 receiverECEF = [0, 0, 0]; % 接收器 ECEF 坐标,单位为米 satelliteECEF = [1e7, 1e7, 1e7]; % 卫星 ECEF 坐标,单位为米 receiverLLH = ecef2lla(receiverECEF); % 将接收器 ECEF 坐标转换为经纬高 satelliteLLH = ecef2lla(satelliteECEF); % 将卫星 ECEF 坐标转换为经纬高 % 计算相对速度 receiverENU = ecef2enu(receiverECEF, receiverLLH); % 将接收器 ECEF 坐标转换为东北天坐标系 satelliteENU = ecef2enu(satelliteECEF, receiverLLH); % 将卫星 ECEF 坐标转换为接收器所在经度的东北天坐标系 vENU = satelliteENU - receiverENU; % 计算卫星和接收器之间的相对速度(东北天坐标系) vECEF = enu2ecef(vENU, receiverLLH); % 将相对速度转换为 ECEF 坐标系 v = norm(vECEF); % 计算相对速度的模长 % 计算仰角 [az, el, ~] = geodetic2aer(satelliteLLH(1), satelliteLLH(2), satelliteLLH(3), receiverLLH(1), receiverLLH(2), receiverLLH(3), wgs84Ellipsoid); theta = pi/2 - el; % 将仰角转换为弧度制,并计算相对于垂直方向的角度 % 计算多普勒频移 fD = -(2*v/c)*f0*sin(theta); % 输出结果 fprintf('多普勒频移为: %.2f Hz\n', fD); ``` 请注意,此代码中使用了 MATLAB 自带的一些函数来进行 ECEF 坐标系和经纬高坐标系之间的转换,包括 `ecef2lla`、`ecef2enu`、`enu2ecef`、`geodetic2aer`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值