aboutsummaryrefslogtreecommitdiff
path: root/src/vector.c
diff options
context:
space:
mode:
authorJamie Bullock <jamie@postlude.co.uk>2007-03-19 18:58:21 +0000
committerJamie Bullock <jamie@postlude.co.uk>2007-03-19 18:58:21 +0000
commit0f01e44455d7e70fd64e88c8e410cd40fbd2a2d0 (patch)
treef622227001ec2ba156b37060ce1aef92dc51cb63 /src/vector.c
parent091e54c0f13d72307be568daabe630bb3463393c (diff)
downloadLibXtract-0f01e44455d7e70fd64e88c8e410cd40fbd2a2d0.tar.gz
LibXtract-0f01e44455d7e70fd64e88c8e410cd40fbd2a2d0.tar.bz2
LibXtract-0f01e44455d7e70fd64e88c8e410cd40fbd2a2d0.zip
Further updated xtract_spectrum() to hopefully fix fft iteration bug and nyquist/DC inclusion. Added new boolean argument 'withDC' to select whether the DC component is required in the output
Diffstat (limited to 'src/vector.c')
-rw-r--r--src/vector.c89
1 files changed, 61 insertions, 28 deletions
diff --git a/src/vector.c b/src/vector.c
index 5e5057a..404f414 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -35,11 +35,12 @@ int xtract_spectrum(const float *data, const int N, const void *argv, float *res
float *input, *rfft, q, temp;
size_t bytes;
- int n , NxN, M, vector;
+ int n , NxN, M, vector, withDC;
fftwf_plan plan;
M = N >> 1;
NxN = XTRACT_SQ(N);
+ withDC = 0;
rfft = (float *)fftwf_malloc(N * sizeof(float));
input = (float *)malloc(bytes = N * sizeof(float));
@@ -47,6 +48,7 @@ int xtract_spectrum(const float *data, const int N, const void *argv, float *res
q = *(float *)argv;
vector = (int)*((float *)argv+1);
+ withDC = (int)*((float *)argv+2);
XTRACT_CHECK_q;
@@ -56,63 +58,94 @@ int xtract_spectrum(const float *data, const int N, const void *argv, float *res
switch(vector){
-/* 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 = 1; n < M; n++){
if ((temp = XTRACT_SQ(rfft[n]) +
- XTRACT_SQ(rfft[N - n - 1])) > XTRACT_LOG_LIMIT)
+ XTRACT_SQ(rfft[N - n])) > 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[M + n] = n * q;
+ if(withDC) {
+ result[n] =
+ /*Normalise*/
+ (temp + XTRACT_DB_SCALE_OFFSET) /
+ XTRACT_DB_SCALE_OFFSET;
+ result[M + n + 1] = n * q;
+ }
+ else {
+ result[n - 1] =
+ (temp + XTRACT_DB_SCALE_OFFSET) /
+ XTRACT_DB_SCALE_OFFSET;
+ result[M + n - 1] = n * q;
+ }
}
break;
case XTRACT_POWER_SPECTRUM:
for(n = 1; n < M; n++){
- result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1]))
- / NxN;
- result[M + n] = n * q;
+ if(withDC){
+ result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n]))
+ / NxN;
+ result[M + n + 1] = n * q;
+ }
+ else {
+ result[n - 1] =
+ (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN;
+ result[M + n - 1] = n * q;
+ }
}
break;
case XTRACT_LOG_POWER_SPECTRUM:
for(n = 1; n < M; n++){
- if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n - 1])) >
+ if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) >
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[M + n] = n * q;
+ if(withDC){
+ result[n] = (temp + XTRACT_DB_SCALE_OFFSET) /
+ XTRACT_DB_SCALE_OFFSET;
+ result[M + n + 1] = n * q;
+ }
+ else {
+ result[n - 1] = (temp + XTRACT_DB_SCALE_OFFSET) /
+ XTRACT_DB_SCALE_OFFSET;
+ result[M + n - 1] = n * q;
+ }
}
break;
default:
/* 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;
+ if(withDC){
+ result[n] = sqrt(XTRACT_SQ(rfft[n]) +
+ XTRACT_SQ(rfft[N - n])) / N;
+ result[M + n + 1] = n * q;
+ }
+ else {
+ result[n - 1] = sqrt(XTRACT_SQ(rfft[n]) +
+ XTRACT_SQ(rfft[N - n])) / N;
+ result[M + n - 1] = n * q;
+ }
}
break;
}
- /* Set the DC component to 0 */
- result[0] = result[M] = 0.f;
- /* Set the Nyquist */
- result[N] = q * M;
+ if(withDC){
+ /* The DC component */
+ result[0] = XTRACT_SQ(rfft[0]);
+ result[M + 1] = 0.f;
+ /* The Nyquist */
+ result[M] = XTRACT_SQ(rfft[M]);
+ result[N + 1] = q * M;
+ }
+ else {
+ /* The Nyquist */
+ result[M - 1] = XTRACT_SQ(rfft[M]);
+ result[N - 1] = q * M;
+ }
fftwf_destroy_plan(plan);
fftwf_free(rfft);