LAMPCAE/src/PluginWBFZExchangePlugin/FEKONearBPBasic.h

162 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#ifndef _FEKONEARBPBASIC_H_
#define _FEKONEARBPBASIC_H_
/**
* 适用于FEKO的近场结果的 BP 成像算法
*
**/
#include "WBFZExchangePluginAPI.h"
#include <complex>
#include <stdlib.h>
#include <stdio.h>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <memory>
#include <vector>
#include "referenceHeader.h"
// FEKO 几何关系处理
/// <summary>
/// 笛卡尔坐标系,转换为 极坐标系
/// </summary>
/// <param name="CartesianPoint">[X,Y,Z;X1,Y1,Z1]</param>
/// <returns></returns>
Eigen::MatrixXd Cartesian2Spherical(Eigen::MatrixXd CartesianPoint);
/// <summary>
/// 时域BP
/// </summary>
class BP2DProcessClass {
public:
size_t height;
size_t width;
Eigen::MatrixXcd echo;
Eigen::MatrixXd AntPosition;
Eigen::VectorXd Frequencylist;
size_t freqnum;
double f1;
double fc;
double Rref; // 成像中心的参考距离
double minX;
double maxX;
double minY;
double maxY;
double centerX;
double centerY;
double Zplane;
size_t ImageHeight;
size_t ImageWidth;
QString out_path;
public:
virtual int initProcess(QString in_path, QString out_path, double Rref, double minX, double maxX, double minY, double maxY, double PlaneZ, int ImageHeight, int ImageWidth);
virtual int readEchoFile(QString in_path);
virtual int saveTiFF(Eigen::MatrixXcd m);
virtual int start();
virtual int logFUN(int percent, QString logtext);
};
int BP2DProcess(QString in_path, QString out_path, double Rref, double minX, double maxX, double minY, double maxY, double PlaneZ,int ImageHeight,int ImageWidth);
// BP 成像时逐像素点计算计算速度慢回波PRFNUM,freqNUM)
template<typename T>
Eigen::MatrixXcd BP2DImageByPixel(Eigen::MatrixXcd timeEcho,Eigen::MatrixXd AntPosition,double minX,double maxX,double minY,double maxY,double PlaneZ ,double Rref,size_t ImageWidth,size_t ImageHeight,double startfreq,size_t timefreqnum,double timeFreqBandWidth, T* logclss=nullptr);
/// <summary>
/// 时域BP --- FBP
/// </summary>
class FBP2DProcessClass:public BP2DProcessClass {
public:
size_t height;
size_t width;
Eigen::MatrixXcd echo;
Eigen::MatrixXd AntPosition;
Eigen::VectorXd Frequencylist;
size_t freqnum;
double f1;
double fc;
double Rref; // 成像中心的参考距离
double minX;
double maxX;
double minY;
double maxY;
double centerX;
double centerY;
double Zplane;
size_t ImageHeight;
size_t ImageWidth;
QString out_path;
public:
virtual int initProcess(QString in_path, QString out_path, double Rref, double minX, double maxX, double minY, double maxY, double PlaneZ, int ImageHeight, int ImageWidth);
virtual int readEchoFile(QString in_path);
virtual int saveTiFF(Eigen::MatrixXcd m);
virtual int start();
virtual int logFUN(int percent, QString logtext);
};
// BP 成像时逐脉冲计算回波PRFNUM,freqNUM)
template<typename T>
Eigen::MatrixXcd BP2DImageByPluse(Eigen::MatrixXcd timeEcho, Eigen::MatrixXd AntPosition, double minX, double maxX, double minY, double maxY, double PlaneZ, double Rref, size_t ImageWidth, size_t ImageHeight, double startfreq, size_t timefreqnum, double timeFreqBandWidth, T* logclss = nullptr);
int FBP2DProcess(QString in_path, QString out_path, double Rref, double minX, double maxX, double minY, double maxY, double PlaneZ, int ImageHeight, int ImageWidth);
// 生成成像的数据文件
int build2Bin(QString path,int width,int height,std::vector<double> &freqs,Eigen::MatrixXd AntPositions,Eigen::MatrixXcd echo);
// 定义插值函数,以处理复数值
std::complex<double> InterpolateComplex(Eigen::MatrixXd& xi, Eigen::MatrixXd& yi, Eigen::MatrixXcd& data, double x, double y);
/// <summary>
/// 远场成像
/// </summary>
class FEKOFarFieldProcessClass :public BP2DProcessClass {
public:
size_t height;
size_t width;
Eigen::MatrixXcd echo;
Eigen::MatrixXd AntPosition; // theta phi 0
Eigen::VectorXd Frequencylist;
size_t freqnum;
double f1;
double fc;
double Rref; // 成像中心的参考距离
double minX;
double maxX;
double minY;
double maxY;
double centerX;
double centerY;
double Zplane;
size_t ImageHeight;
size_t ImageWidth;
QString out_path;
public:
virtual int initProcess(QString in_path, QString out_path, double Rref, double minX, double maxX, double minY, double maxY, double PlaneZ, int ImageHeight, int ImageWidth);
virtual int readEchoFile(QString in_path);
virtual int saveTiFF(Eigen::MatrixXcd m);
virtual int start();
virtual int logFUN(int percent, QString logtext);
// 平均频率间隔
double get_df() { return (this->Frequencylist(this->get_Nf() - 1) - this->Frequencylist(0)) / (this->get_Nf() - 1); };
// 脉冲数
size_t get_Nxa() { return this->AntPosition.rows(); };
// 频率点数
size_t get_Nf() { return this->Frequencylist.rows(); };
double get_minFreq() { return this->Frequencylist(this->get_Nf() - 1) > this->Frequencylist(0) ? this->Frequencylist(0) : this->Frequencylist(this->get_Nf() - 1); };
};
#endif