v2.0.0
Loading...
Searching...
No Matches
firfilter.cpp
Go to the documentation of this file.
1//=============================================================================================================
33
34//=============================================================================================================
35// INCLUDES
36//=============================================================================================================
37
38#include "firfilter.h"
39
40//=============================================================================================================
41// EIGEN INCLUDES
42//=============================================================================================================
43
44#include <Eigen/Core>
45
46//=============================================================================================================
47// QT INCLUDES
48//=============================================================================================================
49
50#include <QString>
51
52//=============================================================================================================
53// USED NAMESPACES
54//=============================================================================================================
55
56using namespace UTILSLIB;
57using namespace Eigen;
58
59//=============================================================================================================
60// STATIC DEFINITIONS
61//=============================================================================================================
62
64 FilterType type,
65 double dCutoffLow,
66 double dCutoffHigh,
67 double dSFreq,
68 double dTransition,
69 DesignMethod method)
70{
71 // FilterKernel frequency encoding (all values normalised to Nyquist = sFreq/2):
72 //
73 // LPF : dCenterfreq = dCutoffLow / nyquist, dBandwidth = 0
74 // HPF : dCenterfreq = dCutoffLow / nyquist, dBandwidth = 0
75 // BPF : dCenterfreq = (lo+hi) / sFreq, dBandwidth = (hi-lo) / nyquist
76 // NOTCH: dCenterfreq = (lo+hi) / sFreq, dBandwidth = (hi-lo) / nyquist
77 //
78 // dParkswidth = dTransition / nyquist
79
80 const double nyquist = dSFreq / 2.0;
81
82 double dCenterfreq = 0.0;
83 double dBandwidth = 0.0;
84 const double dParkswidth = dTransition / nyquist;
85
86 int iFilterType = static_cast<int>(type); // LPF=0, HPF=1, BPF=2, NOTCH=3
87
88 switch (type) {
89 case LowPass:
90 case HighPass:
91 dCenterfreq = dCutoffLow / nyquist;
92 dBandwidth = 0.0;
93 break;
94 case BandPass:
95 case BandStop:
96 dCenterfreq = (dCutoffLow + dCutoffHigh) / dSFreq; // = centre / nyquist normalised to [0,1]
97 dBandwidth = (dCutoffHigh - dCutoffLow) / nyquist;
98 break;
99 }
100
101 QString sName;
102 switch (type) {
103 case LowPass: sName = QStringLiteral("LP_%1Hz").arg(dCutoffLow); break;
104 case HighPass: sName = QStringLiteral("HP_%1Hz").arg(dCutoffLow); break;
105 case BandPass: sName = QStringLiteral("BP_%1-%2Hz").arg(dCutoffLow).arg(dCutoffHigh); break;
106 case BandStop: sName = QStringLiteral("BS_%1-%2Hz").arg(dCutoffLow).arg(dCutoffHigh); break;
107 }
108
109 return FilterKernel(sName,
110 iFilterType,
111 iOrder,
112 dCenterfreq,
113 dBandwidth,
114 dParkswidth,
115 dSFreq,
116 static_cast<int>(method));
117}
118
119//=============================================================================================================
120
121RowVectorXd FirFilter::apply(const RowVectorXd& vecData,
122 FilterKernel& kernel)
123{
124 RowVectorXd work = vecData;
125 kernel.applyFftFilter(work, /*bKeepOverhead=*/false);
126 return work;
127}
128
129//=============================================================================================================
130
131RowVectorXd FirFilter::applyZeroPhase(const RowVectorXd& vecData,
132 FilterKernel& kernel)
133{
134 // Forward pass
135 RowVectorXd work = vecData;
136 kernel.applyFftFilter(work, false);
137
138 // Reverse pass
139 RowVectorXd rev = work.reverse();
140 kernel.applyFftFilter(rev, false);
141
142 return rev.reverse();
143}
144
145//=============================================================================================================
146
147MatrixXd FirFilter::applyZeroPhaseMatrix(const MatrixXd& matData,
148 FilterKernel& kernel,
149 const RowVectorXi& vecPicks)
150{
151 MatrixXd result = matData;
152
153 if (vecPicks.size() == 0) {
154 // All rows
155 for (int i = 0; i < result.rows(); ++i) {
156 RowVectorXd row = result.row(i);
157 result.row(i) = applyZeroPhase(row, kernel);
158 }
159 } else {
160 for (int k = 0; k < vecPicks.size(); ++k) {
161 int i = vecPicks(k);
162 if (i < 0 || i >= result.rows()) continue;
163 RowVectorXd row = result.row(i);
164 result.row(i) = applyZeroPhase(row, kernel);
165 }
166 }
167
168 return result;
169}
Declaration of FirFilter — a discoverable façade over the existing FilterKernel FIR API.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
The FilterKernel class provides methods to create/design a FIR filter kernel.
void applyFftFilter(Eigen::RowVectorXd &vecData, bool bKeepOverhead=false)
FilterType
FIR filter type — mirrors IirFilter::FilterType for a uniform API.
Definition firfilter.h:86
static Eigen::MatrixXd applyZeroPhaseMatrix(const Eigen::MatrixXd &matData, FilterKernel &kernel, const Eigen::RowVectorXi &vecPicks=Eigen::RowVectorXi())
DesignMethod
FIR design method — wraps FilterKernel's iDesignMethod integer codes.
Definition firfilter.h:97
static Eigen::RowVectorXd applyZeroPhase(const Eigen::RowVectorXd &vecData, FilterKernel &kernel)
static FilterKernel design(int iOrder, FilterType type, double dCutoffLow, double dCutoffHigh, double dSFreq, double dTransition=5.0, DesignMethod method=Cosine)
Definition firfilter.cpp:63
static Eigen::RowVectorXd apply(const Eigen::RowVectorXd &vecData, FilterKernel &kernel)