8000 Some minor optimizations to RFFT · JavaScriptIOT/dsp.js@56b1001 · GitHub
[go: up one dir, main page]

Skip to content

Commit 56b1001

Browse files
committed
Some minor optimizations to RFFT
1 parent cc0f3f0 commit 56b1001

File tree

1 file changed

+83
-13
lines changed

1 file changed

+83
-13
lines changed

dsp.js

Lines changed: 83 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,30 @@ DSP.interleave = function(left, right) {
130130
* @returns an Array containing left and right channels
131131
*/
132132
DSP.deinterleave = (function() {
133-
var left, right, mix;
133+
var left, right, mix, deinterleaveChannel = [];
134134

135-
return function(buffer) {
135+
deinterleaveChannel[DSP.MIX] = function(buffer) {
136+
for (var i = 0, len = buffer.length/2; i < len; i++) {
137+
mix[i] = (buffer[2*i] + buffer[2*i+1]) / 2;
138+
}
139+
return mix;
140+
};
141+
142+
deinterleaveChannel[DSP.LEFT] = function(buffer) {
143+
for (var i = 0, len = buffer.length/2; i < len; i++) {
144+
left[i] = buffer[2*i];
145+
}
146+
return left;
147+
};
148+
149+
deinterleaveChannel[DSP.RIGHT] = function(buffer) {
150+
for (var i = 0, len = buffer.length/2; i < len; i++) {
151+
right[i] = buffer[2*i+1];
152+
}
153+
return right;
154+
};
155+
156+
return function(channel, buffer) {
136157
left = left || new Float32Array(buffer.length/2);
137158
right = right || new Float32Array(buffer.length/2);
138159
mix = mix || new Float32Array(buffer.length/2);
@@ -143,14 +164,15 @@ DSP.deinterleave = (function() {
143164
mix = new Float32Array(buffer.length/2);
144165
}
145166

167+
/*
146168
for (var i = 0, len = buffer.length/2; i < len; i++) {
147169
left[i] = buffer[2*i];
148170
right[i] = buffer[2*i+1];
149171
mix[i] = (left[i] + right[i]) / 2;
150-
//mix[i] = (buffer[2*i] + buffer[2*i+1]) /2;
151172
}
152-
153-
return [left, right, mix];
173+
*/
174+
175+
return deinterleaveChannel[channel](buffer);
154176
};
155177
}());
156178

@@ -162,9 +184,7 @@ DSP.deinterleave = (function() {
162184
*
163185
* @returns an Array containing a signal mono sample buffer
164186
*/
165-
DSP.getChannel = function(channel, buffer) {
166-
return DSP.deinterleave(buffer)[channel];
167-
};
187+
DSP.getChannel = DSP.deinterleave;
168188

169189
/**
170190
* Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible
@@ -357,13 +377,15 @@ function FFT(bufferSize, sampleRate) {
357377
bit = bit >> 1;
358378
}
359379

380+
/*
360381
this.sinTable = new Float32Array(bufferSize);
361382
this.cosTable = new Float32Array(bufferSize);
362383
363384
for (i = 0; i < bufferSize; i++) {
364385
this.sinTable[i] = Math.sin(-Math.PI/i);
365386
this.cosTable[i] = Math.cos(-Math.PI/i);
366387
}
388+
*/
367389
}
368390

369391
/**
@@ -377,8 +399,8 @@ function FFT(bufferSize, sampleRate) {
377399
FFT.prototype.forward = function(buffer) {
378400
// Locally scope variables for speed up
379401
var bufferSize = this.bufferSize,
380-
cosTable = this.cosTable,
381-
sinTable = this.sinTable,
402+
//cosTable = this.cosTable,
403+
//sinTable = this.sinTable,
382404
reverseTable = this.reverseTable,
383405
real = this.real,
384406
imag = this.imag,
@@ -405,8 +427,12 @@ FFT.prototype.forward = function(buffer) {
405427
}
406428

407429
while (halfSize < bufferSize) {
408-
phaseShiftStepReal = cosTable[halfSize];
409-
phaseShiftStepImag = sinTable[halfSize];
430+
//phaseShiftStepReal = cosTable[halfSize];
431+
//phaseShiftStepImag = sinTable[halfSize];
432+
433+
phaseShiftStepReal = Math.cos(-Math.PI/halfSize);
434+
phaseShiftStepImag = Math.sin(-Math.PI/halfSize);
435+
410436
currentPhaseShiftReal = 1;
411437
currentPhaseShiftImag = 0;
412438

@@ -540,6 +566,8 @@ function RFFT(bufferSize, sampleRate) {
540566

541567
this.trans = new Float32Array(bufferSize);
542568

569+
this.reverseTable = new Uint32Array(bufferSize);
570+
543571
// don't use a lookup table to do the permute, use this instead
544572
this.reverseBinPermute = function (dest, source) {
545573
var bufferSize = this.bufferSize,
@@ -553,7 +581,7 @@ function RFFT(bufferSize, sampleRate) {
553581
r += halfSize;
554582
dest[i] = source[r];
555583
dest[r] = source[i];
556-
584+
557585
i++;
558586

559587
h = halfSize << 1;
@@ -562,13 +590,48 @@ function RFFT(bufferSize, sampleRate) {
562590
if (r >= i) {
563591
dest[i] = source[r];
564592
dest[r] = source[i];
593+
565594
dest[nm1-i] = source[nm1-r];
566595
dest[nm1-r] = source[nm1-i];
567596
}
568597
i++;
569598
} while (i < halfSize);
570599
dest[nm1] = source[nm1];
571600
};
601+
602+
this.generateReverseTable = function () {
603+
var bufferSize = this.bufferSize,
604+
halfSize = bufferSize >>> 1,
605+
nm1 = bufferSize - 1,
606+
i = 1, r = 0, h;
607+
608+
this.reverseTable[0] = 0;
609+
610+
do {
611+
r += halfSize;
612+
613+
this.reverseTable[i] = r;
614+
this.reverseTable[r] = i;
615+
616+
i++;
617+
618+
h = halfSize << 1;
619+
while (h = h >> 1, !((r ^= h) & h));
620+
621+
if (r >= i) {
622+
this.reverseTable[i] = r;
623+
this.reverseTable[r] = i;
624+
625+
this.reverseTable[nm1-i] = nm1-r;
626+
this.reverseTable[nm1-r] = nm1-i;
627+
}
628+
i++;
629+
} while (i < halfSize);
630+
631+
this.reverseTable[nm1] = nm1;
632+
};
633+
634+
this.generateReverseTable();
572635
}
573636

574637

@@ -602,6 +665,13 @@ RFFT.prototype.forward = function(buffer) {
602665
rval, ival, mag;
603666

604667
this.reverseBinPermute(x, buffer);
668+
/*
669+
var reverseTable = this.reverseTable;
670+
671+
for (var k = 0, len = reverseTable.length; k < len; k++) {
672+
x[k] = buffer[reverseTable[k]];
673+
}
674+
*/
605675

606676
for (var ix = 0, id = 4; ix < n; id *= 4) {
607677
for (var i0 = ix; i0 < n; i0 += id) {

0 commit comments

Comments
 (0)
0