Mercurial > hg > libxtract
changeset 46:4725bee447c2
Added bin frequencies to second half of xtract_magnitude_spectrum()
author | Jamie Bullock <jamie@postlude.co.uk> |
---|---|
date | Wed, 20 Dec 2006 16:47:52 +0000 |
parents | e8f4c56de591 |
children | c20e91e86f08 |
files | examples/puredata/xtract~.c src/scalar.c src/vector.c |
diffstat | 3 files changed, 13 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/examples/puredata/xtract~.c Wed Dec 20 15:34:56 2006 +0000 +++ b/examples/puredata/xtract~.c Wed Dec 20 16:47:52 2006 +0000 @@ -171,7 +171,9 @@ case AVERAGE_DEVIATION: case ROLLOFF: case INHARMONICITY: + case MAGNITUDE_SPECTRUM: case ODD_EVEN_RATIO: + case LOWEST_VALUE: case F0: case FAILSAFE_F0: case TONALITY: @@ -196,7 +198,6 @@ case SPREAD: case ZCR: case LOUDNESS: - case LOWEST_VALUE: case HIGHEST_VALUE: case SUM: case RMS_AMPLITUDE: @@ -209,7 +210,6 @@ case DECAY_TIME: /*not implemented */ case DELTA_FEATURE: /*not implemented */ case AUTOCORRELATION_FFT: - case MAGNITUDE_SPECTRUM: case MFCC: case DCT: case AUTOCORRELATION:
--- a/src/scalar.c Wed Dec 20 15:34:56 2006 +0000 +++ b/src/scalar.c Wed Dec 20 16:47:52 2006 +0000 @@ -456,7 +456,7 @@ int n = N; float temp; - *result = data[N]; + *result = data[--n]; while(n--){ if((temp = data[n]) > *(float *)argv) @@ -470,7 +470,7 @@ int n = N; - *result = data[N]; + *result = data[--n]; while(n--) *result = MAX(*result, data[n]); @@ -633,7 +633,7 @@ magnitudes = (float *)malloc(N * sizeof(float)); peaks = (float *)malloc(N * sizeof(float)); - xtract_magnitude_spectrum(data, N, NULL, magnitudes); + xtract_magnitude_spectrum(data, N, argv, magnitudes); argf[0] = 10.f; argf[1] = *(float *)argv; xtract_peaks(magnitudes, N, argf, peaks);
--- a/src/vector.c Wed Dec 20 15:34:56 2006 +0000 +++ b/src/vector.c Wed Dec 20 16:47:52 2006 +0000 @@ -32,7 +32,7 @@ int xtract_magnitude_spectrum(const float *data, const int N, const void *argv, float *result){ - float *temp, *input; + float *temp, *input, q; size_t bytes; int n , M = N >> 1; fftwf_plan plan; @@ -41,17 +41,22 @@ input = (float *)malloc(bytes = N * sizeof(float)); input = memcpy(input, data, bytes); + q = 0.f; + + q = *(float *)argv; + q = (q ? (q * .5) / M : 0.f); + plan = fftwf_plan_r2r_1d(N, input, temp, 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[N-n] = 0.0f; + result[M + n] = n * q; } result[0] = fabs(temp[0]) / N; - result[M] = fabs(temp[M]) / N; + result[M] = q * .5; fftwf_destroy_plan(plan); fftwf_free(temp);