Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
  #ifndef SENSORUNLINEARITYCORRECTION_H
#define SENSORUNLINEARITYCORRECTION_H

#include <QObject>
#include <QVector>

// Error correction class for sensors
// Luokka kalibrointikäyrän muodostamiseksi epälineaariselle anturille
class SensorUnlinearityCorrection : public QObject
{
Q_OBJECT
public:
    explicit SensorUnlinearityCorrection(QObject *parent = 0);
//funktio SensorErrorCorrection laskee oikean arvon parametrina annetulle anturilta tulevalle arvolle
    double SensorErrorCorrection(double in);
//funktio CalcCalibrationConstants laskee suoranpätkien kulmakertoimet (a:t) sekä siirtymät suorien alkupisteissä (b:t)
    void CalcCalibrationConstants();
private:
//muuttujat CorrectVal ja ValFromSensor ovat vektoripari, joista ensimmäinen sisältää "oikean" mitta-arvon joka saadaan vertailumittauksella ja
//jälkimmäinen on anturilta tuleva arvo. Näiden perusteella lasketaan suorien pätkien kulmakertoimet ja virheet suorien alkupisteissä eli a ja b
    QVector <double> CorrectVal;
    QVector <double> ValFromSensor;
    QVector <double> a,b;//angle offset
signals:

public slots:

};

#endif // SENSORUNLINEARITYCORRECTION_H
Code Block
 #include "sensorunlinearitycorrection.h"

SensorUnlinearityCorrection::SensorUnlinearityCorrection(QObject *parent) :
    QObject(parent)
{
    //esimerkkina arvot kolmessa kohdassa mitta-aluetta
    CorrectVal.append(0.0);
    ValFromSensor.append(0.0);
    CorrectVal.append(50.0);
    ValFromSensor.append(52.0);
    CorrectVal.append(100.0);
    ValFromSensor.append(98.0);
}

// kertoimien laskenta
void SensorUnlinearityCorrection::CalcCalibrationConstants()
{
    int i;
    int length = CorrectVal.size();
    a.empty();
    b.empty();
    for(i=0;i<length;i++)
    {
        b.append(CorrectVal[i]-ValFromSensor[i]);
    }
    for(i=0;i<(length-1);i++)
    {
        a.append((b[i+1]-b[i])/(CorrectVal[i+1]-CorrectVal[i]));
    }
}

//oikean arvon  haku
double SensorUnlinearityCorrection::SensorErrorCorrection(double in)
{
    int length = CorrectVal.size();
    int i;
    double out;
    for(i=0;i<(length-1);i++)
    {
        if(in>=CorrectVal[i]&&in<=CorrectVal[i+1])
        {
            out=in+(in-CorrectVal[i])*a[i]+b[i];
            return out;
        }
    }
    out=in;
    return out;
}

...