#include "DataProcessAlgorithm.h" #include <math.h> extern QVector<QVector<QStringList>> phaseVector; extern QVector<QVector<double>> channelAllenSigma; DataProcessAlgorithm::DataProcessAlgorithm(QObject *parent) : QObject(parent) { } double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { int i = 0; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 for (; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d].at(1).toDouble(); double vi1 = phaseVector[index][i+d].at(1).toDouble(); double vi = phaseVector[index][i].at(1).toDouble(); y[i] = pow(vi2 - 2 * vi1 + vi, 2); sum=sum+y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; return allan[1]; } double DataProcessAlgorithm::calAllan(int index, int d, int aN) { int i = 0; double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double allan[2] = {0.0}; double *y = new double[3]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 int logd = log10(d); double sum = channelAllenSigma[index][logd]; for (int j = 3; j > 0; j--) { i = aN - 2*d - j; double v2 = phaseVector[index][i+2*d].at(1).toDouble(); double v1 = phaseVector[index][i+d].at(1).toDouble(); double v0 = phaseVector[index][i].at(1).toDouble(); y[3 - j] = pow(v2 - 2 * v1 + v0, 2); sum += y[3 - j]; } channelAllenSigma[index][logd] += y[0]; allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; return allan[1]; }