diff options
Diffstat (limited to 'src/scalar.c')
-rw-r--r-- | src/scalar.c | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/src/scalar.c b/src/scalar.c index cfb3e7c..9b6d9f3 100644 --- a/src/scalar.c +++ b/src/scalar.c @@ -130,14 +130,21 @@ int xtract_spectral_mean(const float *data, const int N, const void *argv, float int xtract_spectral_variance(const float *data, const int N, const void *argv, float *result){ - int M, m; + int m; + float A = 0.f; + const float *freqs, *amps; + + m = N >> 1; - m = M = N >> 1; + amps = data; + freqs = data + m; - while(m--) - *result += pow((data[m] * data[M +m]) - *(float *)argv, 2); + while(m--){ + A += amps[m]; + *result += pow((freqs[m] - *(float *)argv) * amps[m], 2); + } - *result = *result / (M - 1); + *result = *result / (A - 1); return SUCCESS; } @@ -151,50 +158,67 @@ int xtract_spectral_standard_deviation(const float *data, const int N, const voi int xtract_spectral_average_deviation(const float *data, const int N, const void *argv, float *result){ - int M, m; + int m; + float A = 0.f; + const float *freqs, *amps; + + m = N >> 1; - m = M = N >> 1; + amps = data; + freqs = data + m; - while(m--) - *result += fabs((data[m] * data[M + m]) - *(float *)argv); + while(m--){ + A += amps[m]; + *result += fabs((amps[m] * freqs[m]) - *(float *)argv); + } - *result /= M; + *result /= A; return SUCCESS; } int xtract_spectral_skewness(const float *data, const int N, const void *argv, float *result){ - int M, m; - float temp; + int m; + float temp, A = 0.f; + const float *freqs, *amps; - m = M = N >> 1; + m = N >> 1; + + amps = data; + freqs = data + m; while(m--){ - temp = ((data[m] * data[M + m]) - + A += amps[m]; + temp = ((amps[m] * freqs[m]) - ((float *)argv)[0]) / ((float *)argv)[1]; *result += pow(temp, 3); } - *result /= M; + *result /= A; return SUCCESS; } int xtract_spectral_kurtosis(const float *data, const int N, const void *argv, float *result){ - int M, m; - float temp; + int m; + float temp, A = 0.f; + const float *freqs, *amps; - m = M = N >> 1; + m = N >> 1; + + amps = data; + freqs = data + m; while(m--){ - temp = ((data[m] * data[M + m]) - + A += amps[m]; + temp = ((amps[m] * freqs[m]) - ((float *)argv)[0]) / ((float *)argv)[1]; *result += pow(temp, 4); } - *result /= M; + *result /= A; *result -= 3.0f; return SUCCESS; |