MNE-CPP  beta 1.0
filterplotscene.cpp
1 //=============================================================================================================
37 //*************************************************************************************************************
38 //=============================================================================================================
39 // INCLUDES
40 //=============================================================================================================
41 
42 #include "filterplotscene.h"
43 
44 
45 //*************************************************************************************************************
46 //=============================================================================================================
47 // USED NAMESPACES
48 //=============================================================================================================
49 
50 using namespace MNEBrowseRawQt;
51 using namespace Eigen;
52 
53 
54 //*************************************************************************************************************
55 //=============================================================================================================
56 // DEFINE MEMBER METHODS
57 //=============================================================================================================
58 
60  QGraphicsScene(parent),
61  m_pCurrentFilter(new FilterOperator()),
62  m_pGraphicsItemPath(new QGraphicsPathItem()),
63  m_iScalingFactor(5),
64  m_dMaxMagnitude(100*m_iScalingFactor),
65  m_iNumberHorizontalLines(4),
66  m_iNumberVerticalLines(3),
67  m_iAxisTextSize(24),
68  m_iDiagramMarginsHoriz(5),
69  m_iDiagramMarginsVert(5),
70  m_iCutOffLow(5),
71  m_iCutOffHigh(40),
72  m_iCutOffMarkerWidth(3)
73 {
74 }
75 
76 
77 //*************************************************************************************************************
78 
79 void FilterPlotScene::updateFilter(QSharedPointer<MNEOperator> operatorFilter, int samplingFreq, int cutOffLow, int cutOffHigh)
80 {
81  //set member variables
82  m_iCutOffLow = cutOffLow;
83  m_iCutOffHigh = cutOffHigh;
84 
85  //Clear the scene
86  this->clear();
87 
88  if(operatorFilter->m_OperatorType == MNEOperator::FILTER)
89  m_pCurrentFilter = operatorFilter.staticCast<FilterOperator>();
90 
91  //Plot newly set filter
93 
94  //Plot the magnitude diagram
95  plotMagnitudeDiagram(samplingFreq);
96 }
97 
98 
99 //*************************************************************************************************************
100 
102 {
103  //Get row vector with filter coefficients
104  RowVectorXcd coefficientsAFreq = m_pCurrentFilter->m_dFFTCoeffA;
105 
106  int numberCoeff = coefficientsAFreq.cols();
107  if(numberCoeff>2000) {//if to large downsample
108  int dsFactor = numberCoeff/2000;
109  numberCoeff = numberCoeff/dsFactor;
110  }
111 
112  int fMax = samplingFreq/2; //nyquist frequency
113 
114  addRect(-m_iDiagramMarginsHoriz,
116  numberCoeff+(m_iDiagramMarginsHoriz*2),
118 
119  //HORIZONTAL
120  //Draw horizontal lines
121  for(int i = 1; i <= m_iNumberHorizontalLines; i++)
122  addLine(-m_iDiagramMarginsHoriz,
124  numberCoeff + m_iDiagramMarginsHoriz,
126  QPen(Qt::DotLine));
127 
128  //Draw vertical axis texts - db magnitude
129  for(int i = 0; i <= m_iNumberHorizontalLines+1; i++) {
130  QGraphicsTextItem * text = addText(QString("-%1 db").arg(QString().number(i * m_dMaxMagnitude/(m_iScalingFactor*(m_iNumberHorizontalLines+1)),'g',3)),
131  QFont("Times", m_iAxisTextSize));
132  text->setPos(-text->boundingRect().width() - m_iAxisTextSize/2,
133  (i * (m_dMaxMagnitude/(m_iNumberHorizontalLines+1))) - (text->boundingRect().height()/2) - m_iDiagramMarginsVert);
134  }
135 
136  //VERTICAL
137  //Draw vertical lines
138  double length = numberCoeff / (m_iNumberVerticalLines+1);
139  for(int i = 1; i<=m_iNumberVerticalLines; i++)
140  addLine(i*length - m_iDiagramMarginsHoriz,
142  i*length - m_iDiagramMarginsHoriz,
144  QPen(Qt::DotLine));
145 
146  //Draw horizontal axis texts - Hz frequency
147  for(int i = 0; i <= m_iNumberVerticalLines+1; i++) {
148  QGraphicsTextItem * text = addText(QString("%1 Hz").arg(i*(fMax/(m_iNumberVerticalLines+1))),
149  QFont("Times", m_iAxisTextSize));
150  text->setPos(i * length - m_iDiagramMarginsHoriz - (text->boundingRect().width()/2),
151  m_dMaxMagnitude + (text->boundingRect().height()/2));
152  }
153 
154  //Plot lower higher cut off frequency
155  double pos = 0;
156  switch(m_pCurrentFilter->m_Type) {
157  case 0://LPF
158  pos = ((double)m_iCutOffLow / (double)fMax) * numberCoeff;
159  addLine(pos - m_iDiagramMarginsHoriz,
163  QPen(Qt::red,m_iCutOffMarkerWidth));
164  break;
165 
166  case 1://HPF
167  pos = ((double)m_iCutOffHigh / (double)fMax) * numberCoeff;
168  addLine(pos - m_iDiagramMarginsHoriz,
172  QPen(Qt::red,m_iCutOffMarkerWidth));
173  break;
174 
175  case 2://BPF
176  pos = ((double)m_iCutOffLow / (double)fMax) * numberCoeff;
177  addLine(pos - m_iDiagramMarginsHoriz,
181  QPen(Qt::red,m_iCutOffMarkerWidth));
182 
183  pos = ((double)m_iCutOffHigh / (double)fMax) * numberCoeff;
184  addLine(pos - m_iDiagramMarginsHoriz,
188  QPen(Qt::red,m_iCutOffMarkerWidth));
189  break;
190  }
191 }
192 
193 
194 //*************************************************************************************************************
195 
197 {
198  //Get row vector with filter coefficients and norm to 1
199  RowVectorXcd coefficientsAFreq = m_pCurrentFilter->m_dFFTCoeffA;
200 
201  int numberCoeff = coefficientsAFreq.cols();
202  int dsFactor = 0;
203  if(numberCoeff>2000)
204  dsFactor = numberCoeff/2000;
205 
206  double max = 0;
207  for(int i = 0; i<numberCoeff-dsFactor; i++)
208  if(abs(coefficientsAFreq(i)) > max)
209  max = abs(coefficientsAFreq(i));
210 
211  coefficientsAFreq = coefficientsAFreq / max;
212 
213  //Create painter path
214  QPainterPath path;
215  double y = -20 * log10(abs(coefficientsAFreq(0))) * m_iScalingFactor; //-1 because we want to plot upwards
216  if(y > m_dMaxMagnitude)
217  y = m_dMaxMagnitude;
219 
220  path.moveTo(-m_iDiagramMarginsVert, y); //convert to db
221 
222  for(int i = 0; i<numberCoeff; i+=dsFactor) {
223  y = -20 * log10(abs(coefficientsAFreq(i))) * m_iScalingFactor; //-1 because we want to plot upwards
224  if(y > m_dMaxMagnitude)
225  y = m_dMaxMagnitude;
226 
228  path.lineTo(path.currentPosition().x()+1,y);
229  }
230 
231  QPen pen;
232  pen.setColor(Qt::black);
233  pen.setWidth(2);
234 
235  //Clear old and plot new filter path
236  m_pGraphicsItemPath = addPath(path, pen);
237 }
238 
239 
240 //*************************************************************************************************************
241 
QSharedPointer< FilterOperator > m_pCurrentFilter
void plotMagnitudeDiagram(int samplingFreq)
QGraphicsPathItem * m_pGraphicsItemPath
Contains the implementation of the FilterPlotScene class.
void updateFilter(QSharedPointer< MNEOperator > operatorFilter, int samplingFreq, int cutOffLow, int cutOffHigh)