int i, j;
// where most recent signal started
- j = (sb->fill - sb->buflen + sb->size) % sb->size;
+ j = sb->fill;
// copy starting from there in circular fashion,
// applying window as we go
for (i = 0; i < sb->size; i++) {
- CXBdata(sb->timebuf, i) = Cscl(CXBdata(sb->timebuf, j), sb->window[i]);
+ COMPLEX z = CXBdata(sb->accum, j);
+ sb->oscope[i] = (float) z.re;
+ CXBdata(sb->timebuf, i) = Cscl(z, sb->window[i]);
j = ++j % sb->size;
}
(fftw_complex *) CXBbase(sb->timebuf),
(fftw_complex *) CXBbase(sb->freqbuf));
- if (sb->scale == SPEC_MAG) {
- for (i = 0; i < half; i++)
- sb->output[i + half] = Cmag(CXBdata(sb->freqbuf, i));
- for (; i < sb->size; i++)
- sb->output[i] = Cmag(CXBdata(sb->freqbuf, i));
-
- } else { // SPEC_PWR
- for (i = 0; i < half; i++)
- sb->output[i + half] = 10.0 * log10(Csqrmag(CXBdata(sb->freqbuf, i)) + 1e-60);
- for (; i < sb->size; i++)
- sb->output[i] = 10.0 * log10(Csqrmag(CXBdata(sb->freqbuf, i)) + 1e-60);
- }
+ if (sb->scale == SPEC_MAG)
+
+ for (i = 0; i < sb->size; i++)
+ sb->output[i] =
+ (float) Cmag(CXBdata(sb->freqbuf, (i + half) % sb->size));
+
+ else // SPEC_PWR
+
+ for (i = 0; i < sb->size; i++)
+ sb->output[i] =
+ (float) (10.0 * log10(Csqrmag(CXBdata(sb->freqbuf, (i + half) % sb->size)) + 1e-60));
}
void
sb->freqbuf = newCXB(sb->size, 0, "spectrum freqbuf");
sb->window = newvec_REAL(sb->size, "spectrum window");
sb->output = (float *) safealloc(sb->size, sizeof(float), "spectrum output");
+ sb->oscope = (float *) safealloc(sb->size, sizeof(float), "spectrum oscope");
sb->plan = fftw_create_plan(sb->size, FFTW_FORWARD, sb->planbits);
}
sb->fill = sb->size - sb->buflen;
memset((char *) CXBbase(sb->accum), 0, sb->size * sizeof(REAL));
memset((char *) sb->output, 0, sb->size * sizeof(float));
+ memset((char *) sb->oscope, 0, sb->size * sizeof(float));
}
void
delCXB(sb->freqbuf);
delvec_REAL(sb->window);
safefree((char *) sb->output);
+ safefree((char *) sb->oscope);
fftw_destroy_plan(sb->plan);
}
}