[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [labplot/filter] src: implemented order for Butterworth filter
From: Stefan Gerlach <stefan.gerlach () uni-konstanz ! de>
Date: 2016-03-31 20:17:24
Message-ID: E1alj1w-0002qb-NP () scm ! kde ! org
[Download RAW message or body]
Git commit 8aba63b3f511d8f7c850a31ebd6a6756c1ccab73 by Stefan Gerlach.
Committed on 31/03/2016 at 20:17.
Pushed by sgerlach into branch 'filter'.
implemented order for Butterworth filter
M +22 -12 src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.cpp
M +3 -2 src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.h
M +19 -3 src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.cpp
M +1 -0 src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.h
M +52 -25 src/kdefrontend/ui/dockwidgets/xyfourierfiltercurvedockgeneraltab.ui
http://commits.kde.org/labplot/8aba63b3f511d8f7c850a31ebd6a6756c1ccab73
diff --git a/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.cpp \
b/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.cpp index \
8f37cb1..4edda08 100644
--- a/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.cpp
+++ b/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.cpp
@@ -250,12 +250,15 @@ void XYFourierFilterCurvePrivate::recalculate() {
// filter settings
XYFourierFilterCurve::FilterType type = filterData.type;
+ XYFourierFilterCurve::FilterForm form = filterData.form;
+ unsigned int order = filterData.order;
double cutoff = filterData.cutoff, cutoff2 = filterData.cutoff2;
XYFourierFilterCurve::CutoffUnit unit = filterData.unit, unit2 = filterData.unit2;
#ifdef QT_DEBUG
- qDebug()<<"type ="<<type;
+ qDebug()<<"type :"<<type;
+ qDebug()<<"form (order "<<order<<") :"<<form;
qDebug()<<"cutoffs ="<<cutoff<<cutoff2;
- qDebug()<<"unit ="<<unit<<unit2;
+ qDebug()<<"unit :"<<unit<<unit2;
#endif
///////////////////////////////////////////////////////////
// 1. transform
@@ -288,33 +291,33 @@ void XYFourierFilterCurvePrivate::recalculate() {
}
// 2. apply filter
- switch(filterData.type) {
+ switch(type) {
case XYFourierFilterCurve::LowPass:
- switch(filterData.form) {
+ switch(form) {
case XYFourierFilterCurve::Ideal:
for (unsigned int i = cutindex; i < n; i++)
ydata[i] = 0;
break;
case XYFourierFilterCurve::Butterworth:
for (unsigned int i = 0; i < n; i++)
- ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(i/cutindex,2));
+ ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(i/cutindex,2*order));
break;
}
break;
case XYFourierFilterCurve::HighPass:
- switch(filterData.form) {
+ switch(form) {
case XYFourierFilterCurve::Ideal:
for (unsigned int i = 0; i < cutindex; i++)
ydata[i] = 0;
break;
case XYFourierFilterCurve::Butterworth:
for (unsigned int i = 0; i < n; i++)
- ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(cutindex/i,2));
+ ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(cutindex/i,2*order));
break;
}
break;
case XYFourierFilterCurve::BandPass:
- switch(filterData.form) {
+ switch(form) {
case XYFourierFilterCurve::Ideal:
for (unsigned int i = 0; i < cutindex; i++)
ydata[i] = 0;
@@ -323,24 +326,24 @@ void XYFourierFilterCurvePrivate::recalculate() {
break;
case XYFourierFilterCurve::Butterworth:
for (unsigned int i = 0; i < n; i++)
- ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int((i*i-gsl_sf_pow_int(cutindex2+cutindex,2)/4.0)/i/(cutindex2-cutindex),2));
+ ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int((i*i-gsl_sf_pow_int(cutindex2+cutindex,2)/4.0)/i/(cutindex2-cutindex),2*order));
break;
}
break;
case XYFourierFilterCurve::BandReject:
- switch(filterData.form) {
+ switch(form) {
case XYFourierFilterCurve::Ideal:
for (unsigned int i = cutindex; i < cutindex2; i++)
ydata[i] = 0;
break;
case XYFourierFilterCurve::Butterworth:
for (unsigned int i = 0; i < n; i++)
- ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(i*(cutindex2-cutindex)/(i*i-gsl_sf_pow_int(cutindex2+cutindex,2)/4.0),2));
+ ydata[i] *= 1./sqrt(1.+gsl_sf_pow_int(i*(cutindex2-cutindex)/(i*i-gsl_sf_pow_int(cutindex2+cutindex,2)/4.0),2*order));
break;
}
break;
-// TODO
// case XYFourierFilterCurve::Threshold:
+// TODO
}
// 3. back transform
@@ -386,6 +389,7 @@ void XYFourierFilterCurve::save(QXmlStreamWriter* writer) const{
WRITE_COLUMN(d->yDataColumn, yDataColumn);
writer->writeAttribute( "type", QString::number(d->filterData.type) );
writer->writeAttribute( "form", QString::number(d->filterData.form) );
+ writer->writeAttribute( "order", QString::number(d->filterData.order) );
writer->writeAttribute( "cutoff", QString::number(d->filterData.cutoff) );
writer->writeAttribute( "unit", QString::number(d->filterData.unit) );
writer->writeAttribute( "cutoff2", QString::number(d->filterData.cutoff2) );
@@ -452,6 +456,12 @@ bool XYFourierFilterCurve::load(XmlStreamReader* reader){
else
d->filterData.form = (XYFourierFilterCurve::FilterForm)str.toInt();
+ str = attribs.value("order").toString();
+ if(str.isEmpty())
+ reader->raiseWarning(attributeWarning.arg("'order'"));
+ else
+ d->filterData.order = str.toInt();
+
str = attribs.value("cutoff").toString();
if(str.isEmpty())
reader->raiseWarning(attributeWarning.arg("'cutoff'"));
diff --git a/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.h \
b/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.h index 90ce1c3..b3223ce \
100644
--- a/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.h
+++ b/src/backend/worksheet/plots/cartesian/XYFourierFilterCurve.h
@@ -41,12 +41,13 @@ class XYFourierFilterCurve: public XYCurve {
enum CutoffUnit {Frequency, Fraction, Index}; // Frequency=0..N/(xmax-xmin), \
Fraction=0..1, Index=0..N-1
struct FilterData {
- FilterData() : type(LowPass), form(Ideal), cutoff(0), unit(Index), cutoff2(0), \
unit2(Index) {}; + FilterData() : type(LowPass), form(Ideal), order(1), cutoff(0), \
unit(Index), cutoff2(0), unit2(Index) {};
FilterType type;
FilterForm form;
+ unsigned int order;
double cutoff; // (low) cutoff
- CutoffUnit unit; // (low) value unit
+ CutoffUnit unit; // (low) value unit
double cutoff2; // high cutoff
CutoffUnit unit2; // high value unit
};
diff --git a/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.cpp \
b/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.cpp index fabff1e..d43b75e \
100644
--- a/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.cpp
+++ b/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.cpp
@@ -100,6 +100,7 @@ void XYFourierFilterCurveDock::setupGeneral() {
connect( uiGeneralTab.cbType, SIGNAL(currentIndexChanged(int)), this, \
SLOT(typeChanged(int)) ); connect( uiGeneralTab.cbForm, \
SIGNAL(currentIndexChanged(int)), this, SLOT(formChanged(int)) ); + connect( \
uiGeneralTab.sbOrder, SIGNAL(valueChanged(int)), this, SLOT(orderChanged(int)) ); \
connect( uiGeneralTab.cbUnit, SIGNAL(currentIndexChanged(int)), this, \
SLOT(unitChanged(int)) ); connect( uiGeneralTab.cbUnit2, \
SIGNAL(currentIndexChanged(int)), this, SLOT(unit2Changed(int)) );
@@ -139,6 +140,7 @@ void XYFourierFilterCurveDock::initGeneralTab() {
this->typeChanged(m_filterData.type);
uiGeneralTab.cbForm->setCurrentIndex(m_filterData.form);
this->formChanged(m_filterData.form);
+ uiGeneralTab.sbOrder->setValue(m_filterData.order);
uiGeneralTab.sbCutoff->setValue(m_filterData.cutoff);
uiGeneralTab.cbUnit->setCurrentIndex(m_filterData.unit);
this->unitChanged(m_filterData.unit);
@@ -268,6 +270,7 @@ void XYFourierFilterCurveDock::typeChanged(int index) {
uiGeneralTab.sbCutoff2->setVisible(true);
uiGeneralTab.cbUnit2->setVisible(true);
break;
+//TODO
/* case XYFourierFilterCurve::Threshold:
uiGeneralTab.lCutoff->setText(i18n("Value"));
uiGeneralTab.lCutoff2->setVisible(false);
@@ -281,11 +284,24 @@ void XYFourierFilterCurveDock::formChanged(int index) {
XYFourierFilterCurve::FilterForm form = (XYFourierFilterCurve::FilterForm)index;
m_filterData.form = \
(XYFourierFilterCurve::FilterForm)uiGeneralTab.cbForm->currentIndex();
- //TODO
+ switch(form) {
+ case XYFourierFilterCurve::Ideal:
+ uiGeneralTab.sbOrder->setVisible(false);
+ uiGeneralTab.lOrder->setVisible(false);
+ break;
+ case XYFourierFilterCurve::Butterworth:
+ uiGeneralTab.sbOrder->setVisible(true);
+ uiGeneralTab.lOrder->setVisible(true);
+ break;
+ }
+}
+
+void XYFourierFilterCurveDock::orderChanged(int index) {
+ m_filterData.order = uiGeneralTab.sbOrder->value();
}
void XYFourierFilterCurveDock::unitChanged(int index) {
- //XYFourierFilterCurve::CutoffUnit unit = (XYFourierFilterCurve::CutoffUnit)index;
+ XYFourierFilterCurve::CutoffUnit unit = (XYFourierFilterCurve::CutoffUnit)index;
m_filterData.unit = \
(XYFourierFilterCurve::CutoffUnit)uiGeneralTab.cbUnit->currentIndex();
int n = 0;
@@ -294,7 +310,7 @@ void XYFourierFilterCurveDock::unitChanged(int index) {
n = m_filterCurve->xDataColumn()->rowCount();
T = m_filterCurve->xDataColumn()->maximum() - \
m_filterCurve->xDataColumn()->minimum(); }
- switch(index) {
+ switch(unit) {
case XYFourierFilterCurve::Frequency:
uiGeneralTab.sbCutoff->setDecimals(6);
uiGeneralTab.sbCutoff->setMaximum(1.0/T);
diff --git a/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.h \
b/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.h index e748367..e7fa2d8 \
100644
--- a/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.h
+++ b/src/kdefrontend/dockwidgets/XYFourierFilterCurveDock.h
@@ -67,6 +67,7 @@ private slots:
void yDataColumnChanged(const QModelIndex&);
void typeChanged(int);
void formChanged(int);
+ void orderChanged(int);
void unitChanged(int);
void unit2Changed(int);
diff --git a/src/kdefrontend/ui/dockwidgets/xyfourierfiltercurvedockgeneraltab.ui \
b/src/kdefrontend/ui/dockwidgets/xyfourierfiltercurvedockgeneraltab.ui index \
212fbba..e482c4d 100644
--- a/src/kdefrontend/ui/dockwidgets/xyfourierfiltercurvedockgeneraltab.ui
+++ b/src/kdefrontend/ui/dockwidgets/xyfourierfiltercurvedockgeneraltab.ui
@@ -6,19 +6,29 @@
<rect>
<x>0</x>
<y>0</y>
- <width>450</width>
- <height>557</height>
+ <width>917</width>
+ <height>794</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
- <item row="10" column="0">
+ <item row="8" column="1">
+ <widget class="KComboBox" name="cbType">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="0">
<widget class="QLabel" name="lCutoff">
<property name="text">
<string>Cutoff</string>
</property>
</widget>
</item>
- <item row="15" column="0" rowspan="2" colspan="3">
+ <item row="19" column="0" rowspan="2" colspan="3">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -48,16 +58,6 @@
</property>
</widget>
</item>
- <item row="8" column="1" colspan="2">
- <widget class="KComboBox" name="cbType">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
<item row="7" column="0">
<widget class="QLabel" name="lFilter">
<property name="font">
@@ -127,7 +127,7 @@
<item row="0" column="1" colspan="2">
<widget class="KLineEdit" name="leName"/>
</item>
- <item row="19" column="0">
+ <item row="23" column="0">
<spacer name="verticalSpacerGeneral">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -143,7 +143,7 @@
</property>
</spacer>
</item>
- <item row="20" column="0">
+ <item row="24" column="0">
<widget class="QCheckBox" name="chkVisible">
<property name="text">
<string>visible</string>
@@ -157,17 +157,17 @@
</property>
</widget>
</item>
- <item row="18" column="1">
+ <item row="22" column="1">
<widget class="QPushButton" name="pbRecalculate">
<property name="text">
<string>Recalculate</string>
</property>
</widget>
</item>
- <item row="14" column="1">
+ <item row="18" column="1">
<widget class="QTextEdit" name="teResult"/>
</item>
- <item row="14" column="0">
+ <item row="18" column="0">
<widget class="QLabel" name="label">
<property name="font">
<font>
@@ -183,7 +183,7 @@
</property>
</widget>
</item>
- <item row="10" column="1" rowspan="2">
+ <item row="14" column="1" rowspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QDoubleSpinBox" name="sbCutoff">
@@ -211,17 +211,14 @@
</property>
</widget>
</item>
- <item row="9" column="1">
- <widget class="QComboBox" name="cbForm"/>
- </item>
- <item row="12" column="0">
+ <item row="16" column="0">
<widget class="QLabel" name="lCutoff2">
<property name="text">
<string>Cutoff2</string>
</property>
</widget>
</item>
- <item row="12" column="1">
+ <item row="16" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QDoubleSpinBox" name="sbCutoff2"/>
@@ -231,6 +228,36 @@
</item>
</layout>
</item>
+ <item row="9" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QComboBox" name="cbForm"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="lOrder">
+ <property name="text">
+ <string>Order</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="sbOrder">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<customwidgets>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic