From 574370579d6ef3234c276391f7dd8a1e7eeef938 Mon Sep 17 00:00:00 2001 From: Roland Rossgotterer Date: Mon, 30 Sep 2019 14:19:50 +0200 Subject: [PATCH] [AFV] Apply BiQuadFilters on float samples --- .../afv/audio/callsignsampleprovider.cpp | 10 ++++---- src/blacksound/audioutilities.cpp | 23 ++++++++++++++++++- src/blacksound/audioutilities.h | 2 ++ .../equalizersampleprovider.cpp | 23 +++++++++++-------- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/blackcore/afv/audio/callsignsampleprovider.cpp b/src/blackcore/afv/audio/callsignsampleprovider.cpp index 999a69b16..4bba124bb 100644 --- a/src/blackcore/afv/audio/callsignsampleprovider.cpp +++ b/src/blackcore/afv/audio/callsignsampleprovider.cpp @@ -180,7 +180,7 @@ namespace BlackCore { if (m_receiver->getFrequencyHz() < 30000000) { - float crackleFactor = (float)(((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350) - 0.00776652); + double crackleFactor = (((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350.0) - 0.00776652); if (crackleFactor < 0.0f) { crackleFactor = 0.0f; } if (crackleFactor > 0.20f) { crackleFactor = 0.20f; } @@ -189,15 +189,15 @@ namespace BlackCore m_acBusNoise->setGain(m_acBusGainMin + 0.001f); m_simpleCompressorEffect->setEnabled(true); m_voiceEq->setBypassEffects(false); - m_voiceEq->setOutputGain(0.38f); + m_voiceEq->setOutputGain(0.38); m_whiteNoise->setGain(0.0); } else { - float crackleFactor = (float)(((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350) - 0.00776652); + double crackleFactor = (((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350.0) - 0.00776652); - if (crackleFactor < 0.0f) { crackleFactor = 0.0f; } - if (crackleFactor > 0.20f) { crackleFactor = 0.20f; } + if (crackleFactor < 0.0) { crackleFactor = 0.0; } + if (crackleFactor > 0.20) { crackleFactor = 0.20; } m_crackleSoundProvider->setGain(crackleFactor * 2); m_whiteNoise->setGain(m_whiteNoiseGainMin); diff --git a/src/blacksound/audioutilities.cpp b/src/blacksound/audioutilities.cpp index 2c8d4fdc4..36d67e021 100644 --- a/src/blacksound/audioutilities.cpp +++ b/src/blacksound/audioutilities.cpp @@ -26,7 +26,7 @@ namespace BlackSound QVector convertFloatBytesTo16BitPCM(const QByteArray input) { Q_UNUSED(input) - qFatal("Not implemented"); + // qFatal("Not implemented"); return {}; } @@ -52,4 +52,25 @@ namespace BlackSound } return mono; } + + QVector convertFromShortToDouble(const QVector &input) + { + QVector output; + for (auto sample : input) + { + output.push_back(sample / 32768.0); + } + return output; + } + + QVector convertFromDoubleToShort(const QVector &input) + { + QVector output; + for (auto sample : input) + { + output.push_back(sample * 32768); + } + return output; + } + } // ns diff --git a/src/blacksound/audioutilities.h b/src/blacksound/audioutilities.h index a82aa3cd6..eb072e41e 100644 --- a/src/blacksound/audioutilities.h +++ b/src/blacksound/audioutilities.h @@ -22,6 +22,8 @@ namespace BlackSound BLACKSOUND_EXPORT QVector convertFloatBytesTo16BitPCM(const QByteArray input); BLACKSOUND_EXPORT QVector convertFromMonoToStereo(const QVector &mono); BLACKSOUND_EXPORT QVector convertFromStereoToMono(const QVector &stereo); + BLACKSOUND_EXPORT QVector convertFromShortToDouble(const QVector &input); + BLACKSOUND_EXPORT QVector convertFromDoubleToShort(const QVector &input); //! @} } // ns diff --git a/src/blacksound/sampleprovider/equalizersampleprovider.cpp b/src/blacksound/sampleprovider/equalizersampleprovider.cpp index d9b87fe4a..3ccd7f780 100644 --- a/src/blacksound/sampleprovider/equalizersampleprovider.cpp +++ b/src/blacksound/sampleprovider/equalizersampleprovider.cpp @@ -1,4 +1,6 @@ #include "equalizersampleprovider.h" +#include "blacksound/audioutilities.h" +#include namespace BlackSound { @@ -16,19 +18,20 @@ namespace BlackSound int samplesRead = m_sourceProvider->readSamples(samples, count); if (m_bypass) return samplesRead; + QVector doubleSamples = convertFromShortToDouble(samples); + for (int n = 0; n < samplesRead; n++) { // TODO stereo implementation for (int band = 0; band < m_filters.size(); band++) { - float s = samples[n] / 32768.0f; - s = m_filters[band].process(s); - samples[n] = s * 32768; + doubleSamples[n] = m_filters[band].process(doubleSamples[n]); } - - samples[n] *= m_outputGain; + doubleSamples[n] *= m_outputGain; } + + samples = convertFromDoubleToShort(doubleSamples); return samplesRead; } @@ -37,11 +40,11 @@ namespace BlackSound switch (preset) { case VHFEmulation: - m_filters.push_back(BiQuadFilter(BiQuadFilterType::HighPass, 44100, 310, 0.25f)); - m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 450, 0.75f, 17.0f)); - m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 1450, 1.0f, 25.0f)); - m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 2000, 1.0f, 25.0f)); - m_filters.push_back(BiQuadFilter(BiQuadFilterType::LowPass, 44100, 2500, 0.25f)); + m_filters.push_back(BiQuadFilter(BiQuadFilterType::HighPass, 44100, 310, 0.25)); + m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 450, 0.75, 17.0)); + m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 1450, 1.0, 25.0)); + m_filters.push_back(BiQuadFilter(BiQuadFilterType::Peak, 44100, 2000, 1.0, 25.0)); + m_filters.push_back(BiQuadFilter(BiQuadFilterType::LowPass, 44100, 2500, 0.25)); break; } }