@@ -130,9 +130,30 @@ DSP.interleave = function(left, right) {
130
130
* @returns an Array containing left and right channels
131
131
*/
132
132
DSP . deinterleave = ( function ( ) {
133
- var left , right , mix ;
133
+ var left , right , mix , deinterleaveChannel = [ ] ;
134
134
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 ) {
136
157
left = left || new Float32Array ( buffer . length / 2 ) ;
137
158
right = right || new Float32Array ( buffer . length / 2 ) ;
138
159
mix = mix || new Float32Array ( buffer . length / 2 ) ;
@@ -143,14 +164,15 @@ DSP.deinterleave = (function() {
143
164
mix = new Float32Array ( buffer . length / 2 ) ;
144
165
}
145
166
167
+ /*
146
168
for (var i = 0, len = buffer.length/2; i < len; i++) {
147
169
left[i] = buffer[2*i];
148
170
right[i] = buffer[2*i+1];
149
171
mix[i] = (left[i] + right[i]) / 2;
150
- //mix[i] = (buffer[2*i] + buffer[2*i+1]) /2;
151
172
}
152
-
153
- return [ left , right , mix ] ;
173
+ */
174
+
175
+ return deinterleaveChannel [ channel ] ( buffer ) ;
154
176
} ;
155
177
} ( ) ) ;
156
178
@@ -162,9 +184,7 @@ DSP.deinterleave = (function() {
162
184
*
163
185
* @returns an Array containing a signal mono sample buffer
164
186
*/
165
- DSP . getChannel = function ( channel , buffer ) {
166
- return DSP . deinterleave ( buffer ) [ channel ] ;
167
- } ;
187
+ DSP . getChannel = DSP . deinterleave ;
168
188
169
189
/**
170
190
* Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible
@@ -357,13 +377,15 @@ function FFT(bufferSize, sampleRate) {
357
377
bit = bit >> 1 ;
358
378
}
359
379
380
+ /*
360
381
this.sinTable = new Float32Array(bufferSize);
361
382
this.cosTable = new Float32Array(bufferSize);
362
383
363
384
for (i = 0; i < bufferSize; i++) {
364
385
this.sinTable[i] = Math.sin(-Math.PI/i);
365
386
this.cosTable[i] = Math.cos(-Math.PI/i);
366
387
}
388
+ */
367
389
}
368
390
369
391
/**
@@ -377,8 +399,8 @@ function FFT(bufferSize, sampleRate) {
377
399
FFT . prototype . forward = function ( buffer ) {
378
400
// Locally scope variables for speed up
379
401
var bufferSize = this . bufferSize ,
380
- cosTable = this . cosTable ,
381
- sinTable = this . sinTable ,
402
+ // cosTable = this.cosTable,
403
+ // sinTable = this.sinTable,
382
404
reverseTable = this . reverseTable ,
383
405
real = this . real ,
384
406
imag = this . imag ,
@@ -405,8 +427,12 @@ FFT.prototype.forward = function(buffer) {
405
427
}
406
428
407
429
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
+
410
436
currentPhaseShiftReal = 1 ;
411
437
currentPhaseShiftImag = 0 ;
412
438
@@ -540,6 +566,8 @@ function RFFT(bufferSize, sampleRate) {
540
566
541
567
this . trans = new Float32Array ( bufferSize ) ;
542
568
569
+ this . reverseTable = new Uint32Array ( bufferSize ) ;
570
+
543
571
// don't use a lookup table to do the permute, use this instead
544
572
this . reverseBinPermute = function ( dest , source ) {
545
573
var bufferSize = this . bufferSize ,
@@ -553,7 +581,7 @@ function RFFT(bufferSize, sampleRate) {
553
581
r += halfSize ;
554
582
dest [ i ] = source [ r ] ;
555
583
dest [ r ] = source [ i ] ;
556
-
584
+
557
585
i ++ ;
558
586
559
587
h = halfSize << 1 ;
@@ -562,13 +590,48 @@ function RFFT(bufferSize, sampleRate) {
562
590
if ( r >= i ) {
563
591
dest [ i ] = source [ r ] ;
564
592
dest [ r ] = source [ i ] ;
593
+
565
594
dest [ nm1 - i ] = source [ nm1 - r ] ;
566
595
dest [ nm1 - r ] = source [ nm1 - i ] ;
567
596
}
568
597
i ++ ;
569
598
} while ( i < halfSize ) ;
570
599
dest [ nm1 ] = source [ nm1 ] ;
571
600
} ;
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 ( ) ;
572
635
}
573
636
574
637
@@ -602,6 +665,13 @@ RFFT.prototype.forward = function(buffer) {
602
665
rval , ival , mag ;
603
666
604
667
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
+ */
605
675
606
676
for ( var ix = 0 , id = 4 ; ix < n ; id *= 4 ) {
607
677
for ( var i0 = ix ; i0 < n ; i0 += id ) {
0 commit comments