You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pa-calculator/mainwindow.cpp

107 lines
6.5 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QtMath>
#include <QMessageBox>
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_dBu<vMaxAmpInRMS){
QMessageBox msgBox(QMessageBox::Warning,"Amplifier can't deliver maximum RMS power","The maximum power level of the amplifier is below the maximum RMS power level of the speaker. To protect the speaker from a distorted signal the amplifier might deliver, a peak limiter is required with the amplifiers input sensitivty set as its threshold.");
msgBox.exec();
ui->label_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_dBu<vMaxAmpInPeak){
QMessageBox msgBox(QMessageBox::Warning,"Amplifier can't deliver maximum peak power","The maximum power level of the amplifier is below the maximum peak power level of the speaker. To protect the speaker from a distorted signal the amplifier might deliver, a peak limiter is required with the amplifiers input sensitivty set as its threshold.");
msgBox.exec();
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)"));
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)"));
}
}