aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/descriptors.c94
-rw-r--r--src/libxtract.c2
-rw-r--r--src/scalar.c2
-rw-r--r--src/vector.c64
4 files changed, 143 insertions, 19 deletions
diff --git a/src/descriptors.c b/src/descriptors.c
index abd5d15..e47ccdf 100644
--- a/src/descriptors.c
+++ b/src/descriptors.c
@@ -30,6 +30,8 @@ void *xtract_make_descriptors(){
int f , F;
char *name, *p_name, *desc, *p_desc, *author;
int *argc, *year;
+ t_vector *data_format;
+ /* *result_format; */
f = F = XTRACT_FEATURES;
@@ -54,7 +56,6 @@ void *xtract_make_descriptors(){
case SPECTRAL_AVERAGE_DEVIATION:
case ROLLOFF:
case SPECTRAL_INHARMONICITY:
- case MAGNITUDE_SPECTRUM:
case ODD_EVEN_RATIO:
case LOWEST_VALUE:
case F0:
@@ -67,6 +68,7 @@ void *xtract_make_descriptors(){
case KURTOSIS:
case SPECTRAL_SKEWNESS:
case SPECTRAL_KURTOSIS:
+ case SPECTRUM:
case PEAK_SPECTRUM:
case HARMONIC_SPECTRUM:
case NOISINESS:
@@ -116,6 +118,86 @@ void *xtract_make_descriptors(){
break;
}
+ data_format = &d->data.format;
+
+ switch(f){
+
+ case MEAN:
+ case VARIANCE:
+ case STANDARD_DEVIATION:
+ case AVERAGE_DEVIATION:
+ case SKEWNESS:
+ case KURTOSIS:
+ case LOWEST_VALUE:
+ case HIGHEST_VALUE:
+ case SUM:
+ case ZCR:
+ *data_format = ARBITRARY_SERIES;
+ break;
+ case SPECTRAL_MEAN:
+ case SPECTRAL_VARIANCE:
+ case SPECTRAL_STANDARD_DEVIATION:
+ case SPECTRAL_AVERAGE_DEVIATION:
+ case SPECTRAL_SKEWNESS:
+ case SPECTRAL_KURTOSIS:
+ case SPECTRAL_CENTROID:
+ case SPECTRAL_SLOPE:
+ case PEAK_SPECTRUM:
+ case HARMONIC_SPECTRUM:
+ *data_format = SPECTRAL;
+ break;
+ case ROLLOFF:
+ case NOISINESS:
+ case BARK_COEFFICIENTS:
+ case CREST:
+ case IRREGULARITY_K:
+ case IRREGULARITY_J:
+ case SMOOTHNESS:
+ case FLATNESS:
+ case SPREAD:
+ case RMS_AMPLITUDE:
+ case POWER:
+ case SHARPNESS:
+ case HPS:
+ *data_format = SPECTRAL_MAGNITUDES;
+ break;
+ case SPECTRAL_INHARMONICITY:
+ *data_format = SPECTRAL_PEAKS;
+ break;
+ case ODD_EVEN_RATIO:
+ *data_format = SPECTRAL_HARMONICS_FREQUENCIES;
+ break;
+ case F0:
+ case FAILSAFE_F0:
+ case SPECTRUM:
+ case MFCC:
+ case AUTOCORRELATION:
+ case AUTOCORRELATION_FFT:
+ case DCT:
+ case AMDF:
+ case ASDF:
+ *data_format = AUDIO_SAMPLES;
+ break;
+ case TONALITY:
+ *data_format = NO_DATA;
+ break;
+ case TRISTIMULUS_1:
+ case TRISTIMULUS_2:
+ case TRISTIMULUS_3:
+ *data_format = SPECTRAL_HARMONICS_MAGNITUDES;
+ break;
+ case LOUDNESS:
+ *data_format = BARK_COEFFS;
+ break;
+ case FLUX:
+ case ATTACK_TIME:
+ case DECAY_TIME:
+ case DELTA_FEATURE:
+ default:
+ *data_format = NO_DATA;
+ break;
+ }
+
name = d->algo.name;
p_name = d->algo.p_name;
desc = d->algo.desc;
@@ -207,13 +289,13 @@ void *xtract_make_descriptors(){
strcpy(p_desc,
"Extract the inharmonicity of an audio spectrum");
break;
- case MAGNITUDE_SPECTRUM:
- strcpy(name, "magnitude_spectrum");
- strcpy(p_name, "Magnitude Spectrum");
+ case SPECTRUM:
+ strcpy(name, "spectrum");
+ strcpy(p_name, "Spectrum");
strcpy(desc,
- "Extract the magnitude spectrum of an input vector");
+ "Extract the spectrum of an input vector");
strcpy(p_desc,
- "Extract the magnitude spectrum of an audio signal");
+ "Extract the spectrum of an audio signal");
strcpy(author, "");
break;
case ODD_EVEN_RATIO:
diff --git a/src/libxtract.c b/src/libxtract.c
index b39f018..48fc2ab 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -74,7 +74,7 @@ int(*xtract[])(const float *, const int, const void *, float *) = {
xtract_asdf,
xtract_bark_coefficients,
xtract_peak_spectrum,
- xtract_magnitude_spectrum,
+ xtract_spectrum,
xtract_autocorrelation_fft,
xtract_mfcc,
xtract_dct,
diff --git a/src/scalar.c b/src/scalar.c
index 9b6d9f3..6e7faeb 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -778,7 +778,7 @@ int xtract_failsafe_f0(const float *data, const int N, const void *argv, float *
magnitudes = (float *)malloc(N * sizeof(float));
peaks = (float *)malloc(N * sizeof(float));
- xtract_magnitude_spectrum(data, N, argv, magnitudes);
+ xtract_spectrum(data, N, argv, magnitudes);
argf[0] = 10.f;
argf[1] = *(float *)argv;
xtract_peak_spectrum(magnitudes, N, argf, peaks);
diff --git a/src/vector.c b/src/vector.c
index c19046e..c4135cb 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -30,35 +30,77 @@
#include <fftw3.h>
-int xtract_magnitude_spectrum(const float *data, const int N, const void *argv, float *result){
+int xtract_spectrum(const float *data, const int N, const void *argv, float *result){
- float *temp, *input, q;
+ float *input, *rfft, q, temp;
size_t bytes;
- int n , M = N >> 1;
+ int n , NxN, M, vector;
fftwf_plan plan;
- temp = (float *)fftwf_malloc(N * sizeof(float));
+ M = N >> 1;
+ NxN = SQ(N);
+
+ rfft = (float *)fftwf_malloc(N * sizeof(float));
input = (float *)malloc(bytes = N * sizeof(float));
input = memcpy(input, data, bytes);
q = *(float *)argv;
+ vector = (int)*((float *)argv+1);
CHECK_q;
- plan = fftwf_plan_r2r_1d(N, input, temp, FFTW_R2HC, FFTW_ESTIMATE);
+ plan = fftwf_plan_r2r_1d(N, input, rfft, FFTW_R2HC, FFTW_ESTIMATE);
fftwf_execute(plan);
-
- for(n = 1; n < M; n++){
- result[n] = sqrt(SQ(temp[n]) + SQ(temp[N - n])) / N;
- result[M + n] = n * q;
+
+ switch(vector){
+ case MAGNITUDE_SPECTRUM:
+ for(n = 0; n < M; n++){
+ result[n] = sqrt(SQ(rfft[n]) + SQ(rfft[N - n])) / N;
+ result[M + n] = n * q;
+ }
+ break;
+ case LOG_MAGNITUDE_SPECTRUM:
+ for(n = 0; n < M; n++){
+ if ((temp = SQ(rfft[n]) + SQ(rfft[N - n])) > LOG_LIMIT)
+ temp = log(sqrt(temp) / N);
+ else
+ temp = LOG_LIMIT_DB;
+ /*Normalise*/
+ result[n] = (temp + DB_SCALE_OFFSET) / DB_SCALE_OFFSET;
+ result[M + n] = n * q;
+ }
+ break;
+ case POWER_SPECTRUM:
+ for(n = 0; n < M; n++){
+ result[n] = (SQ(rfft[n]) + SQ(rfft[N - n])) / NxN;
+ result[M + n] = n * q;
+ }
+ break;
+ case LOG_POWER_SPECTRUM:
+ for(n = 0; n < M; n++){
+ if ((temp = SQ(rfft[n]) + SQ(rfft[N - n])) > LOG_LIMIT)
+ temp = log(temp / NxN);
+ else
+ temp = LOG_LIMIT_DB;
+ result[n] = (temp + DB_SCALE_OFFSET) / DB_SCALE_OFFSET;
+ result[M + n] = n * q;
+ }
+ break;
+ default:
+ /* MAGNITUDE_SPECTRUM */
+ for(n = 0; n < M; n++){
+ result[n] = sqrt(SQ(rfft[n]) + SQ(rfft[N - n])) / N;
+ result[M + n] = n * q;
+ }
+ break;
}
- result[0] = fabs(temp[0]) / N;
+ /* result[0] = fabs(temp[0]) / N */
result[M] = q * .5;
fftwf_destroy_plan(plan);
- fftwf_free(temp);
+ fftwf_free(rfft);
free(input);
return SUCCESS;