DataPlayer/ChaosDataPlayer/Calculation.hpp
2022-08-05 19:46:35 +08:00

108 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef CALCULATION_H_
#define CALCULATION_H_
#include <QVector>
#include <QDebug>
#include <math.h>
#include "fftw3.h"
#include <QMath.h>
#include <complex>
typedef struct
{
float real,imag;
}complex;
class Calculation
{
public:
Calculation();
~Calculation();
//将数据取绝对值
void absVec(QVector<float> & vecAbsData, QVector<float> & vecData);
//将数据取平均值
static float mean(QVector<float> & vecData);
//将数据平方处理 数据有效值
float rms(QVector<float> & vecData);
//去数据的直流分量
static void drop_mean(QVector<float> & vecDropMeanData, QVector<float> & vecData);
//方根幅值
float srm(QVector<float> & vecData);
//方差
float variance(QVector<float> & vecDropMeanData);
//偏态指标
float skew_state(QVector<float> & vecDropMeanData, float fVariance);
//峭度指标
float kurtosis(QVector<float> & vecDropMeanData, float fVariance);
//快速傅里叶变换函数
static void FFT(int n, fftw_complex* in, fftw_complex* out);
//快速傅里叶实数变换函数
void FFT_R(int n, QVector<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);
//希尔伯特变换
static void hilbert(QVector<double> & vecData, QVector<double> & vecHilbertData, int N);
//FFT shift
static void fftShift(fftw_complex* in, int l);
//频谱图数据
static void FFTSpec(QVector<double> & vecData, QVector<double> & vecFFTSpecData);
void _FFT(QVector<double> & vecData, QVector<double> & vecFFTrealData,QVector<double> & vecFFTimageData);
void _fft(QVector<double> & vecData, QVector<double> & vecFFTrealData,QVector<double> & vecFFTimageData);
void _iFFT(QVector<double> & vecData, QVector<double> & vecFFTSpecData,QVector<double> & veciFFTData);
//积分
void _Integration(QVector<double> & vecData,QVector<double>& retData,double& RMS);
//微分
void _Differentiation(QVector<double> & vecData,QVector<double>& retData);
//包络图谱数据
void envSpec(QVector<double> & vecData, QVector<double> & vecEnvSpecData,int StartFrequency,int EndFrequency,bool PolarPlot=false);
//hanning 窗
void Hanning(QVector<double> & vecData,QVector<double> & vecHanningData);
//相位计算
double Phase(QVector<double> & vecData);
QVector<double> ComputeDenCoeffs(int FilterOrder, double Lcutoff, double Ucutoff);
QVector<double> TrinomialMultiply(int FilterOrder, QVector<double>& b, QVector<double>& c);
QVector<double> ComputeNumCoeffs(int FilterOrder, double Lcutoff, double Ucutoff, QVector<double>& DenC);
QVector<double> ComputeLP(int FilterOrder);
QVector<double> ComputeHP(int FilterOrder);
//vector<double> filter(int ord, vector<double> a, vector<double> b, int np, vector<double> x);
//巴特沃斯滤波
QVector<double> filter(QVector<double>&x, QVector<double>& coeff_b, QVector<double>& coeff_a);
void ButterWorth(QVector<double>& inData,double *FrequencyBands,QVector<double>& outData);
};
#endif