wirelessgateway/calculation/Calculation.hpp

156 lines
2.2 KiB
C++
Raw Normal View History

2021-09-18 13:45:24 +08:00
#ifndef CALCULATION_H_
#define CALCULATION_H_
#include <vector>
#include <math.h>
#include <fftw3.h>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string.h>
#include "../utility/SH_MySingleton.hpp"
#define pi 3.1415
typedef struct
{
float real,imag;
}complex;
class Calculation : public MySingleton<Calculation>
{
public:
Calculation();
~Calculation();
//最大值
float max(std::vector<float> & vecData);
//最小值
float min(std::vector<float> & vecData);
//将数据取绝对值
void absVec(std::vector<float> & vecAbsData, std::vector<float> & vecData);
//将数据取平均值
float mean(std::vector<float> & vecData);
//将数据平方处理 数据有效值
float rms(std::vector<float> & vecData);
//去数据的直流分量
void drop_mean(std::vector<float> & vecDropMeanData, std::vector<float> & vecData);
//方根幅值
float srm(std::vector<float> & vecData);
//方差
float variance(std::vector<float> & vecDropMeanData);
//偏态指标
float skew_state(std::vector<float> & vecDropMeanData, float fVariance);
//峭度指标
float kurtosis(std::vector<float> & vecDropMeanData, float fVariance);
//快速傅里叶变换函数
void FFT(int n, fftw_complex* in, fftw_complex* out);
//快速傅里叶实数变换函数
void FFT_R(int n, std::vector<float> & vecData, fftw_complex* out);
//快速傅里叶逆变换
void iFFT(int n, fftw_complex* in, fftw_complex* out);
//通道幅值和相位提取
//输入为FFT变换后的数据长度及数据指定的频率输出为计算后得到的幅值 和 相位
void caculateAmp_Pha(int n, fftw_complex* in, int frequency, double &amplitude, double &phase);
//希尔伯特变换
void hilbert(std::vector<float> & vecData, std::vector<float> & vecHilbertData, int N);
//FFT shift
void fftShift(fftw_complex* in, int l);
//频谱图数据
void FFTSpec(std::vector<float> & vecData, std::vector<float> & vecFFTSpecData);
//包络图谱数据
void envSpec(std::vector<float> & vecData, std::vector<float> & vecEnvSpecData);
};
#endif