8000 Merge branch 'optimize' · JavaScriptIOT/dsp.js@afa264b · GitHub
[go: up one dir, main page]

Skip to content

Commit afa264b

Browse files
committed
Merge branch 'optimize'
2 parents 1465425 + 625eb54 commit afa264b

File tree

3 files changed

+118
-16
lines changed

3 files changed

+118
-16
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ benchmark:
1010
${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/dft.js
1111
${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/fft.js
1212
${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/rfft.js
13+
${JSSHELL} -m -j -p -f dsp.js -f ./bench/bench.js -f ./bench/deinterleave.js
1314

1415
clean:
1516
rm -fr ./release

bench/deinterleave.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var bufferSize = 2048;
2+
var sampleRate = 44100;
3+
4+
var buffer1 = new Float32Array(bufferSize);
5+
var buffer2 = new Float32Array(bufferSize);
6+
var buffer3 = new Float32Array(bufferSize);
7+
var buffer4 = new Float32Array(bufferSize);
8+
9+
for (var i = 0; i < bufferSize; i++) {
10+
buffer1[i] = (i % 2 === 0) ? -Math.random() : Math.random();
11+
}
12+
13+
for (var i = 0; i < bufferSize; i++) {
14+
buffer2[i] = (i % 2 === 0) ? -Math.random() : Math.random();
15+
}
16+
17+
for (var i = 0; i < bufferSize; i++) {
18+
buffer3[i] = (i % 2 === 0) ? -Math.random() : Math.random();
19+
}
20+
21+
for (var i = 0; i < bufferSize; i++) {
22+
buffer4[i] = (i % 2 === 0) ? -Math.random() : Math.random();
23+
}
24+
25+
var channel;
26+
var temp;
27+
28+
var duration = benchmark(function() {
29+
channel = DSP.deinterleave(DSP.MIX, buffer1);
30+
31+
// cycle buffers
32+
temp = buffer1;
33+
buffer1 = buffer2;
34+
buffer2 = buffer3;
35+
buffer3 = buffer4;
36+
buffer4 = temp;
37+
}, 100000);
38+
39+
print("Channel length: " + channel.length);
40+
print("100000 iterations: " + (duration) + " ms (" + ((duration) / 100000) + "ms per iter)\n");

dsp.js

Lines changed: 77 additions & 16 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,7 @@ DSP.deinterleave = (function() {
143164
mix = new Float32Array(buffer.length/2);
144165
}
145166

146-
for (var i = 0, len = buffer.length/2; i < len; i++) {
147-
left[i] = buffer[2*i];
148-
right[i] = buffer[2*i+1];
149-
mix[i] = (left[i] + right[i]) / 2;
150-
//mix[i] = (buffer[2*i] + buffer[2*i+1]) /2;
151-
}
152-
153-
return [left, right, mix];
167+
return deinterleaveChannel[channel](buffer);
154168
};
155169
}());
156170

@@ -162,9 +176,7 @@ DSP.deinterleave = (function() {
162176
*
163177
* @returns an Array containing a signal mono sample buffer
164178
*/
165-
DSP.getChannel = function(channel, buffer) {
166-
return DSP.deinterleave(buffer)[channel];
167-
};
179+
DSP.getChannel = DSP.deinterleave;
168180

169181
/**
170182
* Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible
@@ -341,7 +353,7 @@ DFT.prototype.forward = function(buffer) {
341353
function FFT(bufferSize, sampleRate) {
342354
FourierTransform.call(this, bufferSize, sampleRate);
343355

344-
this.reverseTable = new Uint32Array(bufferSize);
356+
this.reverseTable = new Uint32Array(bufferSize);
345357

346358
var limit = 1;
347359
var bit = bufferSize >> 1;
@@ -385,8 +397,9 @@ FFT.prototype.forward = function(buffer) {
385397
spectrum = this.spectrum;
386398

387399
var k = Math.floor(Math.log(bufferSize) / Math.LN2);
400+
388401
if (Math.pow(2, k) !== bufferSize) { throw "Invalid buffer size, must be a power of 2."; }
389-
if (bufferSize !== buffer.length) { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; }
402+
if (bufferSize !== buffer.length) { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; }
390403

391404
var halfSize = 1,
392405
phaseShiftStepReal,
@@ -405,8 +418,11 @@ FFT.prototype.forward = function(buffer) {
405418
}
406419

407420
while (halfSize < bufferSize) {
421+
//phaseShiftStepReal = Math.cos(-Math.PI/halfSize);
422+
//phaseShiftStepImag = Math.sin(-Math.PI/halfSize);
408423
phaseShiftStepReal = cosTable[halfSize];
409424
phaseShiftStepImag = sinTable[halfSize];
425+
410426
currentPhaseShiftReal = 1;
411427
currentPhaseShiftImag = 0;
412428

@@ -540,6 +556,8 @@ function RFFT(bufferSize, sampleRate) {
540556

541557
this.trans = new Float32Array(bufferSize);
542558

559+
this.reverseTable = new Uint32Array(bufferSize);
560+
543561
// don't use a lookup table to do the permute, use this instead
544562
this.reverseBinPermute = function (dest, source) {
545563
var bufferSize = this.bufferSize,
@@ -553,7 +571,7 @@ function RFFT(bufferSize, sampleRate) {
553571
r += halfSize;
554572
dest[i] = source[r];
555573
dest[r] = source[i];
556-
574+
557575
i++;
558576

559577
h = halfSize << 1;
@@ -562,13 +580,48 @@ function RFFT(bufferSize, sampleRate) {
562580
if (r >= i) {
563581
dest[i] = source[r];
564582
dest[r] = source[i];
583+
565584
dest[nm1-i] = source[nm1-r];
566585
dest[nm1-r] = source[nm1-i];
567586
}
568587
i++;
569588
} while (i < halfSize);
570589
dest[nm1] = source[nm1];
571590
};
591+
592+
this.generateReverseTable = function () {
593+
var bufferSize = this.bufferSize,
594+
halfSize = bufferSize >>> 1,
595+
nm1 = bufferSize - 1,
596+
i = 1, r = 0, h;
597+
598+
this.reverseTable[0] = 0;
599+
600+
do {
601+
r += halfSize;
602+
603+
this.reverseTable[i] = r;
604+
this.reverseTable[r] = i;
605+
606+
i++;
607+
608+
h = halfSize << 1;
609+
while (h = h >> 1, !((r ^= h) & h));
610+
611+
if (r >= i) {
612+
this.reverseTable[i] = r;
613+
this.reverseTable[r] = i;
614+
615+
this.reverseTable[nm1-i] = nm1-r;
616+
this.reverseTable[nm1-r] = nm1-i;
617+
}
618+
i++;
619+
} while (i < halfSize);
620+
621+
this.reverseTable[nm1] = nm1;
622+
};
623+
624+
this.generateReverseTable();
572625
}
573626

574627

@@ -603,6 +656,14 @@ RFFT.prototype.forward = function(buffer) {
603656

604657
this.reverseBinPermute(x, buffer);
605658

659+
/*
660+
var reverseTable = this.reverseTable;
661+
662+
for (var k = 0, len = reverseTable.length; k < len; k++) {
663+
x[k] = buffer[reverseTable[k]];
664+
}
665+
*/
666+
606667
for (var ix = 0, id = 4; ix < n; id *= 4) {
607668
for (var i0 = ix; i0 < n; i0 += id) {
608669
//sumdiff(x[i0], x[i0+1]); // {a, b} <--| {a+b, a-b}

0 commit comments

Comments
 (0)
0