v2.0.0
Loading...
Searching...
No Matches
filterio.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "filterio.h"
18
19//=============================================================================================================
20// QT INCLUDES
21//=============================================================================================================
22
23#include <QFile>
24#include <QDebug>
25#include <QStringList>
26#include <QRegularExpression>
27
28//=============================================================================================================
29// USED NAMESPACES
30//=============================================================================================================
31
32using namespace UTILSLIB;
33using namespace Eigen;
34
35//=============================================================================================================
36// DEFINE MEMBER METHODS
37//=============================================================================================================
38
42
43//=============================================================================================================
44
45bool FilterIO::readFilter(QString path, FilterKernel& filter)
46{
47 //Open .txt file
48 if (!path.contains(".txt"))
49 return false;
50
51 QFile file(path);
52 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
53 qDebug() << "Error opening filter txt file for reading";
54 return false;
55 }
56
57 //Start reading from file
58 QTextStream in(&file);
59 QVector<double> coefficientsTemp;
60
61 while (!in.atEnd()) {
62 QString line = in.readLine();
63
64 QStringList fields = line.split(QRegularExpression("\\s+"));
65
66 //Delete last element if it is a blank character
67 if (fields.at(fields.size() - 1) == "")
68 fields.removeLast();
69
70 if (line.contains("#")) //Filter meta information commented areas in file
71 {
72 //Read filter sFreq
73 if (line.contains("sFreq") && fields.size() == 2)
74 filter.setSamplingFrequency(fields.at(1).toDouble());
75
76 //Read filter name
77 if (line.contains("name")) {
78 QString sFilterName;
79 for (int i = 1; i < fields.size(); i++)
80 sFilterName.append(fields.at(i));
81 filter.setName(sFilterName);
82 }
83
84 //Read the filter order
85 if (line.contains("order") && fields.size() == 2)
86 filter.setFilterOrder(fields.at(1).toInt());
87
88 //Read the filter type
89 if (line.contains("type") && fields.size() == 2)
90 filter.setFilterType(FilterKernel::m_filterTypes.indexOf(FilterParameter(fields.at(1))));
91
92 //Read the filter LPFreq
93 if (line.contains("LPFreq") && fields.size() == 2)
94 filter.setLowpassFreq(fields.at(1).toDouble());
95
96 //Read the filter HPFreq
97 if (line.contains("HPFreq") && fields.size() == 2)
98 filter.setHighpassFreq(fields.at(1).toDouble());
99
100 //Read the filter CenterFreq
101 if (line.contains("CenterFreq") && fields.size() == 2)
102 filter.setCenterFrequency(fields.at(1).toDouble());
103
104 //Read the filter DesignMethod
105 if (line.contains("DesignMethod") && fields.size() == 2)
107
108 if (line.contains("ParksWidth") && fields.size() == 2)
109 filter.setParksWidth(fields.at(1).toDouble());
110
111 } else // Read filter coefficients
112 coefficientsTemp.push_back(fields.join("").toDouble());
113 }
114 // Check if reading was successful and correct
115 if (filter.getFilterOrder() != coefficientsTemp.size()) {
116 filter.setFilterOrder(coefficientsTemp.size());
117 }
118
119 RowVectorXd vecCoeff = RowVectorXd::Zero(coefficientsTemp.size());
120 for (int i = 0; i < vecCoeff.cols(); i++) {
121 vecCoeff(i) = coefficientsTemp.at(i);
122 }
123 filter.setCoefficients(vecCoeff);
124
125 file.close();
126
127 return true;
128}
129
130//=============================================================================================================
131
132bool FilterIO::writeFilter(const QString& path, const FilterKernel& filter)
133{
134 // Open file dialog
135 if (!path.isEmpty()) {
136 QFile file(path);
137 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
138 qDebug() << "Error opening filter txt file for writing";
139 return false;
140 }
141
142 //Write coefficients to file
143 QTextStream out(&file);
144
145 out << "#sFreq " << filter.getSamplingFrequency() << "\n";
146 out << "#name " << filter.getName() << "\n";
147 out << "#type " << filter.getFilterType().getName() << "\n";
148 out << "#order " << filter.getFilterOrder() << "\n";
149 out << "#HPFreq " << filter.getHighpassFreq() << "\n";
150 out << "#LPFreq " << filter.getLowpassFreq() << "\n";
151 out << "#CenterFreq " << filter.getCenterFrequency() << "\n";
152 out << "#DesignMethod " << filter.getDesignMethod().getName() << "\n";
153 out << "#ParksWidth " << filter.getParksWidth() << "\n";
154
155 for (int i = 0; i < filter.getCoefficients().cols(); i++)
156 out << filter.getCoefficients()(i) << "\n";
157
158 file.close();
159
160 return true;
161 }
162
163 qDebug() << "Error Filter File path is empty";
164
165 return false;
166}
Plain-text serialisation of UTILSLIB::FilterKernel coefficient sets.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static bool readFilter(QString path, FilterKernel &filter)
Definition filterio.cpp:45
static bool writeFilter(const QString &path, const FilterKernel &filter)
Definition filterio.cpp:132
Named filter-design parameter descriptor holding a human-readable name and description (e....
The FilterKernel class provides methods to create/design a FIR filter kernel.
void setSamplingFrequency(double dSFreq)
double getParksWidth() const
double getCenterFrequency() const
void setCenterFrequency(double dCenterFreq)
double getSamplingFrequency() const
void setHighpassFreq(double dHighpassFreq)
void setCoefficients(const Eigen::RowVectorXd &vecCoeff)
QString getName() const
static QVector< FilterParameter > m_designMethods
void setFilterOrder(int iOrder)
void setParksWidth(double dParksWidth)
void setLowpassFreq(double dLowpassFreq)
static QVector< FilterParameter > m_filterTypes
void setName(const QString &sFilterName)
Eigen::RowVectorXd getCoefficients() const
double getLowpassFreq() const
void setFilterType(int iFilterType)
double getHighpassFreq() const
FilterParameter getDesignMethod() const
void setDesignMethod(int iDesignMethod)
FilterParameter getFilterType() const