aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/delta.c11
-rw-r--r--src/init.c4
-rw-r--r--src/libxtract.c6
-rw-r--r--src/scalar.c42
-rw-r--r--src/vector.c46
5 files changed, 91 insertions, 18 deletions
diff --git a/src/delta.c b/src/delta.c
index c947c0a..b6259d6 100644
--- a/src/delta.c
+++ b/src/delta.c
@@ -20,30 +20,29 @@
/* xtract_delta.c: defines functions that extract a feature as a single value from more than one input vector */
-#include "xtract/xtract_delta.h"
-#include "xtract/xtract_macros.h"
+#include "xtract/libxtract.h"
int xtract_flux(float *data, int N, void *argv , float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_attack_time(float *data, int N, void *argv , float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_decay_time(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_delta_feature(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
diff --git a/src/init.c b/src/init.c
index 147528f..81810e9 100644
--- a/src/init.c
+++ b/src/init.c
@@ -112,7 +112,7 @@ int xtract_init_mfcc(int N, float nyquist, int style, float freq_max, float freq
int xtract_init_bark(int N, float nyquist, int *band_limits){
- float bark_freq_max, bark_freq_min, freq_bw_bark, temp, edges[] = {0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20500, 27000}; /* Takes us up to sr = 54kHz (CCRMA: JOS)*/
+ float edges[] = {0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20500, 27000}; /* Takes us up to sr = 54kHz (CCRMA: JOS)*/
int M, bands = BARK_BANDS;
@@ -121,4 +121,6 @@ int xtract_init_bark(int N, float nyquist, int *band_limits){
while(bands--)
band_limits[bands] = edges[bands] / nyquist * M;
/*FIX shohuld use rounding, but couldn't get it to work */
+
+ return SUCCESS;
}
diff --git a/src/libxtract.c b/src/libxtract.c
index 63abe49..a749d96 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -68,7 +68,8 @@ int(*xtract[])(float *, int, void *, float *) = {
xtract_magnitude_spectrum,
xtract_autocorrelation_fft,
xtract_mfcc,
- xtract_dct
+ xtract_dct,
+ xtract_harmonics
};
char *xtract_help_strings[] = {
@@ -114,5 +115,6 @@ char *xtract_help_strings[] = {
"xtract_magnitude_spectrum",
"xtract_autocorrelation_fft",
"xtract_mfcc",
- "xtract_dct"
+ "xtract_dct",
+ "xtract_harmonics"
};
diff --git a/src/scalar.c b/src/scalar.c
index b2bf0b0..cf453f9 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -33,6 +33,8 @@ int xtract_mean(float *data, int N, void *argv, float *result){
*result += *data++;
*result /= N;
+
+ return SUCCESS;
}
int xtract_variance(float *data, int N, void *argv, float *result){
@@ -43,12 +45,15 @@ int xtract_variance(float *data, int N, void *argv, float *result){
*result += *data++ - *(float *)argv;
*result = SQ(*result) / (N - 1);
+
+ return SUCCESS;
}
int xtract_standard_deviation(float *data, int N, void *argv, float *result){
*result = sqrt(*(float *)argv);
+ return SUCCESS;
}
int xtract_average_deviation(float *data, int N, void *argv, float *result){
@@ -60,6 +65,7 @@ int xtract_average_deviation(float *data, int N, void *argv, float *result){
*result /= N;
+ return SUCCESS;
}
int xtract_skewness(float *data, int N, void *argv, float *result){
@@ -71,6 +77,7 @@ int xtract_skewness(float *data, int N, void *argv, float *result){
*result = pow(*result, 3) / N;
+ return SUCCESS;
}
int xtract_kurtosis(float *data, int N, void *argv, float *result){
@@ -82,6 +89,7 @@ int xtract_kurtosis(float *data, int N, void *argv, float *result){
*result = pow(*result, 4) / N - 3;
+ return SUCCESS;
}
@@ -92,7 +100,7 @@ int xtract_centroid(float *data, int N, void *argv, float *result){
float *freqs, *amps, FA = 0.f, A = 0.f;
freqs = data;
- amps = data + (N >> 1);
+ amps = data + n;
while(n--){
FA += freqs[n] * amps[n];
@@ -101,6 +109,7 @@ int xtract_centroid(float *data, int N, void *argv, float *result){
*result = FA / A;
+ return SUCCESS;
}
int xtract_irregularity_k(float *data, int N, void *argv, float *result){
@@ -111,6 +120,7 @@ int xtract_irregularity_k(float *data, int N, void *argv, float *result){
for(n = 1; n < M; n++)
*result += abs(data[n] - (data[n-1] + data[n] + data[n+1]) / 3);
+ return SUCCESS;
}
int xtract_irregularity_j(float *data, int N, void *argv, float *result){
@@ -126,6 +136,7 @@ int xtract_irregularity_j(float *data, int N, void *argv, float *result){
*result = num / den;
+ return SUCCESS;
}
int xtract_tristimulus_1(float *data, int N, void *argv, float *result){
@@ -139,6 +150,7 @@ int xtract_tristimulus_1(float *data, int N, void *argv, float *result){
*result = data[0] / den;
+ return SUCCESS;
}
int xtract_tristimulus_2(float *data, int N, void *argv, float *result){
@@ -152,6 +164,7 @@ int xtract_tristimulus_2(float *data, int N, void *argv, float *result){
*result = (data[1] + data[2] + data[3]) / den;
+ return SUCCESS;
}
int xtract_tristimulus_3(float *data, int N, void *argv, float *result){
@@ -167,6 +180,7 @@ int xtract_tristimulus_3(float *data, int N, void *argv, float *result){
*result = num / den;
+ return SUCCESS;
}
int xtract_smoothness(float *data, int N, void *argv, float *result){
@@ -181,6 +195,8 @@ int xtract_smoothness(float *data, int N, void *argv, float *result){
*result += abs(20 * log(data[n-1]) - (20 * log(data[n-2]) +
20 * log(data[n-1]) + 20 * log(data[n])) / 3);
}
+
+ return SUCCESS;
}
int xtract_spread(float *data, int N, void *argv, float *result){
@@ -197,6 +213,7 @@ int xtract_spread(float *data, int N, void *argv, float *result){
*result = sqrt(num / den);
+ return SUCCESS;
}
int xtract_zcr(float *data, int N, void *argv, float *result){
@@ -208,6 +225,7 @@ int xtract_zcr(float *data, int N, void *argv, float *result){
*result /= N;
+ return SUCCESS;
}
int xtract_rolloff(float *data, int N, void *argv, float *result){
@@ -223,6 +241,7 @@ int xtract_rolloff(float *data, int N, void *argv, float *result){
*result = n;
+ return SUCCESS;
}
int xtract_loudness(float *data, int N, void *argv, float *result){
@@ -233,6 +252,8 @@ int xtract_loudness(float *data, int N, void *argv, float *result){
while(n--)
*result += pow(data[n], 0.23);
+
+ return SUCCESS;
}
@@ -254,6 +275,7 @@ int xtract_flatness(float *data, int N, void *argv, float *result){
*result = 10 * log10(num / den);
+ return SUCCESS;
}
int xtract_tonality(float *data, int N, void *argv, float *result){
@@ -266,17 +288,18 @@ int xtract_tonality(float *data, int N, void *argv, float *result){
*result = MIN(sfmdb, 1);
+ return SUCCESS;
}
int xtract_crest(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_noisiness(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
@@ -288,6 +311,7 @@ int xtract_rms_amplitude(float *data, int N, void *argv, float *result){
*result = sqrt(*result / N);
+ return SUCCESS;
}
int xtract_inharmonicity(float *data, int N, void *argv, float *result){
@@ -306,18 +330,19 @@ int xtract_inharmonicity(float *data, int N, void *argv, float *result){
*result = (2 * num) / (*fund * den);
+ return SUCCESS;
}
int xtract_power(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_odd_even_ratio(float *data, int N, void *argv, float *result){
- int n = N >> 1, j, k;
+ int n = N, j, k;
float num = 0.f, den = 0.f;
@@ -330,17 +355,18 @@ int xtract_odd_even_ratio(float *data, int N, void *argv, float *result){
*result = num / den;
+ return SUCCESS;
}
int xtract_sharpness(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
int xtract_slope(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
+ return FEATURE_NOT_IMPLEMENTED;
}
@@ -356,6 +382,7 @@ int xtract_lowest_match(float *data, int N, void *argv, float *result){
*result = (lowest_match == SR_LIMIT ? 0 : lowest_match);
+ return SUCCESS;
}
int xtract_hps(float *data, int N, void *argv, float *result){
@@ -416,6 +443,7 @@ int xtract_hps(float *data, int N, void *argv, float *result){
free(coeffs3);
free(product);
+ return SUCCESS;
}
diff --git a/src/vector.c b/src/vector.c
index 657a7ef..8a656cb 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -51,6 +51,7 @@ int xtract_magnitude_spectrum(float *data, int N, void *argv, float *result){
fftwf_destroy_plan(plan);
fftwf_free(temp);
+ return SUCCESS;
}
int xtract_autocorrelation_fft(float *data, int N, void *argv, float *result){
@@ -69,13 +70,14 @@ int xtract_autocorrelation_fft(float *data, int N, void *argv, float *result){
fftwf_destroy_plan(plan);
fftwf_free(temp);
+
+ return SUCCESS;
}
int xtract_mfcc(float *data, int N, void *argv, float *result){
xtract_mel_filter *f;
int n, filter;
- fftwf_plan plan;
f = (xtract_mel_filter *)argv;
@@ -91,6 +93,7 @@ int xtract_mfcc(float *data, int N, void *argv, float *result){
xtract_dct(result, f->n_filters, NULL, result);
+ return SUCCESS;
}
int xtract_dct(float *data, int N, void *argv, float *result){
@@ -102,6 +105,8 @@ int xtract_dct(float *data, int N, void *argv, float *result){
fftwf_execute(plan);
fftwf_destroy_plan(plan);
+
+ return SUCCESS;
}
#else
@@ -147,6 +152,8 @@ int xtract_autocorrelation(float *data, int N, void *argv, float *result){
}
result[n] = corr / N;
}
+
+ return SUCCESS;
}
int xtract_amdf(float *data, int N, void *argv, float *result){
@@ -164,6 +171,8 @@ int xtract_amdf(float *data, int N, void *argv, float *result){
}
result[n] = md / N;
}
+
+ return SUCCESS;
}
int xtract_asdf(float *data, int N, void *argv, float *result){
@@ -180,6 +189,8 @@ int xtract_asdf(float *data, int N, void *argv, float *result){
}
result[n] = sd / N;
}
+
+ return SUCCESS;
}
int xtract_bark_coefficients(float *data, int N, void *argv, float *result){
@@ -192,12 +203,14 @@ int xtract_bark_coefficients(float *data, int N, void *argv, float *result){
for(n = limits[band]; n < limits[band + 1]; n++)
result[band] += data[n];
}
+
+ return SUCCESS;
}
int xtract_peaks(float *data, int N, void *argv, float *result){
float thresh, max, y, y2, y3, p, width, sr;
- int n = N, M, return_code;
+ int n = N, M, return_code = SUCCESS;
if(argv != NULL){
thresh = ((float *)argv)[0];
@@ -259,3 +272,32 @@ int xtract_peaks(float *data, int N, void *argv, float *result){
return (return_code ? return_code : SUCCESS);
}
+int xtract_harmonics(float *data, int N, void *argv, float *result){
+
+ int n = (N >> 1), M = n;
+
+ float *freqs, *amps, f0, thresh, ratio, nearest, distance;
+
+ freqs = data;
+ amps = data + n;
+ f0 = *((float *)argv);
+ thresh = *((float *)argv+1);
+
+ ratio = nearest = distance = 0.f;
+
+ while(n--){
+ if(freqs[n]){
+ ratio = freqs[n] / f0;
+ nearest = round(ratio);
+ distance = fabs(nearest - ratio);
+ if(distance > thresh)
+ result[n] = result[M + n] = 0.f;
+ else
+ result[n] = result[M + n] = freqs[n];
+ }
+ else
+ result[n] = result[M + n] = 0.f;
+ }
+ return SUCCESS;
+}
+