#pragma once
#ifndef SARIMAGEBASE_H
#define SARIMAGEBASE_H
/**
*  成像过程中常用的计算函数
****/
#include "referenceHeader.h"
#include "SARBaseTool.h"
// -------------------------------------------  成像 公用库----------------------------------------------------------
// SAR 常用计算的方法
double getRangeResolution(double startfreq, double endfreq);

/// <summary>
/// 方位向分辨率计算
/// </summary>
/// <param name="AzAngleRange">弧度制，方位角变化范围（>=0）</param>
/// <param name="startFreq">起始频率</param>
/// <returns></returns>
double getAzimuthResolution(double AzAngleRange, double startFreq);
// 根据输入数量构建汉明窗
Eigen::MatrixXd hammingWindows(size_t num);


// 频率域汉明窗口

/// <summary>
/// 频率域汉明窗口
/// </summary>
/// <param name="Nf">频率点数</param>
/// <param name="Nxa">脉冲数量</param>
/// <param name="alpha">权重</param>
/// <returns>汉明窗权重</returns>
Eigen::MatrixXd Hanning(size_t Nf, size_t Nxa, double alpha = 0.54);

/// <summary>
/// 获取2的平方数,大于2
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
size_t nextpow2(size_t num);

/// <summary>
/// 对回波沿着行进行一维傅里叶逆变换
/// </summary>
/// <param name="ECHO"></param>
/// <returns></returns>
Eigen::MatrixXcd IFFTW1D(Eigen::MatrixXcd ECHO);


/// <summary>
/// 对回波沿着行进行一维傅里叶变换
/// </summary>
/// <param name="echo"></param>
/// <returns></returns>
Eigen::MatrixXcd FFTW1D(Eigen::MatrixXcd echo);
Eigen::MatrixXcd FFTW2D(Eigen::MatrixXcd ECHO);

Eigen::MatrixXcd fftshift(Eigen::MatrixXcd X);
/// <summary>
/// 对回波 加 hamming 窗
/// </summary>
/// <param name="FreqEcho">频域的回波数据（PRFnum,Freqnum)</param>
/// <returns></returns>
Eigen::MatrixXcd HammingWindows(Eigen::MatrixXcd FreqEcho);


/// <summary>
/// 对回波进行一维插值(并行），不能用来处理极坐标
/// 插值方式为 实部虚部分别进行线性插值
/// </summary>
/// <param name="freqEcho">回波数据,（行数，列数）:（PRFNUM,freqNUM）</param>
/// <param name="SourceFreqlist">回波的 原始频率列表</param>
/// <param name="interpFreqlist">回波的 插值频率列表</param>
/// <returns></returns>
Eigen::MatrixXcd InterpFreqEcho(Eigen::MatrixXcd freqEcho, Eigen::VectorXd SourceFreqlist, Eigen::VectorXd interpFreqlist);


/// <summary>
/// 保存复数矩阵数据 为tiff， 其中，band 1: amp (linear) angle(radia)
/// </summary>
/// <param name="out_tiff_path"></param>
/// <param name="data"></param>
/// <returns></returns>
int WriteComplexData2Amp_Arg(QString out_tiff_path, Eigen::MatrixXcd data);


/// <summary>
/// 保存复数矩阵数据 为tiff， 其中，band 1: amp (dB) angle(radia)
/// </summary>
/// <param name="out_tiff_path"></param>
/// <param name="data"></param>
/// <returns></returns>
int WriteComplexData2AmpdB_Arg(QString out_tiff_path, Eigen::MatrixXcd data);
// ----------------------------------------------------------------------------------------------------------
#endif
