@@ -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,7 @@ DSP.deinterleave = (function() {
143
164
mix = new Float32Array ( buffer . length / 2 ) ;
144
165
}
145
166
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 ) ;
154
168
} ;
155
169
} ( ) ) ;
156
170
@@ -162,9 +176,7 @@ DSP.deinterleave = (function() {
162
176
*
163
177
* @returns an Array containing a signal mono sample buffer
164
178
*/
165
- DSP . getChannel = function ( channel , buffer ) {
166
- return DSP . deinterleave ( buffer ) [ channel ] ;
167
- } ;
179
+ DSP . getChannel = DSP . deinterleave ;
168
180
169
181
/**
170
182
* Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible
@@ -341,7 +353,7 @@ DFT.prototype.forward = function(buffer) {
341
353
function FFT ( bufferSize , sampleRate ) {
342
354
FourierTransform . call ( this , bufferSize , sampleRate ) ;
343
355
344
- this . reverseTable = new Uint32Array ( bufferSize ) ;
356
+ this . reverseTable = new Uint32Array ( bufferSize ) ;
345
357
346
358
var limit = 1 ;
347
359
var bit = bufferSize >> 1 ;
@@ -385,8 +397,9 @@ FFT.prototype.forward = function(buffer) {
385
397
spectrum = this . spectrum ;
386
398
387
399
var k = Math . floor ( Math . log ( bufferSize ) / Math . LN2 ) ;
400
+
388
401
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 ; }
390
403
391
404
var halfSize = 1 ,
392
405
phaseShiftStepReal ,
@@ -405,8 +418,11 @@ FFT.prototype.forward = function(buffer) {
405
418
}
406
419
407
420
while ( halfSize < bufferSize ) {
421
+ //phaseShiftStepReal = Math.cos(-Math.PI/halfSize);
422
+ //phaseShiftStepImag = Math.sin(-Math.PI/halfSize);
408
423
phaseShiftStepReal = cosTable [ halfSize ] ;
409
424
phaseShiftStepImag = sinTable [ halfSize ] ;
425
+
410
426
currentPhaseShiftReal = 1 ;
411
427
currentPhaseShiftImag = 0 ;
412
428
@@ -540,6 +556,8 @@ function RFFT(bufferSize, sampleRate) {
540
556
541
557
this . trans = new Float32Array ( bufferSize ) ;
542
558
559
+ this . reverseTable = new Uint32Array ( bufferSize ) ;
560
+
543
561
// don't use a lookup table to do the permute, use this instead
544
562
this . reverseBinPermute = function ( dest , source ) {
545
563
var bufferSize = this . bufferSize ,
@@ -553,7 +571,7 @@ function RFFT(bufferSize, sampleRate) {
553
571
r += halfSize ;
554
572
dest [ i ] = source [ r ] ;
555
573
dest [ r ] = source [ i ] ;
556
-
574
+
557
575
i ++ ;
558
576
559
577
h = halfSize << 1 ;
@@ -562,13 +580,48 @@ function RFFT(bufferSize, sampleRate) {
562
580
if ( r >= i ) {
563
581
dest [ i ] = source [ r ] ;
564
582
dest [ r ] = source [ i ] ;
583
+
565
584
dest [ nm1 - i ] = source [ nm1 - r ] ;
566
585
dest [ nm1 - r ] = source [ nm1 - i ] ;
567
586
}
568
587
i ++ ;
569
588
} while ( i < halfSize ) ;
570
589
dest [ nm1 ] = source [ nm1 ] ;
571
590
} ;
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 ( ) ;
572
625
}
573
626
574
627
@@ -603,6 +656,14 @@ RFFT.prototype.forward = function(buffer) {
603
656
604
657
this . reverseBinPermute ( x , buffer ) ;
605
658
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
+
606
667
for ( var ix = 0 , id = 4 ; ix < n ; id *= 4 ) {
607
668
for ( var i0 = ix ; i0 < n ; i0 += id ) {
608
669
//sumdiff(x[i0], x[i0+1]); // {a, b} <--| {a+b, a-b}
0 commit comments