diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/descriptors.c | 94 | ||||
-rw-r--r-- | src/libxtract.c | 2 | ||||
-rw-r--r-- | src/scalar.c | 2 | ||||
-rw-r--r-- | src/vector.c | 64 |
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; |