Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) QwtExample5

 

QwtQtQt CreatorLubuntuUbuntuWindows

 

Qwt example 5: alpha filter added is a Qwt example that shows how to add two timeseries to a QwtPlot.

 

Technical facts

 

Operating system(s) or programming environment(s)

IDE(s):

Project type:

C++ standard:

Compiler(s):

Libraries used:

 

 

 

 

 

Qt project file: ./CppQwtExample5/CppQwtExample5.pro

 

#Qwt does not go together with Qwt
include(../../DesktopApplicationNoWeffcpp.pri)
include(../../Libraries/Qwt.pri)

SOURCES += main.cpp\
        qtdialog.cpp \
    alphabetafilter.cpp \
    alphafilter.cpp

HEADERS  += qtdialog.h \
    alphabetafilter.h \
    alphafilter.h

FORMS    += qtdialog.ui

 

 

 

 

 

./CppQwtExample5/alphabetafilter.h

 

#ifndef ALPHABETAFILTER_H
#define ALPHABETAFILTER_H

struct AlphaBetaFilter
{
  AlphaBetaFilter(
    const double alpha = 0.1 ,
    const double beta  = 0.01,
    const double dt    = 1.0
  );

  double Estimate(const double input);

  private:
  const double m_alpha;
  const double m_beta;
  const double m_dt;

  double m_hidden;
  double m_output;
};

#endif // ALPHABETAFILTER_H

 

 

 

 

 

./CppQwtExample5/alphabetafilter.cpp

 

#ifdef _WIN32
//See http://www.richelbilderbeek.nl/CppCompileErrorSwprintfHasNotBeenDeclared.htm
#undef __STRICT_ANSI__
#endif

//#include own header file as first substantive line of code, from:
// * John Lakos. Large-Scale C++ Software Design. 1996. ISBN: 0-201-63362-0. Section 3.2, page 110
#include "alphabetafilter.h"

#include <cassert>

AlphaBetaFilter::AlphaBetaFilter(
  const double alpha,
  const double beta,
  const double dt)
  : m_alpha(alpha),
    m_beta(beta),
    m_dt(dt),
    m_hidden(0.0),
    m_output(0.0)
{
  //assert(m_alpha >= 0.0 && m_alpha <  1.0);
  //assert(m_beta  >= 0.0 && m_beta  <= 2.0); //beta > 1.0 amplifies noise
  //assert(4.0 - (2.0 * m_alpha - m_beta) > 0.0);
  assert(m_dt != 0.0);
}


double AlphaBetaFilter::Estimate(const double input)
{
  double new_output = m_output + ( m_hidden * m_dt );
  double new_hidden = m_hidden;

  const double difference = input - new_output;

  new_output += m_alpha * difference;
  new_hidden += m_beta  * difference / m_dt;

  m_output = new_output;
  m_hidden = new_hidden;

  return m_output;
}

 

 

 

 

 

./CppQwtExample5/alphafilter.h

 

#ifndef ALPHAFILTER_H
#define ALPHAFILTER_H

struct AlphaFilter
{
  AlphaFilter(
    const double alpha = 0.1 ,
    const double dt    = 1.0
  );

  double Estimate(const double input);

  private:
  const double m_alpha;
  const double m_dt;

  double m_output;
};

#endif // ALPHAFILTER_H

 

 

 

 

 

./CppQwtExample5/alphafilter.cpp

 

#ifdef _WIN32
//See http://www.richelbilderbeek.nl/CppCompileErrorSwprintfHasNotBeenDeclared.htm
#undef __STRICT_ANSI__
#endif

//#include own header file as first substantive line of code, from:
// * John Lakos. Large-Scale C++ Software Design. 1996. ISBN: 0-201-63362-0. Section 3.2, page 110
#include "alphafilter.h"

#include <cassert>

AlphaFilter::AlphaFilter(
  const double alpha,
  const double dt)
  : m_alpha(alpha),
    m_dt(dt),
    m_output(0.0)
{
  //assert(m_alpha >= 0.0 && m_alpha <  1.0);
  //assert(m_beta  >= 0.0 && m_beta  <= 2.0); //beta > 1.0 amplifies noise
  //assert(4.0 - (2.0 * m_alpha - m_beta) > 0.0);
  assert(m_dt != 0.0);
}


double AlphaFilter::Estimate(const double input)
{
  const double difference = input - m_output;

  m_output += m_alpha * difference;

  return m_output;
}

 

 

 

 

 

./CppQwtExample5/main.cpp

 

#include <QApplication>
#include "qtdialog.h"

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QtDialog w;
  w.show();
  
  return a.exec();
}

 

 

 

 

 

./CppQwtExample5/qtdialog.h

 

#ifndef QTDIALOG_H
#define QTDIALOG_H

#ifdef _WIN32
//See http://www.richelbilderbeek.nl/CppCompileErrorSwprintfHasNotBeenDeclared.htm
#undef __STRICT_ANSI__
#endif

#include <QDialog>

struct QwtPlotCurve;

namespace Ui {
  class QtDialog;
}

class QtDialog : public QDialog
{
  Q_OBJECT
  
public:
  explicit QtDialog(QWidget *parent = 0);
  ~QtDialog();
  
private slots:
  void Run();

  void on_box_type_currentIndexChanged(int index);

private:
  Ui::QtDialog *ui;

  QwtPlotCurve * const m_curve_inputs;
  QwtPlotCurve * const m_curve_outputs;
};

#endif // QTDIALOG_H

 

 

 

 

 

./CppQwtExample5/qtdialog.cpp

 

#include "qtdialog.h"

#include "qwt_plot.h"
#include "qwt_plot_curve.h"

#include "alphafilter.h"
#include "alphabetafilter.h"
#include "ui_qtdialog.h"

#if QWT_VERSION >= 0x060100 || !WIN32
#include "qwt_point_data.h"
#endif

QtDialog::QtDialog(QWidget *parent) :
  QDialog(parent),
  ui(new Ui::QtDialog),
  m_curve_inputs(new QwtPlotCurve("Inputs")),
  m_curve_outputs(new QwtPlotCurve("Outputs"))
{
  ui->setupUi(this);

  #ifdef _WIN32
  ui->plot->setCanvasBackground(QBrush(QColor(255,255,255)));
  #else
  ui->plot->setCanvasBackground(QColor(255,255,255));
  #endif

  m_curve_inputs->attach(ui->plot);
  m_curve_inputs->setStyle(QwtPlotCurve::Lines);
  m_curve_inputs->setPen(QPen(QColor(128,128,128)));

  m_curve_outputs->attach(ui->plot);
  m_curve_outputs->setStyle(QwtPlotCurve::Lines);
  m_curve_outputs->setPen(QPen(QColor(0,0,0)));

  QObject::connect(ui->alpha,SIGNAL(valueChanged(int)),this,SLOT(Run()));
  QObject::connect(ui->beta,SIGNAL(valueChanged(int)),this,SLOT(Run()));
  QObject::connect(ui->dt,SIGNAL(valueChanged(int)),this,SLOT(Run()));
  ui->box_type->setCurrentIndex(1);
  Run();
}

QtDialog::~QtDialog()
{
  delete ui;
}

void QtDialog::Run()
{
  const int timesteps = 100;
  std::vector<double> inputs;
  std::vector<double> outputs;
  const double alpha
    = 1.0 * static_cast<double>(ui->alpha->value())
    / static_cast<double>(ui->alpha->maximum());
  const double beta
    = 2.0 * static_cast<double>(ui->beta->value())
    / static_cast<double>(ui->beta->maximum());
  const double dt
    = 1.0 * static_cast<double>(ui->dt->value())
    / static_cast<double>(ui->dt->maximum());

  ui->value_alpha->setText(QString::number(alpha));
  ui->value_beta->setText(QString::number(beta));
  ui->value_dt->setText(QString::number(dt));

  if (ui->box_type->currentIndex() == 0)
  {
    AlphaFilter filter(alpha,dt);
    for (int i=0; i!=timesteps; ++i)
    {
      const double input = static_cast<double>((rand() >> 4) % 100);
      const double output = filter.Estimate(input);
      inputs.push_back(input);
      outputs.push_back(output);
    }
  }
  else
  {
    AlphaBetaFilter filter(alpha,beta,dt);
    for (int i=0; i!=timesteps; ++i)
    {
      const double input = static_cast<double>((rand() >> 4) % 100);
      const double output = filter.Estimate(input);
      inputs.push_back(input);
      outputs.push_back(output);
    }
  }
  //Plot
  {
    std::vector<double> timeseries;
    for (int i=0; i!=timesteps; ++i)
    {
      timeseries.push_back(static_cast<double>(i));
    }
    #if QWT_VERSION >= 0x060100 || !WIN32
    m_curve_inputs->setData(new QwtPointArrayData(&timeseries[0],&inputs[0],inputs.size()));
    m_curve_outputs->setData(new QwtPointArrayData(&timeseries[0],&outputs[0],outputs.size()));
    #else
    m_curve_inputs->setData(&timeseries[0],&inputs[0],inputs.size());
    m_curve_outputs->setData(&timeseries[0],&outputs[0],outputs.size());
    #endif
    ui->plot->replot();
  }
}

void QtDialog::on_box_type_currentIndexChanged(int index)
{
  ui->beta->setVisible( index == 1 );
  ui->label_beta->setVisible( index == 1 );
  ui->value_beta->setVisible( index == 1 );
  Run();
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict

This page has been created by the tool CodeToHtml