From 66a31d55d10a65c7d293a7cfd9e79992dbfb6439 Mon Sep 17 00:00:00 2001 From: Jamie Bullock Date: Wed, 10 Jan 2007 13:16:55 +0000 Subject: Rationalised spectral data format. Added spectral_mean et al --- src/descriptors.c | 307 ++++++++++++++++++++++++++++++++---------------------- src/libxtract.c | 16 ++- src/scalar.c | 99 ++++++++++++++++-- src/vector.c | 47 ++++----- 4 files changed, 302 insertions(+), 167 deletions(-) (limited to 'src') diff --git a/src/descriptors.c b/src/descriptors.c index 8b00084..abd5d15 100644 --- a/src/descriptors.c +++ b/src/descriptors.c @@ -24,13 +24,13 @@ #define XTRACT void *xtract_make_descriptors(){ - + t_function_descriptor *fd, *d; t_type *type; int f , F; char *name, *p_name, *desc, *p_desc, *author; int *argc, *year; - + f = F = XTRACT_FEATURES; fd = malloc(XTRACT_FEATURES * sizeof(t_function_descriptor)); @@ -43,12 +43,17 @@ void *xtract_make_descriptors(){ type = &d->argv.type; switch(f){ + case MEAN: case VARIANCE: case STANDARD_DEVIATION: case AVERAGE_DEVIATION: + case SPECTRAL_MEAN: + case SPECTRAL_VARIANCE: + case SPECTRAL_STANDARD_DEVIATION: + case SPECTRAL_AVERAGE_DEVIATION: case ROLLOFF: - case INHARMONICITY: + case SPECTRAL_INHARMONICITY: case MAGNITUDE_SPECTRUM: case ODD_EVEN_RATIO: case LOWEST_VALUE: @@ -56,26 +61,28 @@ void *xtract_make_descriptors(){ case FAILSAFE_F0: case TONALITY: *argc = 1; - d->argv.type = FLOAT; + *type = FLOAT; break; case SKEWNESS: case KURTOSIS: - case PEAKS: - case HARMONICS: + case SPECTRAL_SKEWNESS: + case SPECTRAL_KURTOSIS: + case PEAK_SPECTRUM: + case HARMONIC_SPECTRUM: case NOISINESS: case CREST: *argc = 2; - d->argv.type = FLOAT; + *type = FLOAT; break; case MFCC: *argc = 1; - d->argv.type = MEL_FILTER; + *type = MEL_FILTER; break; case BARK_COEFFICIENTS: *argc = BARK_BANDS; - d->argv.type = INT; + *type = INT; break; - case CENTROID: + case SPECTRAL_CENTROID: case IRREGULARITY_K: case IRREGULARITY_J: case TRISTIMULUS_1: @@ -91,7 +98,7 @@ void *xtract_make_descriptors(){ case RMS_AMPLITUDE: case POWER: case SHARPNESS: - case SLOPE: + case SPECTRAL_SLOPE: case HPS: case FLUX: case ATTACK_TIME: @@ -121,67 +128,101 @@ void *xtract_make_descriptors(){ switch(f){ case MEAN: strcpy(name, "mean"); - strcpy(p_name, "Spectral Mean"); + strcpy(p_name, "Mean"); strcpy(desc, "Extract the mean of an input vector"); - strcpy(p_desc, "Extract the mean of a audio spectrum"); + strcpy(p_desc, "Extract the mean of a range of values"); strcpy(author, ""); break; case VARIANCE: strcpy(name, "variance"); strcpy(p_name, "Variance"); strcpy(desc, "Extract the variance of an input vector"); - strcpy(p_desc, "Extract the variance of an audio spectrum"); + strcpy(p_desc, "Extract the variance of a range of values"); strcpy(author, ""); break; case STANDARD_DEVIATION: strcpy(name, "standard_deviation"); strcpy(p_name, "Standard Deviation"); - strcpy(desc, "Extract the standard deviation of an input \ - vector"); - strcpy(p_desc, "Extract the standard deviation of an audio \ - spectrum"); + strcpy(desc, + "Extract the standard deviation of an input vector"); + strcpy(p_desc, + "Extract the standard deviation of a range of values"); strcpy(author, ""); break; case AVERAGE_DEVIATION: strcpy(name, "average_deviation"); strcpy(p_name, "Average Deviation"); - strcpy(desc, "Extract the average deviation of an input vector"); - strcpy(p_desc, "Extract the average deviation of an audio \ - spectrum"); + strcpy(desc, + "Extract the average deviation of an input vector"); + strcpy(p_desc, + "Extract the average deviation of a range of values"); strcpy(author, ""); break; - case ROLLOFF: - strcpy(name, "rolloff"); - strcpy(p_name, "Spectral Rolloff"); - strcpy(desc, "Extract the rolloff point of a spectrum"); - strcpy(p_desc, "Extract the rolloff point of an audio \ - spectrum"); + case SPECTRAL_MEAN: + strcpy(name, "spectral_mean"); + strcpy(p_name, "Spectral Mean"); + strcpy(desc, "Extract the mean of an input spectrum"); + strcpy(p_desc, "Extract the mean of an audio spectrum"); + strcpy(author, ""); + break; + case SPECTRAL_VARIANCE: + strcpy(name, "spectral_variance"); + strcpy(p_name, "Spectral Variance"); + strcpy(desc, "Extract the variance of an input spectrum"); + strcpy(p_desc, "Extract the variance of an audio spectrum"); strcpy(author, ""); break; - case INHARMONICITY: - strcpy(name, "inharmonicity"); + case SPECTRAL_STANDARD_DEVIATION: + strcpy(name, "spectral_standard_deviation"); + strcpy(p_name, "Spectral Standard Deviation"); + strcpy(desc, + "Extract the standard deviation of an input spectrum"); + strcpy(p_desc, + "Extract the standard deviation of an audio spectrum"); + strcpy(author, ""); + break; + case SPECTRAL_AVERAGE_DEVIATION: + strcpy(name, "spectral_average_deviation"); + strcpy(p_name, "Spectral Average Deviation"); + strcpy(desc, + "Extract the average deviation of an input spectrum"); + strcpy(p_desc, + "Extract the average deviation of an audio spectrum"); + strcpy(author, ""); + break; + case ROLLOFF: + strcpy(name, "spectral_rolloff"); + strcpy(p_name, "Spectral Rolloff"); + strcpy(desc, + "Extract the rolloff point of a spectrum"); + strcpy(p_desc, + "Extract the rolloff point of an audio spectrum"); + strcpy(author, "Bee Suan Ong"); + *year = 2005; + break; + case SPECTRAL_INHARMONICITY: + strcpy(name, "spectral_inharmonicity"); strcpy(p_name, "Inharmonicity"); strcpy(desc, "Extract the inharmonicity of a spectrum"); - strcpy(p_desc, "Extract the inharmonicity of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the inharmonicity of an audio spectrum"); break; case MAGNITUDE_SPECTRUM: strcpy(name, "magnitude_spectrum"); strcpy(p_name, "Magnitude Spectrum"); - strcpy(desc, "Extract the magnitude spectrum of an input \ - vector"); - strcpy(p_desc, "Extract the magnitude spectrum of an \ - audio signal"); + strcpy(desc, + "Extract the magnitude spectrum of an input vector"); + strcpy(p_desc, + "Extract the magnitude spectrum of an audio signal"); strcpy(author, ""); break; case ODD_EVEN_RATIO: strcpy(name, "odd_even_ratio"); strcpy(p_name, "Odd/Even Harmonic Ratio"); - strcpy(desc, "Extract the odd-to-even harmonic ratio of a \ - spectrum"); - strcpy(p_desc, "Extract the odd-to-even harmonic ratio of an \ - audio spectrum"); + strcpy(desc, + "Extract the odd-to-even harmonic ratio of a spectrum"); + strcpy(p_desc, + "Extract the odd-to-even harmonic ratio of an audio spectrum"); strcpy(author, ""); break; case LOWEST_VALUE: @@ -195,16 +236,16 @@ void *xtract_make_descriptors(){ strcpy(name, "f0"); strcpy(p_name, "Fundamental Frequency"); strcpy(desc, "Extract the fundamental frequency of a signal"); - strcpy(p_desc, "Extract the fundamental frequency of an audio \ - signal"); + strcpy(p_desc, + "Extract the fundamental frequency of an audio signal"); strcpy(author, ""); break; case FAILSAFE_F0: strcpy(name, "failsafe_f0"); strcpy(p_name, "Fundamental Frequency (failsafe)"); strcpy(desc, "Extract the fundamental frequency of a signal"); - strcpy(p_desc, "Extract the fundamental frequency of an audio \ - signal"); + strcpy(p_desc, + "Extract the fundamental frequency of an audio signal"); strcpy(author, ""); break; case TONALITY: @@ -212,33 +253,34 @@ void *xtract_make_descriptors(){ strcpy(p_name, "Tonality"); strcpy(desc, "Extract the tonality of a spectrum"); strcpy(p_desc, "Extract the tonality an audio spectrum"); - strcpy(author, ""); + strcpy(author, "Tristan Jehan"); + *year = 2005; break; - case SKEWNESS: - strcpy(name, "skewness"); + case SPECTRAL_SKEWNESS: + strcpy(name, "spectral_skewness"); strcpy(p_name, "Spectral Skewness"); - strcpy(desc, "Extract the skewness of an input vector"); + strcpy(desc, "Extract the skewness of an input spectrum"); strcpy(p_desc, "Extract the skewness of an audio spectrum"); strcpy(author, ""); break; - case KURTOSIS: - strcpy(name, "kurtosis"); + case SPECTRAL_KURTOSIS: + strcpy(name, "spectral_kurtosis"); strcpy(p_name, "Spectral Kurtosis"); - strcpy(desc, "Extract the kurtosis of an input vector"); + strcpy(desc, "Extract the kurtosis of an input spectrum"); strcpy(p_desc, "Extract the kurtosis of an audio spectrum"); strcpy(author, ""); break; - case PEAKS: - strcpy(name, "peaks"); - strcpy(p_name, "Spectral Peaks"); + case PEAK_SPECTRUM: + strcpy(name, "peak_spectrum"); + strcpy(p_name, "Peak Spectrum"); strcpy(desc, "Extract the spectral peaks from of a spectrum"); - strcpy(p_desc, "Extract the spectral peaks from an audio \ - spectrum"); + strcpy(p_desc, + "Extract the spectral peaks from an audio spectrum"); strcpy(author, ""); break; - case HARMONICS: - strcpy(name, "harmonics"); - strcpy(p_name, "Spectral Harmonics"); + case HARMONIC_SPECTRUM: + strcpy(p_name, "harmonic_spectrum"); + strcpy(p_name, "Harmonic Spectrum"); strcpy(desc, "Extract the harmonics from a spectrum"); strcpy(p_desc, "Extract the harmonics from an audio spectrum"); strcpy(author, ""); @@ -248,120 +290,132 @@ void *xtract_make_descriptors(){ strcpy(p_name, "Noisiness"); strcpy(desc, "Extract the noisiness of a spectrum"); strcpy(p_desc, "Extract the noisiness of an audio spectrum"); - strcpy(author, ""); + strcpy(author, "Tae Hong Park"); + *year = 2000; break; case CREST: strcpy(name, "crest"); strcpy(p_name, "Spectral Crest Measure"); - strcpy(desc, "Extract the spectral crest measure of a \ - spectrum"); - strcpy(p_desc, "Extract the spectral crest measure of a \ - audio spectrum"); - strcpy(author, ""); + strcpy(desc, + "Extract the spectral crest measure of a spectrum"); + strcpy(p_desc, + "Extract the spectral crest measure of a audio spectrum"); + strcpy(author, "Peeters"); + *year = 2003; break; case MFCC: strcpy(name, "mfcc"); - strcpy(p_name, "Mel Frequency Cepstral Coefficients"); + strcpy(p_name, "Mel-Frequency Cepstral Coefficients"); strcpy(desc, "Extract MFCC from a spectrum"); strcpy(p_desc, "Extract MFCC from an audio spectrum"); - strcpy(author, ""); + strcpy(author, "Rabiner"); break; case BARK_COEFFICIENTS: strcpy(name, "bark_coefficients"); strcpy(p_name, "Bark Coefficients"); strcpy(desc, "Extract bark coefficients from a spectrum"); - strcpy(p_desc, "Extract bark coefficients from an audio \ - spectrum"); + strcpy(p_desc, + "Extract bark coefficients from an audio spectrum"); strcpy(author, ""); break; - case CENTROID: - strcpy(name, "centroid"); + case SPECTRAL_CENTROID: + strcpy(name, "spectral_centroid"); strcpy(p_name, "Spectral Centroid"); strcpy(desc, "Extract the spectral centroid of a spectrum"); - strcpy(p_desc, "Extract the spectral centroid of an audio \ - spectrum"); + strcpy(p_desc, + "Extract the spectral centroid of an audio spectrum"); strcpy(author, ""); break; case IRREGULARITY_K: strcpy(name, "irregularity_k"); strcpy(p_name, "Irregularity I"); strcpy(desc, "Extract the irregularity of a spectrum"); - strcpy(p_desc, "Extract the irregularity of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the irregularity of an audio spectrum"); + strcpy(author, "Krimphoff"); + *year = 1994; break; case IRREGULARITY_J: strcpy(name, "irregularity_j"); strcpy(p_name, "Irregularity II"); strcpy(desc, "Extract the irregularity of a spectrum"); - strcpy(p_desc, "Extract the irregularity of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the irregularity of an audio spectrum"); + strcpy(author, "Jensen"); + *year = 1999; break; case TRISTIMULUS_1: strcpy(name, "tristimulus_1"); strcpy(p_name, "Tristimulus I"); strcpy(desc, "Extract the tristimulus (type I) of a spectrum"); - strcpy(p_desc, "Extract the tristimulus (type I) of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the tristimulus (type I) of an audio spectrum"); + strcpy(author, "Pollard and Jansson"); + *year = 1982; break; case TRISTIMULUS_2: strcpy(name, "tristimulus_2"); strcpy(p_name, "Tristimulus II"); strcpy(desc, "Extract the tristimulus (type II) of a spectrum"); - strcpy(p_desc, "Extract the tristimulus (type II) of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the tristimulus (type II) of an audio spectrum"); + strcpy(author, "Pollard and Jansson"); + *year = 1982; break; case TRISTIMULUS_3: strcpy(name, "tristimulus_3"); strcpy(p_name, "Tristimulus III"); - strcpy(desc, "Extract the tristimulus (type III) of a spectrum"); - strcpy(p_desc, "Extract the tristimulus (type III) of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(desc, + "Extract the tristimulus (type III) of a spectrum"); + strcpy(p_desc, + "Extract the tristimulus (type III) of an audio spectrum"); + strcpy(author, "Pollard and Jansson"); + *year = 1982; break; case SMOOTHNESS: strcpy(name, "smoothness"); strcpy(p_name, "Spectral Smoothness"); strcpy(desc, "Extract the spectral smoothness of a spectrum"); - strcpy(p_desc, "Extract the spectral smoothness of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the spectral smoothness of an audio spectrum"); + strcpy(author, "McAdams"); + *year = 1999; break; case FLATNESS: strcpy(name, "flatness"); strcpy(p_name, "Spectral Flatness"); strcpy(desc, "Extract the spectral flatness of a spectrum"); - strcpy(p_desc, "Extract the spectral flatness of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the spectral flatness of an audio spectrum"); + strcpy(author, "Tristan Jehan"); + *year = 2005; break; case SPREAD: strcpy(name, "spread"); strcpy(p_name, "Spectral Spread"); strcpy(desc, "Extract the spectral spread of a spectrum"); - strcpy(p_desc, "Extract the spectral spread of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the spectral spread of an audio spectrum"); + strcpy(author, "Norman Casagrande"); + *year = 2005; break; case ZCR: strcpy(name, "zcr"); strcpy(p_name, "Zero Crossing Rate"); strcpy(desc, "Extract the zero crossing rate of a vector"); - strcpy(p_desc, "Extract the zero crossing rate of an audio \ - signal"); + strcpy(p_desc, + "Extract the zero crossing rate of an audio signal"); strcpy(author, ""); break; case LOUDNESS: strcpy(name, "loudness"); strcpy(p_name, "Loudness"); - strcpy(desc, "Extract the loudness of a signal from its \ - spectrum"); - strcpy(p_desc, "Extract the loudness of an audio signal from \ - its spectrum"); - strcpy(author, ""); + strcpy(desc, + "Extract the loudness of a signal from its spectrum"); + strcpy(p_desc, + "Extract the loudness of an audio signal from its spectrum"); + strcpy(author, "Moore, Glasberg et al"); + *year = 2005; break; case HIGHEST_VALUE: strcpy(name, "highest_value"); @@ -373,10 +427,10 @@ void *xtract_make_descriptors(){ case SUM: strcpy(name, "sum"); strcpy(p_name, "Sum of Values"); - strcpy(desc, "Extract the sum of the values in an input \ - vector"); - strcpy(p_desc, "Extract the sum of the values in a given \ - range"); + strcpy(desc, + "Extract the sum of the values in an input vector"); + strcpy(p_desc, + "Extract the sum of the values in a given range"); strcpy(author, ""); break; case RMS_AMPLITUDE: @@ -390,41 +444,42 @@ void *xtract_make_descriptors(){ strcpy(name, "power"); strcpy(p_name, "Spectral Power"); strcpy(desc, "Extract the spectral power of a spectrum"); - strcpy(p_desc, "Extract the spectral power of an audio \ - spectrum"); - strcpy(author, ""); + strcpy(p_desc, + "Extract the spectral power of an audio spectrum"); + strcpy(author, "Bee Suan Ong"); + *year = 2005; break; case SHARPNESS: strcpy(name, "sharpness"); strcpy(p_name, "Spectral Sharpness"); strcpy(desc, "Extract the spectral sharpness of a spectrum"); - strcpy(p_desc, "Extract the spectral sharpness of an audio \ - spectrum"); + strcpy(p_desc, + "Extract the spectral sharpness of an audio spectrum"); strcpy(author, ""); break; - case SLOPE: - strcpy(name, "slope"); + case SPECTRAL_SLOPE: + strcpy(name, "spectral_slope"); strcpy(p_name, "Spectral Slope"); strcpy(desc, "Extract the spectral slope of a spectrum"); - strcpy(p_desc, "Extract the spectral slope of an audio \ - spectrum"); + strcpy(p_desc, + "Extract the spectral slope of an audio spectrum"); strcpy(author, ""); break; case HPS: strcpy(name, "hps"); strcpy(p_name, "Harmonic Product Spectrum"); - strcpy(desc, "Extract the harmonic product spectrum of a \ - spectrum"); - strcpy(p_desc, "Extract the harmonic product spectrum of an \ - audio spectrum"); + strcpy(desc, + "Extract the harmonic product spectrum of a spectrum"); + strcpy(p_desc, + "Extract the harmonic product spectrum of an audio spectrum"); strcpy(author, ""); break; case FLUX: strcpy(name, "flux"); strcpy(p_name, "Spectral Flux"); strcpy(desc, "Extract the spectral flux of a spectrum"); - strcpy(p_desc, "Extract the spectral flux of an audio \ - spectrum"); + strcpy(p_desc, + "Extract the spectral flux of an audio spectrum"); strcpy(author, ""); break; case ATTACK_TIME: @@ -466,7 +521,8 @@ void *xtract_make_descriptors(){ strcpy(name, "autocorrelation"); strcpy(p_name, "Autocorrelation"); strcpy(desc, "Extract the autocorrelation of a signal"); - strcpy(p_desc, "Extract the autocorrelation of an audio signal"); + strcpy(p_desc, + "Extract the autocorrelation of an audio signal"); strcpy(author, ""); break; case AMDF: @@ -485,6 +541,7 @@ void *xtract_make_descriptors(){ break; default: strcpy(name, ""); + strcpy(p_name, ""); strcpy(desc, ""); strcpy(p_desc, ""); strcpy(author, ""); diff --git a/src/libxtract.c b/src/libxtract.c index c8865d5..b39f018 100644 --- a/src/libxtract.c +++ b/src/libxtract.c @@ -30,7 +30,13 @@ int(*xtract[])(const float *, const int, const void *, float *) = { xtract_average_deviation, xtract_skewness, xtract_kurtosis, - xtract_centroid, + xtract_spectral_mean, + xtract_spectral_variance, + xtract_spectral_standard_deviation, + xtract_spectral_average_deviation, + xtract_spectral_skewness, + xtract_spectral_kurtosis, + xtract_spectral_centroid, xtract_irregularity_k, xtract_irregularity_j, xtract_tristimulus_1, @@ -46,11 +52,11 @@ int(*xtract[])(const float *, const int, const void *, float *) = { xtract_crest, xtract_noisiness, xtract_rms_amplitude, - xtract_inharmonicity, + xtract_spectral_inharmonicity, xtract_power, xtract_odd_even_ratio, xtract_sharpness, - xtract_slope, + xtract_spectral_slope, xtract_lowest_value, xtract_highest_value, xtract_sum, @@ -67,12 +73,12 @@ int(*xtract[])(const float *, const int, const void *, float *) = { xtract_amdf, xtract_asdf, xtract_bark_coefficients, - xtract_peaks, + xtract_peak_spectrum, xtract_magnitude_spectrum, xtract_autocorrelation_fft, xtract_mfcc, xtract_dct, - xtract_harmonics + xtract_harmonic_spectrum }; 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); diff --git a/src/vector.c b/src/vector.c index 7968e74..c19046e 100644 --- a/src/vector.c +++ b/src/vector.c @@ -32,7 +32,7 @@ int xtract_magnitude_spectrum(const float *data, const int N, const void *argv, float *result){ - float *temp, *input, q, sr; + float *temp, *input, q; size_t bytes; int n , M = N >> 1; fftwf_plan plan; @@ -41,25 +41,21 @@ int xtract_magnitude_spectrum(const float *data, const int N, const void *argv, input = (float *)malloc(bytes = N * sizeof(float)); input = memcpy(input, data, bytes); - q = sr = 0.f; + q = *(float *)argv; - sr = *(float *)argv; - - CHECK_SR; - - q = (sr * .5) / M; + CHECK_q; plan = fftwf_plan_r2r_1d(N, input, temp, FFTW_R2HC, FFTW_ESTIMATE); fftwf_execute(plan); for(n = 1; n < M; n++){ - result[M + n] = sqrt(SQ(temp[n]) + SQ(temp[N - n])) / N; - result[n] = n * q; + result[n] = sqrt(SQ(temp[n]) + SQ(temp[N - n])) / N; + result[M + n] = n * q; } - result[M] = fabs(temp[0]) / N; - result[0] = q * .5; + result[0] = fabs(temp[0]) / N; + result[M] = q * .5; fftwf_destroy_plan(plan); fftwf_free(temp); @@ -239,19 +235,17 @@ int xtract_bark_coefficients(const float *data, const int N, const void *argv, f return SUCCESS; } -int xtract_peaks(const float *data, const int N, const void *argv, float *result){ +int xtract_peak_spectrum(const float *data, const int N, const void *argv, float *result){ - float thresh, max, y, y2, - y3, p, width, sr, - *input = NULL; + float thresh, max, y, y2, y3, p, q, *input = NULL; size_t bytes; int n = N, M, rv = SUCCESS; - thresh = max = y = y2 = y3 = p = width = sr = 0.f; + thresh = max = y = y2 = y3 = p = q = 0.f; if(argv != NULL){ thresh = ((float *)argv)[0]; - sr = ((float *)argv)[1]; + q = ((float *)argv)[1]; } else rv = BAD_ARGV; @@ -261,7 +255,7 @@ int xtract_peaks(const float *data, const int N, const void *argv, float *result rv = BAD_ARGV; } - CHECK_SR; + CHECK_q; input = (float *)malloc(bytes = N * sizeof(float)); @@ -271,7 +265,6 @@ int xtract_peaks(const float *data, const int N, const void *argv, float *result return MALLOC_FAILED; M = N >> 1; - width = sr / N; while(n--) max = MAX(max, input[n]); @@ -284,8 +277,10 @@ int xtract_peaks(const float *data, const int N, const void *argv, float *result for(n = 1; n < M; n++){ if(input[n] >= thresh){ if(input[n] > input[n - 1] && input[n] > input[n + 1]){ - result[n] = width * (n + (p = .5 * (y = input[n-1] - (y3 = input[n+1])) / (input[n - 1] - 2 * (y2 = input[n]) + input[n + 1]))); - result[M + n] = y2 - .25 * (y - y3) * p; + result[M + n] = q * (n + (p = .5 * (y = input[n-1] - + (y3 = input[n+1])) / (input[n - 1] - 2 * + (y2 = input[n]) + input[n + 1]))); + result[n] = y2 - .25 * (y - y3) * p; } else{ result[n] = 0; @@ -302,15 +297,15 @@ int xtract_peaks(const float *data, const int N, const void *argv, float *result return (rv ? rv : SUCCESS); } -int xtract_harmonics(const float *data, const int N, const void *argv, float *result){ +int xtract_harmonic_spectrum(const float *data, const int N, const void *argv, float *result){ int n = (N >> 1), M = n; const float *freqs, *amps; float f0, thresh, ratio, nearest, distance; - freqs = data; - amps = data + n; + amps = data; + freqs = data + n; f0 = *((float *)argv); thresh = *((float *)argv+1); @@ -324,8 +319,8 @@ int xtract_harmonics(const float *data, const int N, const void *argv, float *re if(distance > thresh) result[n] = result[M + n] = 0.f; else { - result[n] = freqs[n]; - result[M + n] = amps[n]; + result[n] = amps[n]; + result[M + n] = freqs[n]; } } else -- cgit v1.2.3