[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