aboutsummaryrefslogtreecommitdiff
path: root/src/vector.c
diff options
context:
space:
mode:
authorJamie Bullock <jamie@postlude.co.uk>2007-03-14 17:20:14 +0000
committerJamie Bullock <jamie@postlude.co.uk>2007-03-14 17:20:14 +0000
commit8c03bf4a4ec962659db170f3e5692413ac73e30a (patch)
treef8912aedaee725faf3a3992abffc0b376e453175 /src/vector.c
parentce919d7f2178c4dc71d121cc716480e311e756af (diff)
downloadLibXtract-8c03bf4a4ec962659db170f3e5692413ac73e30a.tar.gz
LibXtract-8c03bf4a4ec962659db170f3e5692413ac73e30a.tar.bz2
LibXtract-8c03bf4a4ec962659db170f3e5692413ac73e30a.zip
Fixed bug in xtract_spectrum() FFTW_R2HC now interpreted correctly. Updated ChangeLog and AUTHORS files.
Diffstat (limited to 'src/vector.c')
-rw-r--r--src/vector.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/vector.c b/src/vector.c
index b6b9308..2f54a3c 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -55,49 +55,63 @@ int xtract_spectrum(const float *data, const int N, const void *argv, float *res
fftwf_execute(plan);
switch(vector){
- case XTRACT_MAGNITUDE_SPECTRUM:
- for(n = 0; n < M; n++){
- result[n] = sqrt(XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / N;
+
+/* case XTRACT_MAGNITUDE_SPECTRUM:
+ for(n = 1; n < M; n++){
+ result[n] = sqrt(XTRACT_SQ(rfft[n]) +
+ XTRACT_SQ(rfft[N - n - 1])) / N;
result[M + n] = n * q;
}
break;
+*/
case XTRACT_LOG_MAGNITUDE_SPECTRUM:
- for(n = 0; n < M; n++){
- if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT)
+ for(n = 1; n < M; n++){
+ if ((temp = XTRACT_SQ(rfft[n]) +
+ XTRACT_SQ(rfft[N - n - 1])) > XTRACT_LOG_LIMIT)
temp = log(sqrt(temp) / N);
else
temp = XTRACT_LOG_LIMIT_DB;
/*Normalise*/
- result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET;
+ result[n] =
+ (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET;
result[M + n] = n * q;
}
break;
+
case XTRACT_POWER_SPECTRUM:
- for(n = 0; n < M; n++){
- result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN;
+ for(n = 1; n < M; n++){
+ result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1]))
+ / NxN;
result[M + n] = n * q;
}
break;
+
case XTRACT_LOG_POWER_SPECTRUM:
- for(n = 0; n < M; n++){
- if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT)
+ for(n = 1; n < M; n++){
+ if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1])) >
+ XTRACT_LOG_LIMIT)
temp = log(temp / NxN);
else
temp = XTRACT_LOG_LIMIT_DB;
- result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / XTRACT_DB_SCALE_OFFSET;
+ result[n] = (temp + XTRACT_DB_SCALE_OFFSET) /
+ XTRACT_DB_SCALE_OFFSET;
result[M + n] = n * q;
}
break;
+
default:
/* MAGNITUDE_SPECTRUM */
- for(n = 0; n < M; n++){
- result[n] = sqrt(XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / N;
+ for(n = 1; n < M; n++){
+ result[n] = sqrt(XTRACT_SQ(rfft[n]) +
+ XTRACT_SQ(rfft[N - n - 1])) / N;
result[M + n] = n * q;
}
break;
}
- /* result[0] = fabs(temp[0]) / N */
+ /* Set the DC component to 0 */
+ result[0] = result[M] = 0.f;
+ /* Set the Nyquist */
result[N] = q * M;
fftwf_destroy_plan(plan);
@@ -182,7 +196,7 @@ int xtract_dct(const float *data, const int N, const void *argv, float *result){
#else
-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){
XTRACT_NEEDS_FFTW;
return XTRACT_NO_RESULT;