commit 7a0f3f45b5a5b7d1257ef5b92b6e62aea5870eed
parent 2ae2b1441abbc5d977b61c82a45c58c8a69be666
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date: Mon, 5 Jul 2010 13:05:19 +1000
Performance tweaks
Diffstat:
1 file changed, 30 insertions(+), 24 deletions(-)
diff --git a/src/spek-pipeline.vala b/src/spek-pipeline.vala
@@ -118,6 +118,7 @@ namespace Spek {
int64 frames = 0;
int64 num_fft = 0;
int64 acc_error = 0;
+ float cf = 2f * (float) Math.PI / nfft;
int size;
Posix.memset (output, 0, sizeof (float) * bands);
@@ -143,10 +144,10 @@ namespace Spek {
acc_error < cx.error_base && frames == cx.frames_per_interval ||
acc_error >= cx.error_base && frames == 1 + cx.frames_per_interval) {
for (int i = 0; i < nfft; i++) {
- double val = input[(pos + i) % nfft];
+ float val = input[(pos + i) % nfft];
// Hamming window.
- val *= 0.53836 - 0.46164 * Math.cos (2.0 * Math.PI * i / nfft);
- fft.input[i] = (float) val;
+ val *= 0.53836f - 0.46164f * Math.cosf (cf * i);
+ fft.input[i] = val;
}
fft.execute ();
num_fft++;
@@ -183,31 +184,36 @@ namespace Spek {
}
private float average_input (uint8 *buffer) {
+ int channels = cx.channels;
float res = 0f;
- if (cx.fp && cx.width == 32) {
- float *p = (float *) buffer;
- for (int i = 0; i < cx.channels; i++) {
- res += p[i];
- }
- } else if (cx.fp && cx.width == 64) {
- double *p = (double *) buffer;
- for (int i = 0; i < cx.channels; i++) {
- res += (float) p[i];
- }
- } else if (!cx.fp && cx.width == 16) {
- int16 *p = (int16 *) buffer;
- for (int i = 0; i < cx.channels; i++) {
- res += p[i] / (float) int16.MAX;
- }
- } else if (!cx.fp && cx.width == 32) {
- int32 *p = (int32 *) buffer;
- for (int i = 0; i < cx.channels; i++) {
- res += p[i] / (float) int32.MAX;
+ if (cx.fp) {
+ if (cx.width == 32) {
+ float *p = (float *) buffer;
+ for (int i = 0; i < channels; i++) {
+ res += p[i];
+ }
+ } else {
+ assert (cx.width == 64);
+ double *p = (double *) buffer;
+ for (int i = 0; i < channels; i++) {
+ res += (float) p[i];
+ }
}
} else {
- assert_not_reached ();
+ if (cx.width == 16) {
+ int16 *p = (int16 *) buffer;
+ for (int i = 0; i < channels; i++) {
+ res += p[i] / (float) int16.MAX;
+ }
+ } else {
+ assert (cx.width == 32);
+ int32 *p = (int32 *) buffer;
+ for (int i = 0; i < channels; i++) {
+ res += p[i] / (float) int32.MAX;
+ }
+ }
}
- return res / cx.channels;
+ return res / channels;
}
}
}