Skip to content

Commit 4af7e83

Browse files
committed
Performance improvement
1 parent 9c52497 commit 4af7e83

File tree

2 files changed

+29
-31
lines changed

2 files changed

+29
-31
lines changed

source/NSD/GoertzelFilter.cs

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,33 @@ namespace NSD
44
{
55
public class GoertzelFilter
66
{
7-
public double coeff;
8-
public double sine;
9-
public double cosine;
7+
private readonly double coeff;
8+
private readonly double sine;
9+
private readonly double cosine;
1010

1111
public GoertzelFilter(double filterFreq, double sampleFreq)
1212
{
13-
double w = 2 * Math.PI * (filterFreq / sampleFreq);
14-
double wr, wi;
15-
16-
wr = Math.Cos(w);
17-
wi = Math.Sin(w);
18-
coeff = 2 * wr;
19-
cosine = wr;
20-
sine = wi;
13+
double w = 2.0 * Math.PI * (filterFreq / sampleFreq);
14+
cosine = Math.Cos(w);
15+
sine = Math.Sin(w);
16+
coeff = 2.0 * cosine;
2117
}
2218

2319
public Complex Process(Span<double> samples)
2420
{
25-
double sprev = 0.0;
26-
double sprev2 = 0.0;
27-
double s, imag, real;
28-
int n;
21+
double Q0 = 0.0;
22+
double Q1 = 0.0;
23+
double Q2 = 0.0;
2924

30-
for (n = 0; n < samples.Length; n++)
25+
for (int n = 0; n < samples.Length; n++)
3126
{
32-
s = samples[n] + coeff * sprev - sprev2;
33-
sprev2 = sprev;
34-
sprev = s;
27+
Q0 = coeff * Q1 - Q2 + samples[n];
28+
Q2 = Q1;
29+
Q1 = Q0;
3530
}
3631

37-
real = sprev * cosine - sprev2;
38-
imag = -sprev * sine;
39-
32+
var real = Q1 * cosine - Q2;
33+
var imag = -Q1 * sine;
4034
return new Complex(real, imag);
4135
}
4236
}

source/NSD/Windows.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
3-
namespace NSD
1+
namespace NSD
42
{
53
public static class Windows
64
{
@@ -13,11 +11,13 @@ public static Memory<double> HFT95(int width, out double optimumOverlap, out dou
1311
optimumOverlap = 0.756;
1412
NENBW = 3.8112;
1513
Memory<double> window = new double[width];
14+
var windowSpan = window.Span;
15+
double angleIncrement = 2.0 * Math.PI / width;
1616
for (int i = 0; i < width; i++)
1717
{
18-
double z = (2.0 * Math.PI * i) / width;
18+
double z = angleIncrement * i;
1919
double wj = 1 - (1.9383379 * Math.Cos(z)) + (1.3045202 * Math.Cos(2 * z)) - (0.4028270 * Math.Cos(3 * z)) + (0.0350665 * Math.Cos(4 * z));
20-
window.Span[i] = wj;
20+
windowSpan[i] = wj;
2121
}
2222
return window;
2323
}
@@ -31,11 +31,13 @@ public static Memory<double> HFT90D(int width, out double optimumOverlap, out do
3131
optimumOverlap = 0.76;
3232
NENBW = 3.8832;
3333
Memory<double> window = new double[width];
34+
var windowSpan = window.Span;
35+
double angleIncrement = 2.0 * Math.PI / width;
3436
for (int i = 0; i < width; i++)
3537
{
36-
double z = (2.0 * Math.PI * i) / width;
38+
double z = angleIncrement * i;
3739
double wj = 1 - (1.942604 * Math.Cos(z)) + (1.340318 * Math.Cos(2 * z)) - (0.440811 * Math.Cos(3 * z)) + (0.043097 * Math.Cos(4 * z));
38-
window.Span[i] = wj;
40+
windowSpan[i] = wj;
3941
}
4042

4143
return window;
@@ -50,11 +52,13 @@ public static Memory<double> FTNI(int width, out double optimumOverlap, out doub
5052
optimumOverlap = 0.656;
5153
NENBW = 2.9656;
5254
Memory<double> window = new double[width];
55+
var windowSpan = window.Span;
56+
double angleIncrement = 2.0 * Math.PI / width;
5357
for (int i = 0; i < width; i++)
5458
{
55-
double z = (2.0 * Math.PI * i) / width;
59+
double z = angleIncrement * i;
5660
double wj = 0.2810639 - (0.5208972 * Math.Cos(z)) + (0.1980399 * Math.Cos(2 * z));
57-
window.Span[i] = wj;
61+
windowSpan[i] = wj;
5862
}
5963
return window;
6064
}

0 commit comments

Comments
 (0)