changeset 227:cabf2f465d1b

tristimulus1 correction
author Sean Enderby <sean.enderby@gmail.com>
date Tue, 25 Feb 2014 13:19:04 +0000
parents 223febe2688b
children cccd314664ac
files src/scalar.c
diffstat 1 files changed, 113 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/scalar.c	Mon Feb 24 14:57:02 2014 +0000
+++ b/src/scalar.c	Tue Feb 25 13:19:04 2014 +0000
@@ -298,22 +298,126 @@
     return XTRACT_SUCCESS;
 }
 
+/*
+ *int xtract_tristimulus_1(const double *data, const int N, const void *argv, double *result)
+ *{
+ *
+ *    int n = N;
+ *
+ *    double den, p1, temp;
+ *
+ *    den = p1 = temp = 0.0;
+ *
+ *    for(n = 0; n < N; n++)
+ *    {
+ *        if((temp = data[n]))
+ *        {
+ *            den += temp;
+ *            if(!p1)
+ *                p1 = temp;
+ *        }
+ *    }
+ *
+ *    if(den == 0.0 || p1 == 0.0)
+ *    {
+ *        *result = 0.0;
+ *        return XTRACT_NO_RESULT;
+ *    }
+ *    else
+ *    {
+ *        *result = p1 / den;
+ *        return XTRACT_SUCCESS;
+ *    }
+ *}
+ *
+ *int xtract_tristimulus_2(const double *data, const int N, const void *argv, double *result)
+ *{
+ *
+ *    int n = N;
+ *
+ *    double den, p2, p3, p4, ps, temp;
+ *
+ *    den = p2 = p3 = p4 = ps = temp = 0.0;
+ *
+ *    for(n = 0; n < N; n++)
+ *    {
+ *        if((temp = data[n]))
+ *        {
+ *            den += temp;
+ *            if(!p2)
+ *                p2 = temp;
+ *            else if(!p3)
+ *                p3 = temp;
+ *            else if(!p4)
+ *                p4 = temp;
+ *        }
+ *    }
+ *
+ *    ps = p2 + p3 + p4;
+ *
+ *    if(den == 0.0 || ps == 0.0)
+ *    {
+ *        *result = 0.0;
+ *        return XTRACT_NO_RESULT;
+ *    }
+ *    else
+ *    {
+ *        *result = ps / den;
+ *        return XTRACT_SUCCESS;
+ *    }
+ *
+ *}
+ *
+ *int xtract_tristimulus_3(const double *data, const int N, const void *argv, double *result)
+ *{
+ *
+ *    int n = N, count = 0;
+ *
+ *    double den, num, temp;
+ *
+ *    den = num = temp = 0.0;
+ *
+ *    for(n = 0; n < N; n++)
+ *    {
+ *        if((temp = data[n]))
+ *        {
+ *            den += temp;
+ *            if(count >= 5)
+ *                num += temp;
+ *            count++;
+ *        }
+ *    }
+ *
+ *    if(den == 0.0 || num == 0.0)
+ *    {
+ *        *result = 0.0;
+ *        return XTRACT_NO_RESULT;
+ *    }
+ *    else
+ *    {
+ *        *result = num / den;
+ *        return XTRACT_SUCCESS;
+ *    }
+ *}
+ */
+
 int xtract_tristimulus_1(const double *data, const int N, const void *argv, double *result)
 {
+    int n = N >> 1, h = 0, i;
+    double den = 0.0, p1 = 0.0, fund = 0.0, temp = 0.0;
+    const double *freqs;
 
-    int n = N;
+    fund = *(double *)argv;
+    freqs = data + n;
 
-    double den, p1, temp;
-
-    den = p1 = temp = 0.0;
-
-    for(n = 0; n < N; n++)
+    for(i = 0; i < n; i++)
     {
-        if((temp = data[n]))
+        if((temp = data[i]))
         {
             den += temp;
-            if(!p1)
-                p1 = temp;
+            h = round(freqs[i] / fund);
+            if(h == 1)
+                p1 += temp;
         }
     }