22#include "ui_filterdesignview.h"
36#include <QStandardPaths>
37#include <QSvgGenerator>
40#include <QApplication>
64,
m_pUi(new Ui::FilterDesignViewWidget)
93 if(iMaxNumberFilterTaps%2 != 0) {
94 iMaxNumberFilterTaps--;
97 m_pUi->m_spinBox_filterTaps->setMaximum(iMaxNumberFilterTaps);
98 m_pUi->m_spinBox_filterTaps->setMinimum(16);
108 return m_pUi->m_spinBox_filterTaps->value();
115 if(dSamplingRate <= 0) {
116 qWarning() <<
"[FilterDesignView::setSamplingRate] Sampling frequency is <= 0. Returning.";
122 double nyquistFrequency =
m_dSFreq/2;
124 m_pUi->m_doubleSpinBox_to->setMaximum(nyquistFrequency);
125 m_pUi->m_doubleSpinBox_from->setMaximum(nyquistFrequency);
144 m_pUi->m_doubleSpinBox_from->setValue(dFrom);
152 m_pUi->m_doubleSpinBox_to->setValue(dTo);
167 return m_pUi->m_comboBox_filterApplyTo->currentText();
174 m_pUi->m_comboBox_filterApplyTo->setCurrentText(sType);
186 QSettings settings(
"MNECPP");
194 settings.setValue(
m_sSettingsPath + QString(
"/FilterDesignView/Position"), this->pos());
205 QSettings settings(
"MNECPP");
208 m_pUi->m_doubleSpinBox_to->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterTo"), 40.0).toDouble());
209 m_pUi->m_doubleSpinBox_from->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterFrom"), 1.0).toDouble());
210 m_pUi->m_spinBox_filterTaps->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterOrder"), 128).toInt());
212 m_pUi->m_doubleSpinBox_transitionband->setValue(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterTransition"), 0.1).toDouble());
213 m_pUi->m_comboBox_filterApplyTo->setCurrentText(settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/filterChannelType"),
"All").toString());
215 QPoint pos = settings.value(
m_sSettingsPath + QString(
"/FilterDesignView/Position"), QPoint(100,100)).toPoint();
217 QRect screenRect = QApplication::primaryScreen()->geometry();
218 if(!screenRect.contains(pos) && QGuiApplication::screens().size() == 1) {
219 move(QPoint(100,100));
253 connect(
m_pUi->m_doubleSpinBox_from, &QDoubleSpinBox::editingFinished,
256 connect(
m_pUi->m_doubleSpinBox_to, &QDoubleSpinBox::editingFinished,
259 connect(
m_pUi->m_doubleSpinBox_transitionband, &QDoubleSpinBox::editingFinished,
262 connect(
m_pUi->m_spinBox_filterTaps, &QSpinBox::editingFinished,
266 m_pUi->m_doubleSpinBox_from->installEventFilter(
this);
267 m_pUi->m_doubleSpinBox_to->installEventFilter(
this);
268 m_pUi->m_doubleSpinBox_transitionband->installEventFilter(
this);
275 connect(
m_pUi->m_pushButton_exportPlot,&QPushButton::released,
278 connect(
m_pUi->m_pushButton_exportFilter,&QPushButton::released,
281 connect(
m_pUi->m_pushButton_loadFilter,&QPushButton::released,
290 m_pUi->m_comboBox_designMethod->addItem(filterMethod.getName());
293 connect(
m_pUi->m_comboBox_designMethod,
static_cast<void (QComboBox::*)(
int)
>(&QComboBox::currentIndexChanged),
297 m_pUi->m_doubleSpinBox_from->setVisible(
true);
298 m_pUi->m_label_lowpass->setVisible(
true);
300 m_pUi->m_doubleSpinBox_to->setVisible(
true);
301 m_pUi->m_label_highpass->setVisible(
true);
303 m_pUi->m_spinBox_filterTaps->setVisible(
true);
304 m_pUi->m_label_filterTaps->setVisible(
true);
306 connect(
m_pUi->m_comboBox_filterApplyTo, &QComboBox::currentTextChanged,
317 m_pUi->m_graphicsView_filterPlot->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
318 m_pUi->m_graphicsView_filterPlot->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
335 if(event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) {
339 if((event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z) || event->key() == Qt::Key_Delete) {
351 m_pUi->m_doubleSpinBox_from->value(),
352 m_pUi->m_doubleSpinBox_to->value());
361 Q_UNUSED(currentIndex);
364 switch(
m_pUi->m_comboBox_designMethod->currentIndex()) {
368 m_pUi->m_spinBox_filterTaps->setVisible(
true);
369 m_pUi->m_label_filterTaps->setVisible(
true);
373 m_pUi->m_spinBox_filterTaps->setVisible(
true);
374 m_pUi->m_label_filterTaps->setVisible(
true);
389 double from =
m_pUi->m_doubleSpinBox_from->value();
390 double to =
m_pUi->m_doubleSpinBox_to->value();
392 double trans_width =
m_pUi->m_doubleSpinBox_transitionband->value();
395 double center = from+bw/2;
397 double nyquistFrequency =
m_dSFreq/2;
401 if(
m_pUi->m_spinBox_filterTaps->value()%2 != 0) {
406 m_pUi->m_doubleSpinBox_to->setMaximum(nyquistFrequency);
407 m_pUi->m_doubleSpinBox_from->setMaximum(nyquistFrequency);
408 m_pUi->m_doubleSpinBox_to->setMinimum(0);
409 m_pUi->m_doubleSpinBox_from->setMinimum(0);
411 if((
m_pUi->m_doubleSpinBox_to->value() <
m_pUi->m_doubleSpinBox_from->value())) {
412 m_pUi->m_doubleSpinBox_to->setValue(
m_pUi->m_doubleSpinBox_from->value() + 1);
415 m_pUi->m_doubleSpinBox_to->setMinimum(
m_pUi->m_doubleSpinBox_from->value());
416 m_pUi->m_doubleSpinBox_from->setMaximum(
m_pUi->m_doubleSpinBox_to->value());
424 (
double)center/nyquistFrequency,
425 (
double)bw/nyquistFrequency,
426 (
double)trans_width/nyquistFrequency,
451 QString fileName = QFileDialog::getSaveFileName(
this,
453 QString(
"%1/%2_%3_%4_FilterPlot").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(date.currentDate().year()).arg(date.currentDate().month()).arg(date.currentDate().day()),
454 tr(
"Vector graphic(*.svg);;Images (*.png)"));
456 if(!fileName.isEmpty()) {
458 if(fileName.contains(
".svg")) {
459 QSvgGenerator svgGen;
461 svgGen.setFileName(fileName);
463 svgGen.setSize(QSize(rect.width(), rect.height()));
466 QPainter painter(&svgGen);
470 if(fileName.contains(
".png")) {
473 image.fill(Qt::transparent);
475 QPainter painter(&image);
477 image.save(fileName);
493 filterWriteTemp.
getName() = filtername;
495 QString fileName = QFileDialog::getSaveFileName(
this,
496 "Save filter coefficients",
497 QString(
"%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(filtername),
498 tr(
"Text file(*.txt)"));
507 QString path = QFileDialog::getOpenFileName(
this,
508 QString(
"Load filter"),
510 tr(
"txt files (*.txt)"));
512 if(!path.isEmpty()) {
526 qDebug()<<
"Could not load filter.";
541 return m_pUi->m_doubleSpinBox_from->value();
548 return m_pUi->m_doubleSpinBox_to->value();
Interactive FIR / IIR filter design GUI with a live magnitude / phase preview.
QGraphicsScene that draws the magnitude (and optional phase) response of a designed FIR / IIR filter.
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
Plain-text serialisation of FilterKernel coefficient sets.
FIFF file I/O, in-memory data structures and high-level readers/writers.
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)
QGraphicsScene rendering the magnitude (and optional phase) response of a designed FIR / IIR filter.
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