@@ -99,11 +99,6 @@ final class AudioAnalyzer {
9999 */
100100 public var fftN (default , set ): Int ;
101101
102- /**
103- * Whether or not should it also use the 4-point butterfly functions for FFT.
104- */
105- public var allow4PointFFT : Bool = false ;
106-
107102 /**
108103 * The current buffer from sound.
109104 */
@@ -149,7 +144,6 @@ final class AudioAnalyzer {
149144 var __twiddleImags : Array <Float > = [];
150145 var __freqReals : Array <Float > = [];
151146 var __freqImags : Array <Float > = [];
152- var __factors : Array <Int > = [];
153147
154148 // levels
155149 var __frequencies : Array <Float >;
@@ -201,19 +195,6 @@ final class AudioAnalyzer {
201195 __twiddleImags [i ] = Math .sin (a );
202196 }
203197
204- __factors .resize (0 );
205-
206- var n = fftN ;
207- while (n % 4 == 0 ) {
208- __factors .push (2 );
209- n >> = 2 ;
210- }
211-
212- while (n % 2 == 0 ) {
213- __factors .push (1 );
214- n >> = 1 ;
215- }
216-
217198 return fftN ;
218199 }
219200
@@ -255,71 +236,6 @@ final class AudioAnalyzer {
255236 * @return Output of frequencies
256237 */
257238 public function getFrequencies (startPos : Float , ? frequencies : Array <Float >): Array <Float > {
258- // https://github.com/FunkinCrew/grig.audio/commit/8567c4dad34cfeaf2ff23fe12c3796f5db80685e
259- inline function butterfly4PointOptimized (i0 : Int , i1 : Int , i2 : Int , i3 : Int , t1 : Int , t2 : Int , t3 : Int ) {
260- // Load input values
261- var x0r = __freqReals [i0 ];
262- var x0i = __freqImags [i0 ];
263-
264- // Apply twiddle factors to x1, x2, x3
265- // x1 = workingData[i1] * twiddle1
266- var x1r_raw = __freqReals [i1 ];
267- var x1i_raw = __freqImags [i1 ];
268- var tw1r = __twiddleReals [t1 ];
269- var tw1i = __twiddleImags [t1 ];
270- var x1r = x1r_raw * tw1r - x1i_raw * tw1i ;
271- var x1i = x1r_raw * tw1i + x1i_raw * tw1r ;
272-
273- // x2 = workingData[i2] * twiddle2
274- var x2r_raw = __freqReals [i2 ];
275- var x2i_raw = __freqImags [i2 ];
276- var tw2r = __twiddleReals [t2 ];
277- var tw2i = __twiddleImags [t2 ];
278- var x2r = x2r_raw * tw2r - x2i_raw * tw2i ;
279- var x2i = x2r_raw * tw2i + x2i_raw * tw2r ;
280-
281- // x3 = workingData[i3] * twiddle3
282- var x3r_raw = __freqReals [i3 ];
283- var x3i_raw = __freqImags [i3 ];
284- var tw3r = __twiddleReals [t3 ];
285- var tw3i = __twiddleImags [t3 ];
286- var x3r = x3r_raw * tw3r - x3i_raw * tw3i ;
287- var x3i = x3r_raw * tw3i + x3i_raw * tw3r ;
288-
289- // Compute intermediate values for 4-point DFT
290- var t0r = x0r + x2r ; // (x0 + x2).real
291- var t0i = x0i + x2i ; // (x0 + x2).imag
292- var t1r = x0r - x2r ; // (x0 - x2).real
293- var t1i = x0i - x2i ; // (x0 - x2).imag
294- var t2r = x1r + x3r ; // (x1 + x3).real
295- var t2i = x1i + x3i ; // (x1 + x3).imag
296- var t3r = x1r - x3r ; // (x1 - x3).real
297- var t3i = x1i - x3i ; // (x1 - x3).imag
298-
299- // Apply j multiplication: j * (a + jb) = -b + ja
300- var jt3r = - t3i ; // j * t3.real = -t3.imag
301- var jt3i = t3r ; // j * t3.imag = t3.real
302-
303- // Final 4-point DFT butterfly outputs
304- __freqReals [i0 ] = t0r + t2r ; // X[k]
305- __freqImags [i0 ] = t0i + t2i ;
306- __freqReals [i1 ] = t1r - jt3r ; // X[k + N/4]
307- __freqImags [i1 ] = t1i - jt3i ;
308- __freqReals [i2 ] = t0r - t2r ; // X[k + N/2]
309- __freqImags [i2 ] = t0i - t2i ;
310- __freqReals [i3 ] = t1r + jt3r ; // X[k + 3N/4]
311- __freqImags [i3 ] = t1i + jt3i ;
312- }
313-
314- inline function butterfly2PointOptimized (i0 : Int , i1 : Int , t : Int ) {
315- var tempr = __freqReals [i1 ] * __twiddleReals [t ] - __freqImags [i1 ] * __twiddleImags [t ];
316- var tempi = __freqReals [i1 ] * __twiddleImags [t ] + __freqImags [i1 ] * __twiddleReals [t ];
317- __freqReals [i1 ] = __freqReals [i0 ] - tempr ;
318- __freqImags [i1 ] = __freqImags [i0 ] - tempi ;
319- __freqReals [i0 ] + = tempr ;
320- __freqImags [i0 ] + = tempi ;
321- }
322-
323239 __freqSamples = getSamples (startPos , fftN , true , __freqSamples );
324240
325241 if (frequencies == null ) frequencies = [];
@@ -332,46 +248,32 @@ final class AudioAnalyzer {
332248 __freqImags [i ] = 0 ;
333249 }
334250
335- var size = 1 , n = fftN , half , k , temp ;
336- if (allow4PointFFT ) for (factor in __factors ) {
337- half = (size << = factor ) >> factor ;
338- n >> = factor ;
251+ var size = 1 , n = fftN , half = 1 , k , i0 , i1 , t , tr : Float , ti : Float ;
252+ while ((size << = 1 ) < fftN ) {
253+ n >> = 1 ;
339254 i = 0 ;
340255 while (i < fftN ) {
341256 k = 0 ;
342257 while (k < half ) {
343- if (factor == 2 )
344- butterfly4PointOptimized (temp = i + k , temp + = half , temp + = half , temp + = half ,
345- (k * n ) % fftN , (2 * k * n ) % fftN , (3 * k * n ) % fftN );
346- else
347- butterfly2PointOptimized (temp = i + k , temp + = half , (k * n ) % fftN );
258+ i1 = (i0 = i + k ) + half ;
259+ t = (k * n ) % fftN ;
260+
261+ tr = __freqReals [i1 ] * __twiddleReals [t ] - __freqImags [i1 ] * __twiddleImags [t ];
262+ ti = __freqReals [i1 ] * __twiddleImags [t ] + __freqImags [i1 ] * __twiddleReals [t ];
263+ __freqReals [i1 ] = __freqReals [i0 ] - tr ;
264+ __freqImags [i1 ] = __freqImags [i0 ] - ti ;
265+ __freqReals [i0 ] + = tr ;
266+ __freqImags [i0 ] + = ti ;
348267
349268 k ++ ;
350269 }
351270 i + = size ;
352271 }
353- }
354- else {
355- half = 1 ;
356- n = fftN ;
357- while ((size << = 1 ) < fftN ) {
358- n >> = 1 ;
359- i = 0 ;
360- while (i < fftN ) {
361- k = 0 ;
362- while (k < half ) {
363- butterfly2PointOptimized (temp = i + k , temp + = half , (k * n ) % fftN );
364- k ++ ;
365- }
366- i + = size ;
367- }
368- half = size ;
369- }
272+ half = size ;
370273 }
371274
372- var inv = 1.0 / fftN ;
373- frequencies [i = 0 ] = Math .sqrt (__freqReals [0 ] * __freqReals [0 ] + __freqImags [0 ] * __freqImags [0 ]) * inv ;
374- while (++ i < __N2 ) frequencies [i ] = 2 * Math .sqrt (__freqReals [i ] * __freqReals [i ] + __freqImags [i ] * __freqImags [i ]) * inv ;
275+ frequencies [i = 0 ] = Math .sqrt (__freqReals [0 ] * __freqReals [0 ] + __freqImags [0 ] * __freqImags [0 ]) * (tr = 1.0 / fftN );
276+ while (++ i < __N2 ) frequencies [i ] = 2 * Math .sqrt (__freqReals [i ] * __freqReals [i ] + __freqImags [i ] * __freqImags [i ]) * tr ;
375277
376278 return frequencies ;
377279 }
0 commit comments