aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2018-12-02 23:30:02 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2018-12-02 23:30:02 +0300
commite012be6a2e6938676a2c97cfdd22affb43b5565f (patch)
tree3d80b052a249ec871c6158573363de3ba4a4b68c /src
parent4275785ac40b12584277e2fb7b31ef6ec1fceed8 (diff)
downloadlibgha-e012be6a2e6938676a2c97cfdd22affb43b5565f.tar.gz
Optimize gha_search_omega - do not call sin/cos each iteration
Diffstat (limited to 'src')
-rw-r--r--src/gha.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/gha.c b/src/gha.c
index b7aefca..194b61c 100644
--- a/src/gha.c
+++ b/src/gha.c
@@ -130,18 +130,30 @@ static void gha_search_omega_newton(const FLOAT* pcm, size_t bin, size_t size, s
double ddXr = 0;
double ddXs = 0;
+ const double a = cos(omega_rad);
+ const double b = sin(omega_rad);
+ double c = 1.0;
+ double s = 0.0;
+
for (n = 0; n < size; n++) {
- double c = pcm[n] * cos(omega_rad * n);
- double s = pcm[n] * sin(omega_rad * n);
+ double cm = pcm[n] * c;
+ double sm = pcm[n] * s;
double tc, ts;
- Xr += c;
- Xi += s;
- tc = n * c;
- ts = n * s;
+ Xr += cm;
+ Xi += sm;
+ tc = n * cm;
+ ts = n * sm;
dXr -= ts;
dXi += tc;
ddXr -= n * tc;
ddXs -= n * ts;
+
+ const double new_c = a * c - b * s;
+ const double new_s = b * c + a * s;
+ c = new_c;
+ s = new_s;
+
+
}
double F = Xr * dXr + Xi * dXi;