mirror of
https://github.com/cgzirim/seek-tune.git
synced 2025-12-17 08:54:19 +00:00
40 lines
948 B
Go
40 lines
948 B
Go
package shazam
|
|
|
|
import (
|
|
"math"
|
|
"math/cmplx"
|
|
)
|
|
|
|
// fft performs the Fast Fourier Transform on the input signal.
|
|
func Fft(complexArray []complex128) []complex128 {
|
|
fftResult := make([]complex128, len(complexArray))
|
|
copy(fftResult, complexArray) // Copy input to result buffer
|
|
return recursiveFFT(fftResult)
|
|
}
|
|
|
|
// recursiveFFT performs the recursive FFT algorithm.
|
|
func recursiveFFT(complexArray []complex128) []complex128 {
|
|
N := len(complexArray)
|
|
if N <= 1 {
|
|
return complexArray
|
|
}
|
|
|
|
even := make([]complex128, N/2)
|
|
odd := make([]complex128, N/2)
|
|
for i := 0; i < N/2; i++ {
|
|
even[i] = complexArray[2*i]
|
|
odd[i] = complexArray[2*i+1]
|
|
}
|
|
|
|
even = recursiveFFT(even)
|
|
odd = recursiveFFT(odd)
|
|
|
|
fftResult := make([]complex128, N)
|
|
for k := 0; k < N/2; k++ {
|
|
t := cmplx.Exp(-2i * math.Pi * complex(float64(k), 0) / complex(float64(N), 0))
|
|
fftResult[k] = even[k] + t*odd[k]
|
|
fftResult[k+N/2] = even[k] - t*odd[k]
|
|
}
|
|
|
|
return fftResult
|
|
}
|