Newer
Older
PhaseMeasure / DataProcessAlgorithm.cpp
#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 sum = 0.0;
    double allan[2] = {0.0};
    double tau_2 = pow(d * tau0, 2);				//pow是计算x的y次幂

    int logd = log10(d);

    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();
        double sigma = pow(v2 - 2 * v1 + v0, 2);

        sum = channelAllenSigma[index][logd] + sigma;
        channelAllenSigma[index][logd] = sum;
    }

    allan[0] = sum/(2*tau_2*(aN-2*d));       //delta的平方
    allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta

    return allan[1];
}