C++ 对实时数据应用峰值检测算法

C++ 对实时数据应用峰值检测算法,c++,C++,我有一个功能来检测实时数据的峰值。线程中提到了算法。看起来是这样的: std::vector<int> smoothedZScore(std::vector<float> input) { //lag 5 for the smoothing functions int lag = 5; //3.5 standard deviations for signal float threshold = 3.5; //between 0 an

我有一个功能来检测实时数据的峰值。线程中提到了算法。看起来是这样的:

std::vector<int> smoothedZScore(std::vector<float> input)
{
    //lag 5 for the smoothing functions
    int lag = 5;
    //3.5 standard deviations for signal
    float threshold = 3.5;
    //between 0 and 1, where 1 is normal influence, 0.5 is half
    float influence = .5;

    if (input.size() <= lag + 2)
    {
        std::vector<int> emptyVec;
        return emptyVec;
    }

    //Initialise variables

    std::vector<int> signal(input.size(), 0.0);
    std::vector<float> filteredY(input.size(), 0.0);
    std::vector<float> avgFilter(input.size(), 0.0);
    std::vector<float> stdFilter(input.size(), 0.0);
    std::vector<float> subVecStart(input.begin(), input.begin() + lag);

    double sum = std::accumulate(std::begin(subVecStart), std::end(subVecStart), 0.0);
    double mean =  sum / subVecStart.size();

    double accum = 0.0;
    std::for_each (std::begin(subVecStart), std::end(subVecStart), [&](const double d) {
        accum += (d - mean) * (d - mean);
    });

    double stdev = sqrt(accum / (subVecStart.size()-1));
    //avgFilter[lag] = mean(subVecStart);
    avgFilter[lag] = mean;
    //stdFilter[lag] = stdDev(subVecStart);
    stdFilter[lag] = stdev;

    for (size_t i = lag + 1; i < input.size(); i++)
    {
        if (std::abs(input[i] - avgFilter[i - 1]) > threshold * stdFilter[i - 1])
        {
            if (input[i] > avgFilter[i - 1])
            {
                signal[i] = 1; //# Positive signal
            }
            else
            {
                signal[i] = -1; //# Negative signal
            }
            //Make influence lower
            filteredY[i] = influence* input[i] + (1 - influence) * filteredY[i - 1];
        }
        else
        {
            signal[i] = 0; //# No signal
            filteredY[i] = input[i];
        }
        //Adjust the filters
        std::vector<float> subVec(filteredY.begin() + i - lag, filteredY.begin() + i);
//        avgFilter[i] = mean(subVec);
//        stdFilter[i] = stdDev(subVec);
    }
    return signal;
}

如何将该值传递给上述函数并检测峰值

我试着称之为:
x分

但给了我一个错误:

settings.cpp:230:40: error: no matching function for call to 'smoothedZScore'
settings.cpp:92:18: note: candidate function not viable: no known conversion from 'double' to 'std::vector<float>' for 1st argument
settings.cpp:230:40:错误:调用“SmoothdzScore”时没有匹配函数
settings.cpp:92:18:注意:候选函数不可行:没有已知的第一个参数从'double'到'std::vector'的转换
编辑

该算法至少需要7个样本才能输入。因此,我想我可能需要将实时数据存储在缓冲区中

但我很难理解如何将样本存储在缓冲区中并应用于峰值检测算法


你能给我一个可能的解决方案吗?

你需要重写算法。你的问题不仅仅是一个实时问题,你还需要一个解决方案。你的功能不是因果关系


实际上,您需要一个类,该类也需要。

您计划如何从一个值检测峰值?正如您链接的答案中所述,该算法至少需要
lag+2
输入。我尝试调用它:
smootedzscore(x)
什么类型的
x
?从您公开的错误消息中,我推断它是
double x。您不能传递类型
double
,其中唯一需要的是
std::vector
。您可以改为
SmoothdzScore({x})
(或者更明确地说
SmoothdzScore(std::vector(1,x));
。但是,您确定只使用1个值调用函数有意义吗?大家好,非常感谢您的反馈。我刚刚编辑了OP。有人能帮助如何将实时数据存储到缓冲区并应用于算法吗?
settings.cpp:230:40: error: no matching function for call to 'smoothedZScore'
settings.cpp:92:18: note: candidate function not viable: no known conversion from 'double' to 'std::vector<float>' for 1st argument