From 0c2e564c15c583a5274271a0bbacb237b180d500 Mon Sep 17 00:00:00 2001 From: Jamie Bullock Date: Thu, 27 Dec 2007 20:37:15 +0000 Subject: Added l-norm/spectral flux --- src/delta.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++---- src/descriptors.c | 36 +++++++++++++++++++++++++---------- src/libxtract.c | 3 ++- 3 files changed, 81 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/delta.c b/src/delta.c index 6ca3794..79250e2 100644 --- a/src/delta.c +++ b/src/delta.c @@ -20,12 +20,49 @@ /* xtract_delta.c: defines functions that extract a feature as a single value from more than one input vector */ +#include + #include "xtract/libxtract.h" int xtract_flux(const float *data, const int N, const void *argv , float *result){ + return xtract_lnorm(data, N, argv, result); - return XTRACT_FEATURE_NOT_IMPLEMENTED; +} + +int xtract_lnorm(const float *data, const int N, const void *argv , float *result){ + + int feature, + n, + type; + + float order, + temp = 0.f; + + order = *(float *)argv; + type = (int)*(float *)argv+1; + + order = order > 0 ? order : 1.f; + + switch(type){ + + case XTRACT_POSITIVE_SLOPE: + for(n = 0; n < N; n++){ + temp = powf(data[n], order); + if(data[n] > 0) + *result += temp; + } + break; + default: + for(n = 0; n < N; n++) + *result += powf(data[n], order); + break; + + } + + *result = powf(*result, 1.f / order); + + return XTRACT_SUCCESS; } @@ -41,9 +78,21 @@ int xtract_decay_time(const float *data, const int N, const void *argv, float *r } -int xtract_delta_feature(const float *data, const int N, const void *argv, float *result){ +int xtract_difference_vector(const float *data, const int N, const void *argv, float *result){ - return XTRACT_FEATURE_NOT_IMPLEMENTED; + float *frame1, + *frame2; -} + int n; + n = N >> 1; + + frame1 = data; + frame2 = data + n; + + while(n--) + result[n] = frame1[n] - frame2[n]; + + return XTRACT_SUCCESS; + +} diff --git a/src/descriptors.c b/src/descriptors.c index 4584899..4297539 100644 --- a/src/descriptors.c +++ b/src/descriptors.c @@ -197,6 +197,8 @@ void *xtract_make_descriptors(){ /* argc = 2 */; case XTRACT_ROLLOFF: case XTRACT_PEAK_SPECTRUM: + case XTRACT_FLUX: + case XTRACT_LNORM: *argv_donor = XTRACT_ANY; *(argv_donor + 1) = XTRACT_ANY; break; @@ -301,6 +303,8 @@ void *xtract_make_descriptors(){ case XTRACT_ASDF: case XTRACT_ZCR: case XTRACT_RMS_AMPLITUDE: + case XTRACT_FLUX: + case XTRACT_LNORM: *data_format = XTRACT_AUDIO_SAMPLES; break; case XTRACT_TONALITY: @@ -316,10 +320,9 @@ void *xtract_make_descriptors(){ case XTRACT_SHARPNESS: *data_format = XTRACT_BARK_COEFFS; break; - case XTRACT_FLUX: case XTRACT_ATTACK_TIME: case XTRACT_DECAY_TIME: - case XTRACT_DELTA_FEATURE: + case XTRACT_DIFFERENCE_VECTOR: default: *data_format = XTRACT_NO_DATA; break; @@ -350,8 +353,9 @@ void *xtract_make_descriptors(){ case XTRACT_IRREGULARITY_J: case XTRACT_ATTACK_TIME: case XTRACT_DECAY_TIME: - case XTRACT_DELTA_FEATURE: + case XTRACT_DIFFERENCE_VECTOR: case XTRACT_FLUX: + case XTRACT_LNORM: case XTRACT_F0: case XTRACT_FAILSAFE_F0: case XTRACT_MFCC: @@ -798,6 +802,13 @@ void *xtract_make_descriptors(){ "Extract the spectral flux of an audio spectrum"); strcpy(author, ""); break; + case XTRACT_LNORM: + strcpy(name, "L-norm"); + strcpy(p_name, "L-norm"); + strcpy(desc, "Extract the L-norm of a vector"); + strcpy(p_desc, "Extract the L-norm of a vector"); + strcpy(author, ""); + break; case XTRACT_ATTACK_TIME: strcpy(name, "attack_time"); strcpy(p_name, "Attack Time"); @@ -812,11 +823,11 @@ void *xtract_make_descriptors(){ strcpy(p_desc, "Extract the decay time of an audio signal"); strcpy(author, ""); break; - case XTRACT_DELTA_FEATURE: - strcpy(name, "delta_feature"); - strcpy(p_name, "Delta Feature"); - strcpy(desc, "Extract the time derivative of a feature"); - strcpy(p_desc, "Extract the time derivative of a feature"); + case XTRACT_DIFFERENCE_VECTOR: + strcpy(name, "difference_vector"); + strcpy(p_name, "Difference vector"); + strcpy(desc, "Extract the difference between two vectors"); + strcpy(p_desc, "Extract the difference between two vectors"); strcpy(author, ""); break; case XTRACT_AUTOCORRELATION_FFT: @@ -897,6 +908,8 @@ void *xtract_make_descriptors(){ case XTRACT_NOISINESS: case XTRACT_CREST: case XTRACT_ROLLOFF: + case XTRACT_FLUX: + case XTRACT_LNORM: *argc = 2; *argv_type = XTRACT_FLOAT; break; @@ -936,10 +949,9 @@ void *xtract_make_descriptors(){ case XTRACT_SHARPNESS: case XTRACT_SPECTRAL_SLOPE: case XTRACT_HPS: - case XTRACT_FLUX: case XTRACT_ATTACK_TIME: case XTRACT_DECAY_TIME: - case XTRACT_DELTA_FEATURE: + case XTRACT_DIFFERENCE_VECTOR: case XTRACT_AUTOCORRELATION_FFT: case XTRACT_DCT: case XTRACT_AUTOCORRELATION: @@ -995,6 +1007,8 @@ void *xtract_make_descriptors(){ case XTRACT_HPS: case XTRACT_F0: case XTRACT_FAILSAFE_F0: + case XTRACT_FLUX: + case XTRACT_LNORM: case XTRACT_NONZERO_COUNT: *is_scalar = XTRACT_TRUE; break; @@ -1035,6 +1049,8 @@ void *xtract_make_descriptors(){ case XTRACT_LOWEST_VALUE: case XTRACT_HIGHEST_VALUE: case XTRACT_SUM: + case XTRACT_FLUX: + case XTRACT_LNORM: case XTRACT_NONZERO_COUNT: *result_unit = XTRACT_ANY; *result_min = XTRACT_ANY; diff --git a/src/libxtract.c b/src/libxtract.c index a3ed984..cf0dd1a 100644 --- a/src/libxtract.c +++ b/src/libxtract.c @@ -65,10 +65,11 @@ int(*xtract[])(const float *, const int, const void *, float *) = { xtract_f0, xtract_failsafe_f0, /* xtract_delta.h */ + xtract_lnorm, xtract_flux, xtract_attack_time, xtract_decay_time, - xtract_delta_feature, + xtract_difference_vector, /* xtract_vector.h */ xtract_autocorrelation, xtract_amdf, -- cgit v1.2.3