v2.0.0
Loading...
Searching...
No Matches
firfilter.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "firfilter.h"
18
19//=============================================================================================================
20// EIGEN INCLUDES
21//=============================================================================================================
22
23#include <Eigen/Core>
24
25//=============================================================================================================
26// QT INCLUDES
27//=============================================================================================================
28
29#include <QString>
30
31//=============================================================================================================
32// USED NAMESPACES
33//=============================================================================================================
34
35using namespace UTILSLIB;
36using namespace Eigen;
37
38//=============================================================================================================
39// STATIC DEFINITIONS
40//=============================================================================================================
41
43 FilterType type,
44 double dCutoffLow,
45 double dCutoffHigh,
46 double dSFreq,
47 double dTransition,
48 DesignMethod method)
49{
50 // FilterKernel frequency encoding (all values normalised to Nyquist = sFreq/2):
51 //
52 // LPF : dCenterfreq = dCutoffLow / nyquist, dBandwidth = 0
53 // HPF : dCenterfreq = dCutoffLow / nyquist, dBandwidth = 0
54 // BPF : dCenterfreq = (lo+hi) / sFreq, dBandwidth = (hi-lo) / nyquist
55 // NOTCH: dCenterfreq = (lo+hi) / sFreq, dBandwidth = (hi-lo) / nyquist
56 //
57 // dParkswidth = dTransition / nyquist
58
59 const double nyquist = dSFreq / 2.0;
60
61 double dCenterfreq = 0.0;
62 double dBandwidth = 0.0;
63 const double dParkswidth = dTransition / nyquist;
64
65 int iFilterType = static_cast<int>(type); // LPF=0, HPF=1, BPF=2, NOTCH=3
66
67 switch (type) {
68 case LowPass:
69 case HighPass:
70 dCenterfreq = dCutoffLow / nyquist;
71 dBandwidth = 0.0;
72 break;
73 case BandPass:
74 case BandStop:
75 dCenterfreq = (dCutoffLow + dCutoffHigh) / dSFreq; // = centre / nyquist normalised to [0,1]
76 dBandwidth = (dCutoffHigh - dCutoffLow) / nyquist;
77 break;
78 }
79
80 QString sName;
81 switch (type) {
82 case LowPass: sName = QStringLiteral("LP_%1Hz").arg(dCutoffLow); break;
83 case HighPass: sName = QStringLiteral("HP_%1Hz").arg(dCutoffLow); break;
84 case BandPass: sName = QStringLiteral("BP_%1-%2Hz").arg(dCutoffLow).arg(dCutoffHigh); break;
85 case BandStop: sName = QStringLiteral("BS_%1-%2Hz").arg(dCutoffLow).arg(dCutoffHigh); break;
86 }
87
88 return FilterKernel(sName,
89 iFilterType,
90 iOrder,
91 dCenterfreq,
92 dBandwidth,
93 dParkswidth,
94 dSFreq,
95 static_cast<int>(method));
96}
97
98//=============================================================================================================
99
100RowVectorXd FirFilter::apply(const RowVectorXd& vecData,
101 FilterKernel& kernel)
102{
103 RowVectorXd work = vecData;
104 kernel.applyFftFilter(work, /*bKeepOverhead=*/false);
105 return work;
106}
107
108//=============================================================================================================
109
110RowVectorXd FirFilter::applyZeroPhase(const RowVectorXd& vecData,
111 FilterKernel& kernel)
112{
113 // Forward pass
114 RowVectorXd work = vecData;
115 kernel.applyFftFilter(work, false);
116
117 // Reverse pass
118 RowVectorXd rev = work.reverse();
119 kernel.applyFftFilter(rev, false);
120
121 return rev.reverse();
122}
123
124//=============================================================================================================
125
126MatrixXd FirFilter::applyZeroPhaseMatrix(const MatrixXd& matData,
127 FilterKernel& kernel,
128 const RowVectorXi& vecPicks)
129{
130 MatrixXd result = matData;
131
132 if (vecPicks.size() == 0) {
133 // All rows
134 for (int i = 0; i < result.rows(); ++i) {
135 RowVectorXd row = result.row(i);
136 result.row(i) = applyZeroPhase(row, kernel);
137 }
138 } else {
139 for (int k = 0; k < vecPicks.size(); ++k) {
140 int i = vecPicks(k);
141 if (i < 0 || i >= result.rows()) continue;
142 RowVectorXd row = result.row(i);
143 result.row(i) = applyZeroPhase(row, kernel);
144 }
145 }
146
147 return result;
148}
Discoverable design / apply façade over the FilterKernel FIR engine.
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:73
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:84
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:42
static Eigen::RowVectorXd apply(const Eigen::RowVectorXd &vecData, FilterKernel &kernel)