波束在自由空间传播快速算法(平面到平面)

本文探讨了波束在自由空间从平面到平面传播的快速算法,包括主极化幅度相位和交叉极化的幅度相位变化。通过详细分析,揭示了算法在无线通信中的应用和重要性。
摘要由CSDN通过智能技术生成
瑞利 - 索末菲衍射积分公式 被广泛的应用于这一问题的分析当中。但由于该公式计算过程中所涉及的巨大的计算量,瑞利-索末菲衍射积分可以理解为两个式子的卷积,可以利用先做FFT,再做IFFT来简化,以下是实现代码,用到了fftw库。

#ifndef CALCUlATION_H
#define CALCULATION_H

#include<cmath>
#include<complex>
#include "Tools/GEMS_Memory.h"
#include "Tools/Constant_Var.h"
#include"calculation/include/FFT.h"

class Calculation
{
public:
    Calculation(double f = 10.65e9, double theta = 0, double theta_h0 = 0, double z0 = 1,int N = 361, int M = 361);
    ~Calculation();

    void Initialization();
    void FreeCal();
    void Setds(double ds1); //设置ds

    //设置输入并补0
    void SetInput(std::complex<double> ** ExIn, std::complex<double> ** EyIn);

    void StartCal();

    //输出Ex Ey Ez Hx Hy Hz 并调用FreeCal
    void output(std::complex<double> ** Ex, std::complex<double> ** Ey, std::complex<double> ** Ez,
        std::complex<double> ** Hx, std::complex<double> ** Hy, std::complex<double> ** Hz );

private:
    //定义复数的乘
    void MulComp(const double r1, const double i1, const double r2, const double i2, double & outR, double & outI);
    std::complex<double> MulComp(std::complex<double> & In, double r2, double i2);
    //插值函数
    double InserVal(const double x0, const double yUp, const double y0, const double yDown);

    //计算传达函数
    void Calh0();

    //对输入场进行旋转
    void Rotate();

    //对输入场进行插值
    //void InserExEy();

private:
    double f; // 频率 默认 10.65e9
    double lamda; // 波长
    double k;
    //double theta;
    //double theta_h0;
    double ds;
    double z0; //目标距离

    int N, M; //计算的点数 一般设为奇数 默认360
    int N2, M2; // N2 = 2 * N -1

    //传递函数
    std::complex<double> ** HExy, ** HEz_x0, **HEz_y0;
    std::complex<double> ** HHx_x0, ** HHx_y0,
        ** HHy_x0, ** HHy_y0,
        ** HHz_x0, ** HHz_y0;

    //补0后的输入
    std::complex<double> ** Ex0, ** Ey0;

    // 帕斯维尔定理
    double     PowerHExy, PowerFFTHExy;
    double     PowerHEz_x0, PowerFFTHEz_x0;
    double     PowerHEz_y0, PowerFFTHEz_y0;
    double     PowerHHx_x0, PowerFFTHHx_x0;
    double     PowerHHx_y0, PowerFFTHHx_y0;
    double     PowerHHy_x0, PowerFFTHHy_x0;
    double     PowerHHy_y0, PowerFFTHHy_y0;
    double     PowerHHz_x0, PowerFFTHHz_x0;
    double     PowerHHz_y0, PowerFFTHHz_y0;

    //Ex1 Ey1 Ez1 Hx1 Hy1 Hz1
    std::complex<double> ** Ex1, ** Ey1, **Ez1;
    std::complex<double> ** Hx1, ** Hy1, **Hz1;
};

#include"calculation/include/Calculation.h"
#include <fstream>

Calculation::Calculation(double f, double theta, double theta_h0, double z0,int N, int M)
	:f(f),z0(z0),N(N),M(M)
{
	lamda = C_Speed / f;
	k = 2 * Pi * f / C_Speed;
	ds = lamda / 3.5;
	N2 = 2 * N - 1;
	M2 = 2 * M - 1;

	PowerHExy = 0;
	PowerHEz_x0 = 0;
	PowerHEz_y0 = 0;
	PowerHHx_x0 = 0;
	PowerHHx_y0 = 0;
	PowerHHy_x0 = 0;
	PowerHHy_y0 = 0;
	PowerHHz_x0 = 0;
	PowerHHz_y0 = 0;

	PowerFFTHExy = 0;
	PowerFFTHEz_x0 = 0;
	PowerFFTHEz_y0 = 0;
	PowerFFTHHx_x0 = 0;
	PowerFFTHHx_y0 = 0;
	PowerFFTHHy_x0 = 0;
	PowerFFTHHy_y0 = 0;
	PowerFFTHHz_x0 = 0;
	PowerFFTHHz_y0 = 0;

	Initialization();
}

Calculation::~Calculation(
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值