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