From cd6705c957e64a5907eae247e317366be93e2b62 Mon Sep 17 00:00:00 2001 From: Alexander Diamadis Date: Sun, 17 Oct 2021 21:16:46 +0200 Subject: [PATCH] First Version with basic functionality Signed-off-by: Alexander Diamadis --- PA_Calculator.pro | 29 +++ PA_Calculator_en_US.ts | 3 + main.cpp | 23 ++ mainwindow.cpp | 106 +++++++++ mainwindow.h | 26 +++ mainwindow.ui | 489 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 676 insertions(+) create mode 100644 PA_Calculator.pro create mode 100644 PA_Calculator_en_US.ts create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui diff --git a/PA_Calculator.pro b/PA_Calculator.pro new file mode 100644 index 0000000..ba6785a --- /dev/null +++ b/PA_Calculator.pro @@ -0,0 +1,29 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + mainwindow.h + +FORMS += \ + mainwindow.ui + +TRANSLATIONS += \ + PA_Calculator_en_US.ts +CONFIG += lrelease +CONFIG += embed_translations + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/PA_Calculator_en_US.ts b/PA_Calculator_en_US.ts new file mode 100644 index 0000000..edd0d34 --- /dev/null +++ b/PA_Calculator_en_US.ts @@ -0,0 +1,3 @@ + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..755929d --- /dev/null +++ b/main.cpp @@ -0,0 +1,23 @@ +#include "mainwindow.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "PA_Calculator_" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..9b5e41f --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,106 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::on_ComboBox_selectSensUnit_currentIndexChanged(int index) +{ + double oldValue=ui->doubleSpinBox_ampInputSens->value(); + if (index==0){ + ui->doubleSpinBox_ampInputSens->setSuffix(QString(" V")); + ui->doubleSpinBox_ampInputSens->setDecimals(2); + ui->doubleSpinBox_ampInputSens->setValue(0.7746*qPow(10,oldValue/20)); + }else{ + ui->doubleSpinBox_ampInputSens->setSuffix(QString(" dBu")); + ui->doubleSpinBox_ampInputSens->setDecimals(1); + ui->doubleSpinBox_ampInputSens->setValue(20*std::log10(oldValue/0.7746)); + } + +} + + +void MainWindow::on_pushButton_requestLimiter_clicked() +{ + qreal vMaxSpeakerInRMS=20*std::log10(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerRMSPower->value())/0.7746); + qreal vMaxSpeakerInPeak=20*std::log10(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerPeakPower->value())/0.7746); + + qreal vAmpSens_volt=0; + qreal vAmpsens_dBu=0; + if(ui->ComboBox_selectSensUnit->currentIndex()==0){ + vAmpSens_volt=ui->doubleSpinBox_ampInputSens->value(); + vAmpsens_dBu=20*std::log10(vAmpSens_volt/0.7746); + }else{ + vAmpSens_volt=qPow(10,ui->doubleSpinBox_ampInputSens->value()/20)*0.7746; + vAmpsens_dBu=ui->doubleSpinBox_ampInputSens->value(); + } + + qreal voltageGain=20*std::log10(qSqrt(ui->spinBox_AmpImp->value()*ui->spinBox_AmpPower->value())/vAmpSens_volt); + qreal vMaxAmpInRMS=vMaxSpeakerInRMS-voltageGain; + qreal vMaxAmpInPeak=vMaxSpeakerInPeak-voltageGain; + + qreal thresholdRMS=-18-(ui->spinBox_digitalNominalLevel->value()-vMaxAmpInRMS); + qreal thresholdPeak=-18-(ui->spinBox_digitalNominalLevel->value()-vMaxAmpInPeak); + qreal attackTimeRMS=(double)1000/ui->spinBox_speakerHPF->value(); + qreal releaseTimeRMS=attackTimeRMS*8; + qreal releaseTimePeak=attackTimeRMS; + + if (vAmpsens_dBulabel_thresholdRMS->setText(QString("not required")); + ui->label_attackTimeRMS->setText(QString::number(attackTimeRMS,'f',2)+QString(" ms")); + ui->label_releaseTimeRMS->setText(QString::number(releaseTimeRMS,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInRMS->setText(QString::number(vMaxSpeakerInRMS,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerRMSPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInRMS->setText(QString("not applicable")); + + + thresholdPeak=-18-(ui->spinBox_digitalNominalLevel->value()-vAmpsens_dBu); + ui->label_thresholdPeak->setText(QString::number(thresholdPeak,'f',1)+QString(" dBFS")); + ui->label_releaseTimePeak->setText(QString::number(releaseTimePeak,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInPeak->setText(QString::number(vMaxSpeakerInPeak,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerPeakPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInPeak->setText(QString::number(vAmpSens_volt,'f',2)+QString(" V (= input sensitivity)")); + }else if (vAmpsens_dBulabel_thresholdRMS->setText(QString::number(thresholdRMS,'f',1)+QString(" dBFS")); + ui->label_attackTimeRMS->setText(QString::number(attackTimeRMS,'f',2)+QString(" ms")); + ui->label_releaseTimeRMS->setText(QString::number(releaseTimeRMS,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInRMS->setText(QString::number(vMaxSpeakerInRMS,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerRMSPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInRMS->setText(QString::number(vMaxAmpInRMS,'f',2)+QString(" dBU (")+QString::number(qPow(10,vMaxAmpInRMS/20)*0.7746,'f',2)+QString(" V)")); + + thresholdPeak=-18-(ui->spinBox_digitalNominalLevel->value()-vAmpsens_dBu); + ui->label_thresholdPeak->setText(QString::number(thresholdPeak,'f',1)+QString(" dBFS")); + ui->label_releaseTimePeak->setText(QString::number(releaseTimePeak,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInPeak->setText(QString::number(vMaxSpeakerInPeak,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerPeakPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInPeak->setText(QString::number(vAmpSens_volt,'f',2)+QString(" V (= input sensitivity)")); + }else{ + ui->label_thresholdRMS->setText(QString::number(thresholdRMS,'f',1)+QString(" dBFS")); + ui->label_attackTimeRMS->setText(QString::number(attackTimeRMS,'f',2)+QString(" ms")); + ui->label_releaseTimeRMS->setText(QString::number(releaseTimeRMS,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInRMS->setText(QString::number(vMaxSpeakerInRMS,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerRMSPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInRMS->setText(QString::number(vMaxAmpInRMS,'f',2)+QString(" dBU (")+QString::number(qPow(10,vMaxAmpInRMS/20)*0.7746,'f',2)+QString(" V)")); + + ui->label_thresholdPeak->setText(QString::number(thresholdPeak,'f',1)+QString(" dBFS")); + ui->label_releaseTimePeak->setText(QString::number(releaseTimePeak,'f',2)+QString(" ms")); + ui->label_UMaxSpeakerInPeak->setText(QString::number(vMaxSpeakerInPeak,'f',2)+QString(" dBU (")+QString::number(qSqrt(ui->spinBox_speakerImp->value()*ui->spinBox_speakerPeakPower->value()),'f',2)+QString(" V)")); + ui->label_UMaxAmpInPeak->setText(QString::number(vMaxAmpInPeak,'f',2)+QString(" dBU (")+QString::number(qPow(10,vMaxAmpInPeak/20)*0.7746,'f',2)+QString(" V)")); + } + + + + +} + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..9c534f3 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,26 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_ComboBox_selectSensUnit_currentIndexChanged(int index); + + void on_pushButton_requestLimiter_clicked(); + +private: + Ui::MainWindow *ui; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..3c92a04 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,489 @@ + + + MainWindow + + + + 0 + 0 + 931 + 460 + + + + PA Calculator + + + + + + + + + Amplifier Specifications + + + + + + + + Rated Power + + + + + + + W + + + + + + 1 + + + 10000 + + + 380 + + + + + + + Impedance Rating + + + + + + + Ohm + + + 1 + + + 32 + + + 8 + + + + + + + Input Sensitivity + + + + + + + V + + + 0.010000000000000 + + + 1.100000000000000 + + + + + + + + in Volt + + + + + in dBu + + + + + + + + + + + + + Speaker Specifications + + + + + + + + Rated Impedance + + + + + + + Ohm + + + 1 + + + 32 + + + 8 + + + + + + + RMS Power + + + + + + + W + + + 1 + + + 10000 + + + 400 + + + + + + + Peak Power + + + + + + + W + + + 1 + + + 10000 + + + 1200 + + + + + + + Crossover highpass-frequency + + + + + + + Hz + + + 10 + + + 20000 + + + 120 + + + + + + + + + + + + DA-Converter Specifications + + + + + + + + Nominal Output Level (at -18 dBFS) + + + + + + + dBu + + + -100 + + + 100 + + + + + + + + + + + + + + Request Limiter Settings + + + + + + + + + RMS Limiter + + + false + + + false + + + + + + + + maximum Voltage at speaker input: + + + + + + + 0 dBU + + + + + + + maximum Voltage at amplifier input: + + + + + + + 0 dBU + + + + + + + Threshold: + + + + + + + + 15 + 75 + true + + + + 0 dBFS + + + + + + + Attack Time: + + + + + + + + 15 + + + + 0 ms + + + + + + + Release Time: + + + + + + + + 15 + + + + 0 ms + + + + + + + + + + + + Peak Limiter + + + + + + + + maximum Voltage at speaker input: + + + + + + + 0 dBU + + + + + + + maximum Voltage at amplifier input: + + + + + + + 0 dBU + + + + + + + Threshold: + + + + + + + + 15 + 75 + true + + + + 0 dBFS + + + + + + + Attack Time: + + + + + + + + 15 + + + + 0 ms + + + + + + + Release Time: + + + + + + + + 15 + + + + 0 ms + + + + + + + + + + + + + + + + 0 + 0 + 931 + 22 + + + + + + + + -- 2.38.5