% 计算OAM的3D方向图
% 最后修改 20170927
clc
clear
close all
format long
%% wave parameters
c=3e8; % 光速
f=10e9; % 发射频率
lambda=c/f; % 发射波长
k=2*pi/lambda; % 传播常数
w=2*pi*f; % 传播角频率
fs=2000e9; % 采样频率
ts=1/fs; % 采样时间间隔
%% 等效OAM参数
radius=10*lambda;
Na = 400;
l=2;
PhiNa=2*pi/Na*(0:Na-1); % 各个天线的方位
LocAtnas=radius*[cos(PhiNa);sin(PhiNa);zeros(1,Na)]; % 各个天线的坐标
Theta = 0:.01:pi; % 俯仰
Phi = 0:.01:2*pi; % 方位
NPhi = length(Phi);
NTheta = length(Theta);
%% 计算OAM主瓣方向图 沿着方位为0的二维方向图
RadiPattern = zeros(length(Phi),length(Theta)); % 辐射方向图
for ii=1:length(Theta)
rA=-radius*cos(Theta(ii))*cos(repmat(PhiNa',1,NPhi)-repmat(Phi,Na,1)); % 天线沿theta方向的等效距离
RadiPattern(:,ii)=abs(sum(exp(1j*k*rA).*exp(1j*l*repmat(PhiNa',1,NPhi)))); % 求辐射方向图
end
% maxValue=max(RadiPattern); %整个360°的最大值,为了在画极坐标图的时候最大值是1,否则很可能出现1.5导致图不好看
% thetaMax0 = Theta(index);
% rAMax=-radius*cos(thetaMax0)*cos(PhiNa);
% figure
% polar(Theta,RadiPattern/maxValue); % 极坐标方向图
[MaxValuesC,IndexsC]=max(RadiPattern); % 找二维方向图数组当中的最大值
[MaxValue,Index] = max(MaxValuesC);
ThetaMax = Theta(Index); % 最大Theta方向
PhiMax = Phi(IndexsC(Index)); % 最大Phi方向
[ThetaGd, PhiGd] = meshgrid(Theta,Phi); %
RadiPatternNorm = RadiPattern/MaxValue;
figure
mesh(ThetaGd,PhiGd,RadiPatternNorm)
XGd = RadiPatternNorm.*cos(ThetaGd).*cos(PhiGd); % 坐标系转换
YGd = RadiPatternNorm.*cos(ThetaGd).*sin(PhiGd);
ZGd = RadiPatternNorm.*sin(ThetaGd);
figure
mesh(XGd,YGd,ZGd)
axis equal %纵、横坐标采用等长刻度
title(['归一化电场方向图 \itl=' num2str(l) ' \itN=' num2str(Na) ' \itR=' num2str(radius)])
%% 计算有OAM调制的环形天线阵并指定主波束方向的方向图 沿着方位为0的二维方向图
RadiPattern = zeros(length(Phi),length(Theta)); % 辐射方向图
for ii=1:length(Theta)
rA=-radius*cos(Theta(ii))*cos(repmat(PhiNa',1,NPhi)-repmat(Phi,Na,1)); % 天线沿theta方向的等效距离
RadiPattern(:,ii)=abs(sum(exp(1j*k*rA).*exp(1j*k*radius*cos(ThetaMax)*cos(repmat(PhiNa',1,NPhi)-PhiMax)).*exp(1j*l*repmat(PhiNa',1,NPhi)))); % 求辐射方向图
end
RadiPatternNorm = RadiPattern/MaxValue;
figure
mesh(ThetaGd,PhiGd,RadiPatternNorm)
XGd = RadiPatternNorm.*cos(ThetaGd).*cos(PhiGd); % 坐标系转换
YGd = RadiPatternNorm.*cos(ThetaGd).*sin(PhiGd);
ZGd = RadiPatternNorm.*sin(ThetaGd);
figure
mesh(XGd,YGd,ZGd)
axis equal %纵、横坐标采用等长刻度
title(['归一化电场方向图 \itl=' num2str(l) ' \itN=' num2str(Na) ' \itR=' num2str(radius)])
% %% 计算在主波束方向上相位梯度的情况
% z = 2000*lambda; % 接收窗口
% Nx = 400;
% Ny = 400;
% Dx = 100*lambda;
% Dy = 100*lambda;
% xRange = linspace(-Dx,Dx,Nx);
% % yRange = linspace(z/tan(maxTheta)-Dy,z/tan(maxTheta)+Dy,Ny); % 对到主波束
% yRange = linspace(-Dy,Dy,Ny);
% Signals = zeros(Nx,Ny);
%
% for ia=1:Na % 计算接收窗口处的相位
% Mtxx=repmat(yRange,[1,Nx]);
% Mtxy=repmat(xRange,[Ny,1]);
% Mtxy=Mtxy(:).';
% Mtx=[Mtxy;Mtxx;z*ones(1,Nx*Ny)];
% dists=repmat(LocAtnas(:,ia),[1,Nx*Ny])-Mtx;
% dists=sqrt(sum(dists.^2));
% Signals=Signals+reshape(exp(1j*k*dists).*exp(1j*k*radius*cos(theta0)*cos(PhiNa(ia))).*exp(1j*l*PhiNa(ia)),Nx,Ny);% sum by antennas
% end
% figure
% imagesc(xRange,yRange,abs(Signals));
% xlabel('x (m)')
% ylabel('y (m)')
% figure
% imagesc(xRange,yRange,angle(Signals));
% xlabel('x (m)')
% ylabel('y (m)')
%% 二次补偿 计算有OAM调制的环形天线阵并指定主波束方向的方向图 沿着方位为0的二维方向图 失败没用
% theta0 = thetaMax0;
% theta1 = pi/2-thetaMax1;
% RadiPattern = zeros(1,length(Theta)); % 辐射方向图
% for ii=1:length(Theta)
% rA=-radius*cos(Theta(ii))*cos(PhiNa); % 天线沿theta方向的等效距离
% RadiPattern(ii) = abs(sum(exp(1j*k*rA).*exp(1j*k*radius*cos(theta0)*cos(PhiNa)).*exp(1j*k*radius*cos(theta1)*cos(PhiNa)).*exp(1j*l*PhiNa))); % 求辐射方向图
% end
% figure
% plot(Theta, RadiPattern);
% [maxValue,index]=max(RadiPattern);
% thetaMax0 = Theta(index);
% rAMax=-radius*cos(thetaMax0)*cos(PhiNa);
% figure
% polar(Theta,RadiPattern/maxValue); % 极坐标方向图
% title(['归一化电场方向图 \itl=' num2str(l) ' \itN=' num2str(Na) ' \itR=' num2str(radius)])