From 0a83f5082138877ed2d6a506b4fdc334d06150d7 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 18 May 2022 22:21:12 +0200 Subject: [PATCH] Added Blackman-Harris 7 term FFT window --- .../demodchirpchat/chirpchatdemodgui.ui | 5 ++++ plugins/channelrx/demodssb/ssbdemodgui.ui | 5 ++++ .../channelrx/demodssb/ssbdemodsettings.cpp | 3 ++- sdrbase/dsp/fftwindow.cpp | 4 +++ sdrbase/dsp/fftwindow.h | 27 +++++++++++++++---- sdrgui/gui/glspectrumgui.ui | 5 ++++ 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/plugins/channelrx/demodchirpchat/chirpchatdemodgui.ui b/plugins/channelrx/demodchirpchat/chirpchatdemodgui.ui index 8c14b944e..d3e938fcc 100644 --- a/plugins/channelrx/demodchirpchat/chirpchatdemodgui.ui +++ b/plugins/channelrx/demodchirpchat/chirpchatdemodgui.ui @@ -336,6 +336,11 @@ Black + + + B-H7 + + diff --git a/plugins/channelrx/demodssb/ssbdemodgui.ui b/plugins/channelrx/demodssb/ssbdemodgui.ui index b82c8f2d6..c14f736e7 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.ui +++ b/plugins/channelrx/demodssb/ssbdemodgui.ui @@ -415,6 +415,11 @@ Black + + + B-H7 + + diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index ebe321025..c6837a864 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -188,7 +188,8 @@ bool SSBDemodSettings::deserialize(const QByteArray& data) d.readS32(102+ 10*i, &tmp, 3); m_filterBank[i].m_lowCutoff = tmp * 100.0; d.readS32(103 + 10*i, &tmp, (int) FFTWindow::Blackman); - m_filterBank[i].m_fftWindow = (FFTWindow::Function) (tmp < 0 ? 0 : tmp > (int) FFTWindow::Blackman ? (int) FFTWindow::Blackman : tmp); + m_filterBank[i].m_fftWindow = + (FFTWindow::Function) (tmp < 0 ? 0 : tmp > (int) FFTWindow::BlackmanHarris7 ? (int) FFTWindow::BlackmanHarris7 : tmp); } return true; diff --git a/sdrbase/dsp/fftwindow.cpp b/sdrbase/dsp/fftwindow.cpp index 3ded5e75f..a1cfe4f4a 100644 --- a/sdrbase/dsp/fftwindow.cpp +++ b/sdrbase/dsp/fftwindow.cpp @@ -76,6 +76,10 @@ void FFTWindow::create(Function function, int n) wFunc = blackman; break; + case BlackmanHarris7: + wFunc = blackmanHarris7; + break; + case Rectangle: default: wFunc = rectangle; diff --git a/sdrbase/dsp/fftwindow.h b/sdrbase/dsp/fftwindow.h index a64dc3337..b543aa39d 100644 --- a/sdrbase/dsp/fftwindow.h +++ b/sdrbase/dsp/fftwindow.h @@ -34,7 +34,8 @@ public: Hanning, Rectangle, Kaiser, - Blackman + Blackman, + BlackmanHarris7 }; FFTWindow(); @@ -65,15 +66,31 @@ private: return (2.0 / (n - 1.0)) * ( (n - 1.0) / 2.0 - fabs(i - (n - 1.0) / 2.0)) * 2.0; } - static inline Real blackmanHarris(Real n, Real i) + static inline Real blackmanHarris(Real n, Real i) // 4 term Blackman-Harris { // amplitude correction = 2.79 - return (0.35875 - 0.48829 * cos((2.0 * M_PI * i) / n) + 0.14128 * cos((4.0 * M_PI * i) / n) - 0.01168 * cos((6.0 * M_PI * i) / n)) * 2.79; + return (0.35875 + - 0.48829 * cos((2.0 * M_PI * i) / n) + + 0.14128 * cos((4.0 * M_PI * i) / n) + - 0.01168 * cos((6.0 * M_PI * i) / n)) * 2.79; } - static inline Real blackman(Real n, Real i) + static inline Real blackmanHarris7(Real n, Real i) // 7 term Blackman-Harris + { + return (0.27105 + - 0.43330 * cos((2.0 * M_PI * i) / n) + + 0.21812 * cos((4.0 * M_PI * i) / n) + - 0.065925 * cos((6.0 * M_PI * i) / n) + + 0.010812 * cos((8.0 * M_PI * i) / n) + - 0.00077658 * cos((10.0 * M_PI * i) / n) + + 0.000013887 * cos((12.0 * M_PI * i) / n)) * 3.72; + } + + static inline Real blackman(Real n, Real i) // 3 term Blackman { - return (0.42438 - 0.49734 * cos(2.0 * M_PI * i / n) + 0.078279 * cos(4.0 * M_PI * i / n)) * 2.37; + return (0.42438 + - 0.49734 * cos(2.0 * M_PI * i / n) + + 0.078279 * cos(4.0 * M_PI * i / n)) * 2.37; } static inline Real hamming(Real n, Real i) diff --git a/sdrgui/gui/glspectrumgui.ui b/sdrgui/gui/glspectrumgui.ui index d676195b8..788f65f99 100644 --- a/sdrgui/gui/glspectrumgui.ui +++ b/sdrgui/gui/glspectrumgui.ui @@ -106,6 +106,11 @@ Black + + + B-H7 + +