diff options
author | Jamie Bullock <jamie@postlude.co.uk> | 2007-01-10 13:16:55 +0000 |
---|---|---|
committer | Jamie Bullock <jamie@postlude.co.uk> | 2007-01-10 13:16:55 +0000 |
commit | 66a31d55d10a65c7d293a7cfd9e79992dbfb6439 (patch) | |
tree | de40675745c6d8703da39463b8d986439a9f2446 /src/scalar.c | |
parent | 382cb7f73dde0e2955fd91b36311af2a87d648d0 (diff) | |
download | LibXtract-66a31d55d10a65c7d293a7cfd9e79992dbfb6439.tar.gz LibXtract-66a31d55d10a65c7d293a7cfd9e79992dbfb6439.tar.bz2 LibXtract-66a31d55d10a65c7d293a7cfd9e79992dbfb6439.zip |
Rationalised spectral data format. Added spectral_mean et al
Diffstat (limited to 'src/scalar.c')
-rw-r--r-- | src/scalar.c | 99 |
1 files changed, 88 insertions, 11 deletions
diff --git a/src/scalar.c b/src/scalar.c index 139cd05..cfb3e7c 100644 --- a/src/scalar.c +++ b/src/scalar.c @@ -102,16 +102,15 @@ int xtract_kurtosis(const float *data, const int N, const void *argv, float *re return SUCCESS; } - -int xtract_centroid(const float *data, const int N, const void *argv, float *result){ +int xtract_spectral_centroid(const float *data, const int N, const void *argv, float *result){ int n = (N >> 1); const float *freqs, *amps; float FA = 0.f, A = 0.f; - freqs = data; - amps = data + n; + amps = data; + freqs = data + n; while(n--){ FA += freqs[n] * amps[n]; @@ -123,6 +122,84 @@ int xtract_centroid(const float *data, const int N, const void *argv, float *re return SUCCESS; } +int xtract_spectral_mean(const float *data, const int N, const void *argv, float *result){ + + return xtract_spectral_centroid(data, N, argv, result); + +} + +int xtract_spectral_variance(const float *data, const int N, const void *argv, float *result){ + + int M, m; + + m = M = N >> 1; + + while(m--) + *result += pow((data[m] * data[M +m]) - *(float *)argv, 2); + + *result = *result / (M - 1); + + return SUCCESS; +} + +int xtract_spectral_standard_deviation(const float *data, const int N, const void *argv, float *result){ + + *result = sqrt(*(float *)argv); + + return SUCCESS; +} + +int xtract_spectral_average_deviation(const float *data, const int N, const void *argv, float *result){ + + int M, m; + + m = M = N >> 1; + + while(m--) + *result += fabs((data[m] * data[M + m]) - *(float *)argv); + + *result /= M; + + return SUCCESS; +} + +int xtract_spectral_skewness(const float *data, const int N, const void *argv, float *result){ + + int M, m; + float temp; + + m = M = N >> 1; + + while(m--){ + temp = ((data[m] * data[M + m]) - + ((float *)argv)[0]) / ((float *)argv)[1]; + *result += pow(temp, 3); + } + + *result /= M; + + return SUCCESS; +} + +int xtract_spectral_kurtosis(const float *data, const int N, const void *argv, float *result){ + + int M, m; + float temp; + + m = M = N >> 1; + + while(m--){ + temp = ((data[m] * data[M + m]) - + ((float *)argv)[0]) / ((float *)argv)[1]; + *result += pow(temp, 4); + } + + *result /= M; + *result -= 3.0f; + + return SUCCESS; +} + int xtract_irregularity_k(const float *data, const int N, const void *argv, float *result){ int n, @@ -391,15 +468,15 @@ int xtract_rms_amplitude(const float *data, const int N, const void *argv, float return SUCCESS; } -int xtract_inharmonicity(const float *data, const int N, const void *argv, float *result){ +int xtract_spectral_inharmonicity(const float *data, const int N, const void *argv, float *result){ int n = N >> 1; float num = 0.f, den = 0.f, fund; const float *freqs, *amps; fund = *(float *)argv; - freqs = data; - amps = data + n; + amps = data; + freqs = data + n; while(n--){ num += abs(freqs[n] - n * fund) * SQ(amps[n]); @@ -467,7 +544,7 @@ int xtract_sharpness(const float *data, const int N, const void *argv, float *re } -int xtract_slope(const float *data, const int N, const void *argv, float *result){ +int xtract_spectral_slope(const float *data, const int N, const void *argv, float *result){ const float *freqs, *amps; float f, a, @@ -477,8 +554,8 @@ int xtract_slope(const float *data, const int N, const void *argv, float *result F = A = FA = FSQ = 0.f; n = M = N >> 1; - freqs = data; - amps = data + n; + amps = data; + freqs = data + n; while(n--){ f = freqs[n]; @@ -680,7 +757,7 @@ int xtract_failsafe_f0(const float *data, const int N, const void *argv, float * xtract_magnitude_spectrum(data, N, argv, magnitudes); argf[0] = 10.f; argf[1] = *(float *)argv; - xtract_peaks(magnitudes, N, argf, peaks); + xtract_peak_spectrum(magnitudes, N, argf, peaks); argf[0] = 0.f; xtract_lowest_value(peaks, N >> 1, argf, result); |