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);