42#include "ui_filterdesignview.h"
56#include <QStandardPaths>
57#include <QSvgGenerator>
60#include <QApplication>
84,
m_pUi(new Ui::FilterDesignViewWidget)
113 if(iMaxNumberFilterTaps%2 != 0) {
114 iMaxNumberFilterTaps--;
117 m_pUi->m_spinBox_filterTaps->setMaximum(iMaxNumberFilterTaps);
118 m_pUi->m_spinBox_filterTaps->setMinimum(16);
128 return m_pUi->m_spinBox_filterTaps->value();
135 if(dSamplingRate <= 0) {
136 qWarning() <<
"[FilterDesignView::setSamplingRate] Sampling frequency is <= 0. Returning.";
142 double nyquistFrequency =
m_dSFreq/2;
144 m_pUi->m_doubleSpinBox_to->setMaximum(nyquistFrequency);
145 m_pUi->m_doubleSpinBox_from->setMaximum(nyquistFrequency);
164 m_pUi->m_doubleSpinBox_from->setValue(dFrom);
172 m_pUi->m_doubleSpinBox_to->setValue(dTo);
187 return m_pUi->m_comboBox_filterApplyTo->currentText();
194 m_pUi->m_comboBox_filterApplyTo->setCurrentText(sType);
206 QSettings settings(
"MNECPP");
214 settings.setValue(
m_sSettingsPath + QString(
"/FilterDesignView/Position"), this->pos());
225 QSettings settings(
"MNECPP");
228 m_pUi->m_doubleSpinBox_to->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterTo"), 40.0).toDouble());
229 m_pUi->m_doubleSpinBox_from->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterFrom"), 1.0).toDouble());
230 m_pUi->m_spinBox_filterTaps->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterOrder"), 128).toInt());
232 m_pUi->m_doubleSpinBox_transitionband->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterTransition"), 0.1).toDouble());
233 m_pUi->m_comboBox_filterApplyTo->setCurrentText(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterChannelType"),
"All").toString());
235 QPoint pos = settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/Position"), QPoint(100,100)).toPoint();
237 QRect screenRect = QApplication::primaryScreen()->geometry();
238 if(!screenRect.contains(pos) && QGuiApplication::screens().size() == 1) {
239 move(QPoint(100,100));
273 connect(
m_pUi->m_doubleSpinBox_from, &QDoubleSpinBox::editingFinished,
276 connect(
m_pUi->m_doubleSpinBox_to, &QDoubleSpinBox::editingFinished,
279 connect(
m_pUi->m_doubleSpinBox_transitionband, &QDoubleSpinBox::editingFinished,
282 connect(
m_pUi->m_spinBox_filterTaps, &QSpinBox::editingFinished,
286 m_pUi->m_doubleSpinBox_from->installEventFilter(
this);
287 m_pUi->m_doubleSpinBox_to->installEventFilter(
this);
288 m_pUi->m_doubleSpinBox_transitionband->installEventFilter(
this);
295 connect(
m_pUi->m_pushButton_exportPlot,&QPushButton::released,
298 connect(
m_pUi->m_pushButton_exportFilter,&QPushButton::released,
301 connect(
m_pUi->m_pushButton_loadFilter,&QPushButton::released,
310 m_pUi->m_comboBox_designMethod->addItem(filterMethod.getName());
313 connect(
m_pUi->m_comboBox_designMethod,
static_cast<void (QComboBox::*)(
int)
>(&QComboBox::currentIndexChanged),
317 m_pUi->m_doubleSpinBox_from->setVisible(
true);
318 m_pUi->m_label_lowpass->setVisible(
true);
320 m_pUi->m_doubleSpinBox_to->setVisible(
true);
321 m_pUi->m_label_highpass->setVisible(
true);
323 m_pUi->m_spinBox_filterTaps->setVisible(
true);
324 m_pUi->m_label_filterTaps->setVisible(
true);
326 connect(
m_pUi->m_comboBox_filterApplyTo, &QComboBox::currentTextChanged,
337 m_pUi->m_graphicsView_filterPlot->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
338 m_pUi->m_graphicsView_filterPlot->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
355 if(event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) {
359 if((event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z) || event->key() == Qt::Key_Delete) {
371 m_pUi->m_doubleSpinBox_from->value(),
372 m_pUi->m_doubleSpinBox_to->value());
381 Q_UNUSED(currentIndex);
384 switch(
m_pUi->m_comboBox_designMethod->currentIndex()) {
388 m_pUi->m_spinBox_filterTaps->setVisible(
true);
389 m_pUi->m_label_filterTaps->setVisible(
true);
393 m_pUi->m_spinBox_filterTaps->setVisible(
true);
394 m_pUi->m_label_filterTaps->setVisible(
true);
409 double from =
m_pUi->m_doubleSpinBox_from->value();
410 double to =
m_pUi->m_doubleSpinBox_to->value();
412 double trans_width =
m_pUi->m_doubleSpinBox_transitionband->value();
415 double center = from+bw/2;
417 double nyquistFrequency =
m_dSFreq/2;
421 if(
m_pUi->m_spinBox_filterTaps->value()%2 != 0) {
426 m_pUi->m_doubleSpinBox_to->setMaximum(nyquistFrequency);
427 m_pUi->m_doubleSpinBox_from->setMaximum(nyquistFrequency);
428 m_pUi->m_doubleSpinBox_to->setMinimum(0);
429 m_pUi->m_doubleSpinBox_from->setMinimum(0);
431 if((
m_pUi->m_doubleSpinBox_to->value() <
m_pUi->m_doubleSpinBox_from->value())) {
432 m_pUi->m_doubleSpinBox_to->setValue(
m_pUi->m_doubleSpinBox_from->value() + 1);
435 m_pUi->m_doubleSpinBox_to->setMinimum(
m_pUi->m_doubleSpinBox_from->value());
436 m_pUi->m_doubleSpinBox_from->setMaximum(
m_pUi->m_doubleSpinBox_to->value());
444 (
double)center/nyquistFrequency,
445 (
double)bw/nyquistFrequency,
446 (
double)trans_width/nyquistFrequency,
471 QString fileName = QFileDialog::getSaveFileName(
this,
473 QString(
"%1/%2_%3_%4_FilterPlot").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
474 tr(
"Vector graphic(*.svg);;Images (*.png)"));
476 if(!fileName.isEmpty()) {
478 if(fileName.contains(
".svg")) {
479 QSvgGenerator svgGen;
481 svgGen.setFileName(fileName);
483 svgGen.setSize(QSize(rect.width(), rect.height()));
486 QPainter painter(&svgGen);
490 if(fileName.contains(
".png")) {
493 image.fill(Qt::transparent);
495 QPainter painter(&image);
497 image.save(fileName);
513 filterWriteTemp.
getName() = filtername;
515 QString fileName = QFileDialog::getSaveFileName(
this,
516 "Save filter coefficients",
517 QString(
"%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(filtername),
518 tr(
"Text file(*.txt)"));
527 QString path = QFileDialog::getOpenFileName(
this,
528 QString(
"Load filter"),
530 tr(
"txt files (*.txt)"));
532 if(!path.isEmpty()) {
546 qDebug()<<
"Could not load filter.";
561 return m_pUi->m_doubleSpinBox_from->value();
568 return m_pUi->m_doubleSpinBox_to->value();
Contains the declaration of the FilterDesignView class.
Contains the declaration of the FilterPlotScene class.
FiffInfo class declaration.
FilterIO class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
2-D display widgets and visualisation helpers (charts, topography, colour maps).
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void setMaxAllowedFilterTaps(int iMaxNumberFilterTaps)
void changeStateSpinBoxes(int currentIndex)
void updateFilterFrom(double dFrom)
void setFrom(double dFrom)
void updateGuiMode(GuiMode mode)
void setSamplingRate(double dSamplingRate)
void updateFilterTo(double dTo)
void filterParametersChanged()
QPointer< FilterPlotScene > m_pFilterPlotScene
void onBtnExportFilterCoefficients()
void resizeEvent(QResizeEvent *event)
virtual void keyPressEvent(QKeyEvent *event)
void onBtnExportFilterPlot()
UTILSLIB::FilterKernel m_filterKernel
void guiStyleChanged(DISPLIB::AbstractView::StyleMode style)
UTILSLIB::FilterKernel getCurrentFilter()
void setChannelType(const QString &sType)
Ui::FilterDesignViewWidget * m_pUi
void updateProcessingMode(ProcessingMode mode)
void onSpinBoxFilterChannelType(const QString &channelType)
void filterChannelTypeChanged(const QString &channelType)
void updateGuiFromFilter(const UTILSLIB::FilterKernel &filter)
FilterDesignView(const QString &sSettingsPath, QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void filterChanged(const UTILSLIB::FilterKernel &activeFilter)
The FilterPlotScene class provides the scene where a filter response can be plotted.
static bool readFilter(QString path, FilterKernel &filter)
static bool writeFilter(const QString &path, const FilterKernel &filter)
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.
double getParksWidth() const
double getSamplingFrequency() const
static QVector< FilterParameter > m_designMethods
static QVector< FilterParameter > m_filterTypes
int getFilterOrder() const
double getLowpassFreq() const
double getHighpassFreq() const
FilterParameter getDesignMethod() const