Newer
Older
DevPhaseLib / CasicDevPhase.cpp
TAN YUE on 22 Apr 2022 3 KB 20220422 初始提交
#include "CasicDevPhase.h"

casic::birmm::tflab::CasicDevPhase::CasicDevPhase()
{
    QVector<double> zero(6, 0.0);
    for (int i = 0; i < PHASE_MESSURE_CHANNEL; i++)
    {
        channelDelay.append(0.0); // 初始化各个通道的时延值

        lastSigmaVector.append(0.0); // 初始化计算稳定度时需要的上一个平方和值

        phaseVector.append(zero);
    }

    frameId = 0; // 帧编号初始化为0
    frameCount = 0; // 帧计数初始化为0
}

int casic::birmm::tflab::CasicDevPhase::frameParse(QByteArray rawBytes, qulonglong** frameSN, QList<double>* channelValue, QList<double>* channelExtra)
{
    int retCode = RETURN_STATUS::FAIL;

    if (PhaseProtocolBM::checkFrame(rawBytes) == false)
    {
        // 数据帧尾和长度不对则返回解析失败
        return retCode;
    }

    PhaseDataDto * phaseData = new PhaseDataDto();
    bool parse = PhaseProtocolBM::parseMessureData(rawBytes, phaseData);

    // 解析成功
    if (parse == true)
    {
        frameCount++;

        // 返回帧计数
        frameId = phaseData->frameId.toULongLong(0, 16);
        *frameSN = &frameId;

        // 返回补偿后的测量结果
        for (int i = 0; i < PHASE_MESSURE_CHANNEL; i++)
        {
            double value = phaseData->channelBeforeDelay.at(i) + channelDelay.at(i);
            channelValue->append(value);
        }

        if (frameCount <= 5)
        {
            // 总计小于5帧时无法计算稳定度
            retCode = RETURN_STATUS::INVALID;

            for (int i = 0; i < PHASE_MESSURE_CHANNEL; i++)
            {
                phaseVector[i][frameCount - 1] = phaseData->channelBeforeDelay.at(i);
            }
        } else
        {
            // 开始计算稳定度
            for (int i = 0; i < PHASE_MESSURE_CHANNEL; i++)
            {
                phaseVector[i][5] = phaseData->channelBeforeDelay.at(i); // 最新的一帧数据

                double allen = calcAllen(i, frameCount);
                channelExtra->append(allen);

                // 保留最新的五组数据
                phaseVector[i][0] = phaseVector[i][1];
                phaseVector[i][1] = phaseVector[i][2];
                phaseVector[i][2] = phaseVector[i][3];
                phaseVector[i][3] = phaseVector[i][4];
                phaseVector[i][4] = phaseVector[i][5];
            }

            retCode = RETURN_STATUS::SUCCESS;
        }
    }

    delete phaseData;
    return retCode;
}

int casic::birmm::tflab::CasicDevPhase::setChannelDelay(QList<double> channelDelay)
{
    this->channelDelay = channelDelay;

    return RETURN_STATUS::SUCCESS;
}
QList<double> casic::birmm::tflab::CasicDevPhase::getChannelDelay()
{
    return this->channelDelay;
}

double casic::birmm::tflab::CasicDevPhase::calcAllen(int index, int aN)
{
    int i = 0;
    int d = 1;  //此处只计算秒稳
    double tau0 = 1;    //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s

    double allan = 0.0;
    double *y = new double[4];
    double tau_2 = pow(d * tau0, 2);				//pow是计算x的y次幂
    double sum = lastSigmaVector.at(index);

    for (int j = 4; j > 0; j--)
    {
        i = 6 - 2*d - j;
        double x2 = phaseVector[index][i+2*d];
        double x1 = phaseVector[index][i+d];
        double x = phaseVector[index][i];
        y[4 - j] = pow(x2 - 2 * x1 + x, 2);

        sum = sum + y[4 - j];
    }

    lastSigmaVector[index] += y[0];

    allan = sqrt(sum/(2*tau_2*(aN-2*d))); //delta

    delete[] y;
    return allan;
}