diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2018-12-02 23:30:02 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2018-12-02 23:30:02 +0300 |
commit | e012be6a2e6938676a2c97cfdd22affb43b5565f (patch) | |
tree | 3d80b052a249ec871c6158573363de3ba4a4b68c /src | |
parent | 4275785ac40b12584277e2fb7b31ef6ec1fceed8 (diff) | |
download | libgha-e012be6a2e6938676a2c97cfdd22affb43b5565f.tar.gz |
Optimize gha_search_omega - do not call sin/cos each iteration
Diffstat (limited to 'src')
-rw-r--r-- | src/gha.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -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; |