#ifndef CALCULATION_HPP_
#define CALCULATION_HPP_


#include <math.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <fftw3.h>

typedef struct {
    float real, imag;
} complex;

class Calculation {
public:
    Calculation();
    ~Calculation();

    //将数据取平均值
    static float mean(std::vector<float>& vecData);

    //获取样本方差
    static float getSample_variance(std::vector<float> a);

    // hanning 窗
    static void Hanning(std::vector<float>& vecData, std::vector<float>& vecHanningData);

    //快速傅里叶变换函数
    static void FFT(int n, fftw_complex* in, fftw_complex* out);

    //快速傅里叶实数变换函数
    static void FFT_R(int n, std::vector<float>& vecData, fftw_complex* out);

    //快速傅里叶逆变换
    static void iFFT(int n, fftw_complex* in, fftw_complex* out);
    static void _iFFT(std::vector<float>& vecData, std::vector<float>& vecFFTSpecData, std::vector<float>& veciFFTData);
    static void _FFT(std::vector<float>& vecData, std::vector<float>& vecFFTrealData, std::vector<float>& vecFFTimageData);

    //希尔伯特变换
    static void hilbert(std::vector<float>& vecData, std::vector<float>& vecHilbertData, int N);

    //生成正弦信号
    static void GenerateSin(std::vector<float>& vecData);

    // FFT shift
    static void fftShift(fftw_complex* in, int l);

    //频谱图数据
    static void FFTSpec(std::vector<float>& vecData, std::vector<float>& vecFFTSpecData);

    //包络图谱数据
    static void envSpec(std::vector<float>& vecData, std::vector<float>& vecEnvSpecData, int StartFrequency, int EndFrequency);

    static void Integration(std::vector<float>& vecData, std::vector<float>& retData, double& resolution);

    static std::vector<float> fftInterpolate(const std::vector<float>& input, size_t outputSize); 

    bool freqDomainDecimateFFTW(const std::vector<float>& input,
        std::vector<float>& output,
        int factor);
};

#endif // CALCULATION_HPP_
