From a0aec87bec5c929bfab1318c1ce9dbff38de7d09 Mon Sep 17 00:00:00 2001 From: Scott W Harden Date: Wed, 6 Oct 2021 22:38:36 -0400 Subject: [PATCH] Window: Add Kaiser window resolves #35 --- dev/python/bessel.py | 10 ++++++ dev/windows.png | Bin 36322 -> 41232 bytes src/FftSharp.Tests/Window.cs | 65 +++++++++++++++++++++++++++++++++++ src/FftSharp/Window.cs | 58 +++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 dev/python/bessel.py diff --git a/dev/python/bessel.py b/dev/python/bessel.py new file mode 100644 index 0000000..5214a10 --- /dev/null +++ b/dev/python/bessel.py @@ -0,0 +1,10 @@ +import numpy as np +xs = np.arange(20) +print(xs) +print(np.i0(xs)) + +import matplotlib.pyplot as plt +window = np.kaiser(50, 14) +print(window) +plt.plot(window) +plt.show() \ No newline at end of file diff --git a/dev/windows.png b/dev/windows.png index fc5539525bb4b30e4ab6d8b8cbfe9ae51adc849d..e2e6f49a46c0586dd6b56208dba559079c287a18 100644 GIT binary patch literal 41232 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 import numpy as np + >>> np.i0(np.arange(20)) + */ + + double[] expected = { + 1.00000000e+00, 1.26606588e+00, 2.27958530e+00, 4.88079259e+00, + 1.13019220e+01, 2.72398718e+01, 6.72344070e+01, 1.68593909e+02, + 4.27564116e+02, 1.09358835e+03, 2.81571663e+03, 7.28848934e+03, + 1.89489253e+04, 4.94444896e+04, 1.29418563e+05, 3.39649373e+05, + 8.93446228e+05, 2.35497022e+06, 6.21841242e+06, 1.64461904e+07, + }; + + double[] actual = FftSharp.Window.BesselZero(expected.Length); + + for (int i = 0; i < expected.Length; i++) + { + double allowableError = .00001 * expected[i]; + Assert.AreEqual(expected[i], actual[i], allowableError); + } + } + + [Test] + public void Test_Kaiser_MatchesPython() + { + /* expected values calculated with python: + >>> import numpy as np + >>> np.kaiser(50, 14) + */ + double[] expected = { + 7.72686684e-06, 8.15094846e-05, 3.26000767e-04, 9.42588751e-04, 2.26624847e-03, + 4.80567914e-03, 9.27621459e-03, 1.66164301e-02, 2.79789657e-02, 4.46873500e-02, + 6.81537432e-02, 9.97574012e-02, 1.40689805e-01, 1.91778970e-01, 2.53311387e-01, + 3.24874218e-01, 4.05241756e-01, 4.92328143e-01, 5.83222700e-01, 6.74315433e-01, + 7.61509399e-01, 8.40504954e-01, 9.07130390e-01, 9.57685605e-01, 9.89261639e-01, + 1.00000000e+00, 9.89261639e-01, 9.57685605e-01, 9.07130390e-01, 8.40504954e-01, + 7.61509399e-01, 6.74315433e-01, 5.83222700e-01, 4.92328143e-01, 4.05241756e-01, + 3.24874218e-01, 2.53311387e-01, 1.91778970e-01, 1.40689805e-01, 9.97574012e-02, + 6.81537432e-02, 4.46873500e-02, 2.79789657e-02, 1.66164301e-02, 9.27621459e-03, + 4.80567914e-03, 2.26624847e-03, 9.42588751e-04, 3.26000767e-04, 8.15094846e-05, + }; + + double[] actual = FftSharp.Window.Kaiser(51, 14); + + for (int i = 0; i < expected.Length; i++) + { + double allowableError = .00001 * expected[i]; + Assert.AreEqual(expected[i], actual[i], allowableError); + } + } } } diff --git a/src/FftSharp/Window.cs b/src/FftSharp/Window.cs index 9ebdebf..3c2010c 100644 --- a/src/FftSharp/Window.cs +++ b/src/FftSharp/Window.cs @@ -138,6 +138,64 @@ public static double[] Cosine(int pointCount) return window; } + public static int Factorial(int k) + { + int result = 1; + + for (int i = 2; i <= k; i++) + result *= i; + + return result; + } + + public static double[] BesselZero(int pointCount) + { + double[] window = new double[pointCount]; + + for (int i = 0; i < pointCount; i++) + window[i] = I0(i); + + return window; + } + + public static double I0(double x) + { + // Derived from code workby oygx210/navguide: + // https://github.com/oygx210/navguide/blob/master/src/common/bessel.c + + double ax = Math.Abs(x); + if (ax < 3.75) + { + double y = Math.Pow(x / 3.75, 2); + double[] m = { 3.5156229, 3.0899424, 1.2067492, 0.2659732, 0.360768e-1, 0.45813e-2 }; + return 1.0 + y * (m[0] + y * (m[1] + y * (m[2] + y * (m[3] + y * (m[4] + y * m[5]))))); + } + else + { + double y = 3.75 / ax; + double[] m = { 0.39894228, 0.1328592e-1, 0.225319e-2, -0.157565e-2, 0.916281e-2, -0.2057706e-1, 0.2635537e-1, -0.1647633e-1, 0.392377e-2 }; + return (Math.Exp(ax) / Math.Sqrt(ax)) * (m[0] + y * (m[1] + y * (m[2] + y * (m[3] + y * (m[4] + y * (m[5] + y * (m[6] + y * (m[7] + y * m[8])))))))); + } + } + + public static double[] Kaiser(int pointCount, double beta) + { + // derived from python/numpy: + // https://github.com/numpy/numpy/blob/v1.21.0/numpy/lib/function_base.py#L3267-L3392 + + int M = pointCount; + double alpha = (M - 1) / 2.0; + + double[] window = new double[pointCount]; + + for (int n = 0; n < pointCount; n++) + { + window[n] = I0(beta * Math.Sqrt(1 - (Math.Pow((n - alpha) / alpha, 2)))) / I0(beta); + } + + return window; + } + public static string[] GetWindowNames() { return typeof(Window)