v2.0.0
Loading...
Searching...
No Matches
filterplotscene.cpp
Go to the documentation of this file.
1//=============================================================================================================
15
16//=============================================================================================================
17// INCLUDES
18//=============================================================================================================
19
20#include "filterplotscene.h"
21
22//=============================================================================================================
23// QT INCLUDES
24//=============================================================================================================
25
26#include <QGraphicsPathItem>
27#include <QGraphicsView>
28#include <QDebug>
29
30//=============================================================================================================
31// EIGEN INCLUDES
32//=============================================================================================================
33
34//=============================================================================================================
35// USED NAMESPACES
36//=============================================================================================================
37
38using namespace DISPLIB;
39using namespace Eigen;
40using namespace UTILSLIB;
41
42//=============================================================================================================
43// DEFINE MEMBER METHODS
44//=============================================================================================================
45
46FilterPlotScene::FilterPlotScene(QGraphicsView *view, QObject *parent)
47: LayoutScene(view, parent)
48, m_pGraphicsItemPath(new QGraphicsPathItem())
55, m_iCutOffLow(5)
56, m_iCutOffHigh(40)
59{
61}
62
63//=============================================================================================================
64
66 int samplingFreq,
67 int cutOffLow,
68 int cutOffHigh)
69{
70 if(operatorFilter.getCoefficients().cols() == 0)
71 return;
72
73 m_pCurrentFilter = operatorFilter;
74
75 //set member variables
76 m_iCutOffLow = cutOffLow;
77 m_iCutOffHigh = cutOffHigh;
78
79 //Clear the scene
80 this->clear();
81
82 QWidget * pQwidgetty(dynamic_cast<QWidget*>(parent()));
83 m_cPenColor = pQwidgetty->palette().text().color();
84
85 //Plot newly set filter. Needs to be called before plotMagnitudeDiagram() because m_iPlotLength is set in plotFilterFrequencyResponse()
87
88 //Plot the magnitude diagram
89 plotMagnitudeDiagram(samplingFreq, operatorFilter.getName());
90}
91
92//=============================================================================================================
93
95 const QString& filtername)
96{
97 //Get row vector with filter coefficients
98 int numberCoeff = m_iPlotLength;
99
100// RowVectorXcd coefficientsAFreq = m_pCurrentFilter.m_vecFftCoeff;
101// if(coefficientsAFreq.cols() > 2000) {//if to large downsample
102// int dsFactor = coefficientsAFreq.cols()/2000;
103// numberCoeff = coefficientsAFreq.cols()/dsFactor;
104// } else {
105// numberCoeff = coefficientsAFreq.cols();
106// }
107
108 int fMax = samplingFreq/2; //nyquist frequency
109
110 addRect(-m_iDiagramMarginsHoriz,
112 numberCoeff+(m_iDiagramMarginsHoriz*2),
114
115 //Plot filter name on top
116 QGraphicsTextItem * text = addText(filtername, QFont("Times", m_iAxisTextSize));
117 text->setPos((numberCoeff+(m_iDiagramMarginsHoriz*2))/3.2,-70);
118 text->setDefaultTextColor(m_cPenColor);
119
120 //HORIZONTAL
121 //Draw horizontal lines
122 QPen pen(Qt::DotLine);
123 pen.setColor(m_cPenColor);
124 for(int i = 1; i <= m_iNumberHorizontalLines; i++)
125 addLine(-m_iDiagramMarginsHoriz,
127 numberCoeff + m_iDiagramMarginsHoriz,
129 pen);
130
131 //Draw vertical axis texts - db magnitude
132 for(int i = 0; i <= m_iNumberHorizontalLines+1; i++) {
133 QGraphicsTextItem * text = addText(QString("-%1 db").arg(QString().number(i * m_iMaxMagnitude/(m_iScalingFactor*(m_iNumberHorizontalLines+1)),'g',3)),
134 QFont("Times", m_iAxisTextSize));
135 text->setPos(-text->boundingRect().width() - m_iAxisTextSize/2,
136 (i * (m_iMaxMagnitude/(m_iNumberHorizontalLines+1))) - (text->boundingRect().height()/2) - m_iDiagramMarginsVert);
137 text->setDefaultTextColor(m_cPenColor);
138 }
139
140 //VERTICAL
141 //Draw vertical lines
142 double length = double(numberCoeff) / double(m_iNumberVerticalLines+1);
143 for(int i = 1; i<=m_iNumberVerticalLines; i++)
144 addLine(i*length - m_iDiagramMarginsHoriz,
146 i*length - m_iDiagramMarginsHoriz,
148 pen);
149
150 //Draw horizontal axis texts - Hz frequency
151 for(int i = 0; i <= m_iNumberVerticalLines+1; i++) {
152 QGraphicsTextItem * text = addText(QString("%1 Hz").arg(i*(fMax/(m_iNumberVerticalLines+1))),
153 QFont("Times", m_iAxisTextSize));
154 text->setPos(i * length - m_iDiagramMarginsHoriz - (text->boundingRect().width()/2),
155 m_iMaxMagnitude + (text->boundingRect().height()/2));
156 text->setDefaultTextColor(m_cPenColor);
157 }
158
159 //Plot lower higher cut off frequency
160 double pos = 0;
161 switch(FilterKernel::m_filterTypes.indexOf(m_pCurrentFilter.getFilterType())) {
162 case 0://LPF
163 pos = ((double)m_iCutOffLow / (double)fMax) * numberCoeff;
164 addLine(pos - m_iDiagramMarginsHoriz,
168 QPen(Qt::red, m_iCutOffMarkerWidth));
169 break;
170
171 case 1://HPF
172 pos = ((double)m_iCutOffHigh / (double)fMax) * numberCoeff;
173 addLine(pos - m_iDiagramMarginsHoriz,
177 QPen(Qt::red, m_iCutOffMarkerWidth));
178 break;
179
180 case 2://BPF
181 pos = ((double)m_iCutOffLow / (double)fMax) * numberCoeff;
182 addLine(pos - m_iDiagramMarginsHoriz,
186 QPen(Qt::red, m_iCutOffMarkerWidth));
187
188 pos = ((double)m_iCutOffHigh / (double)fMax) * numberCoeff;
189 addLine(pos - m_iDiagramMarginsHoriz,
193 QPen(Qt::red, m_iCutOffMarkerWidth));
194 break;
195 }
196}
197
198//=============================================================================================================
199
201{
202 //Get row vector with filter coefficients and norm to 1
203 RowVectorXcd coefficientsAFreq = m_pCurrentFilter.getFftCoefficients();
204
205 float numberCoeff = coefficientsAFreq.cols();
206 float dsFactor = numberCoeff/m_qvView->width();
207
208 double max = 0.0;
209 for(int i = 0; i<coefficientsAFreq.cols(); i++) {
210 if(std::abs(coefficientsAFreq(i)) > max) {
211 max = std::abs(coefficientsAFreq(i));
212 }
213 }
214
215 coefficientsAFreq = coefficientsAFreq / max;
216
217 //Create painter path
218 QPainterPath path;
219 double y = -20 * log10(std::abs(coefficientsAFreq(0))) * m_iScalingFactor; //-1 because we want to plot upwards
220 if(y > m_iMaxMagnitude) {
221 y = m_iMaxMagnitude;
222 }
224
225 path.moveTo(-m_iDiagramMarginsVert, y); //convert to db
226
227 for(int i = 0; i < numberCoeff; i++) {
228 y = -20 * log10(std::abs(coefficientsAFreq(i))) * m_iScalingFactor; //-1 because we want to plot upwards
229 if(y > m_iMaxMagnitude) {
230 y = m_iMaxMagnitude;
231 }
232
234 if(dsFactor < 1) {
235 path.lineTo(path.currentPosition().x()+(1/dsFactor),y);
236 } else {
237 path.lineTo(path.currentPosition().x()+1,y);
238 }
239 }
240
241 m_iPlotLength = path.currentPosition().x();
242
243 QPen pen;
244 pen.setColor(m_cPenColor);
245 pen.setWidth(2);
246
247 //Clear old and plot new filter path
248 m_pGraphicsItemPath = addPath(path, pen);
249}
250
251//=============================================================================================================
252
QGraphicsScene that draws the magnitude (and optional phase) response of a designed FIR / IIR filter.
2-D display widgets and visualisation helpers (charts, topography, colour maps).
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
QGraphicsPathItem * m_pGraphicsItemPath
FilterPlotScene(QGraphicsView *view, QObject *parent=0)
void updateFilter(const UTILSLIB::FilterKernel &operatorFilter, int samplingFreq, int cutOffLow, int cutOffHigh)
void plotMagnitudeDiagram(int samplingFreq, const QString &filtername=QString())
UTILSLIB::FilterKernel m_pCurrentFilter
QGraphicsView * m_qvView
LayoutScene(QGraphicsView *view, QObject *parent=0)
The FilterKernel class provides methods to create/design a FIR filter kernel.
QString getName() const
static QVector< FilterParameter > m_filterTypes
Eigen::RowVectorXd getCoefficients() const