Mercurial > hg > libxtract
comparison src/vector.c @ 67:2c2ea9326c30
Fixed bug in xtract_spectrum() FFTW_R2HC now interpreted correctly. Updated ChangeLog and AUTHORS files.
author | Jamie Bullock <jamie@postlude.co.uk> |
---|---|
date | Wed, 14 Mar 2007 17:20:14 +0000 |
parents | af594496da53 |
children | 9de5628b69a8 |
comparison
equal
deleted
inserted
replaced
66:af594496da53 | 67:2c2ea9326c30 |
---|---|
53 plan = fftwf_plan_r2r_1d(N, input, rfft, FFTW_R2HC, FFTW_ESTIMATE); | 53 plan = fftwf_plan_r2r_1d(N, input, rfft, FFTW_R2HC, FFTW_ESTIMATE); |
54 | 54 |
55 fftwf_execute(plan); | 55 fftwf_execute(plan); |
56 | 56 |
57 switch(vector){ | 57 switch(vector){ |
58 case XTRACT_MAGNITUDE_SPECTRUM: | 58 |
59 for(n = 0; n < M; n++){ | 59 /* case XTRACT_MAGNITUDE_SPECTRUM: |
60 result[n] = sqrt(XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / N; | 60 for(n = 1; n < M; n++){ |
61 result[M + n] = n * q; | 61 result[n] = sqrt(XTRACT_SQ(rfft[n]) + |
62 } | 62 XTRACT_SQ(rfft[N - n - 1])) / N; |
63 break; | 63 result[M + n] = n * q; |
64 } | |
65 break; | |
66 */ | |
64 case XTRACT_LOG_MAGNITUDE_SPECTRUM: | 67 case XTRACT_LOG_MAGNITUDE_SPECTRUM: |
65 for(n = 0; n < M; n++){ | 68 for(n = 1; n < M; n++){ |
66 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT) | 69 if ((temp = XTRACT_SQ(rfft[n]) + |
70 XTRACT_SQ(rfft[N - n - 1])) > XTRACT_LOG_LIMIT) | |
67 temp = log(sqrt(temp) / N); | 71 temp = log(sqrt(temp) / N); |
68 else | 72 else |
69 temp = XTRACT_LOG_LIMIT_DB; | 73 temp = XTRACT_LOG_LIMIT_DB; |
70 /*Normalise*/ | 74 /*Normalise*/ |
71 result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET; | 75 result[n] = |
72 result[M + n] = n * q; | 76 (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET; |
73 } | 77 result[M + n] = n * q; |
74 break; | 78 } |
79 break; | |
80 | |
75 case XTRACT_POWER_SPECTRUM: | 81 case XTRACT_POWER_SPECTRUM: |
76 for(n = 0; n < M; n++){ | 82 for(n = 1; n < M; n++){ |
77 result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN; | 83 result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1])) |
78 result[M + n] = n * q; | 84 / NxN; |
79 } | 85 result[M + n] = n * q; |
80 break; | 86 } |
87 break; | |
88 | |
81 case XTRACT_LOG_POWER_SPECTRUM: | 89 case XTRACT_LOG_POWER_SPECTRUM: |
82 for(n = 0; n < M; n++){ | 90 for(n = 1; n < M; n++){ |
83 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT) | 91 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1])) > |
92 XTRACT_LOG_LIMIT) | |
84 temp = log(temp / NxN); | 93 temp = log(temp / NxN); |
85 else | 94 else |
86 temp = XTRACT_LOG_LIMIT_DB; | 95 temp = XTRACT_LOG_LIMIT_DB; |
87 result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET; | 96 result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / |
88 result[M + n] = n * q; | 97 XTRACT_DB_SCALE_OFFSET; |
89 } | 98 result[M + n] = n * q; |
90 break; | 99 } |
100 break; | |
101 | |
91 default: | 102 default: |
92 /* MAGNITUDE_SPECTRUM */ | 103 /* MAGNITUDE_SPECTRUM */ |
93 for(n = 0; n < M; n++){ | 104 for(n = 1; n < M; n++){ |
94 result[n] = sqrt(XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / N; | 105 result[n] = sqrt(XTRACT_SQ(rfft[n]) + |
95 result[M + n] = n * q; | 106 XTRACT_SQ(rfft[N - n - 1])) / N; |
96 } | 107 result[M + n] = n * q; |
97 break; | 108 } |
98 } | 109 break; |
99 | 110 } |
100 /* result[0] = fabs(temp[0]) / N */ | 111 |
112 /* Set the DC component to 0 */ | |
113 result[0] = result[M] = 0.f; | |
114 /* Set the Nyquist */ | |
101 result[N] = q * M; | 115 result[N] = q * M; |
102 | 116 |
103 fftwf_destroy_plan(plan); | 117 fftwf_destroy_plan(plan); |
104 fftwf_free(rfft); | 118 fftwf_free(rfft); |
105 free(input); | 119 free(input); |
180 return XTRACT_SUCCESS; | 194 return XTRACT_SUCCESS; |
181 } | 195 } |
182 | 196 |
183 #else | 197 #else |
184 | 198 |
185 int xtract_magnitude_spectrum(const float *data, const int N, const void *argv, float *result){ | 199 int xtract_spectrum(const float *data, const int N, const void *argv, float *result){ |
186 | 200 |
187 XTRACT_NEEDS_FFTW; | 201 XTRACT_NEEDS_FFTW; |
188 return XTRACT_NO_RESULT; | 202 return XTRACT_NO_RESULT; |
189 | 203 |
190 } | 204 } |