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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+