fc734029c1
12 funciones puras con implementación real: Standardize, MinMaxScale, Clip, RollingWindow, ZipSlices, GroupBy, Histogram, Pearson, Autocorrelation, FFT (Cooley-Tukey), DetectOutliers, Impute 3 funciones impuras (stubs): LoadCSV, LoadParquet, FetchDataFrame Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
package datascience
|
|
|
|
import (
|
|
"math"
|
|
"math/cmplx"
|
|
)
|
|
|
|
// FFT calcula la Fast Fourier Transform usando el algoritmo Cooley-Tukey radix-2.
|
|
// Si la longitud de data no es potencia de 2, se rellena con ceros (zero-padding).
|
|
func FFT(data []float64) []complex128 {
|
|
n := len(data)
|
|
if n == 0 {
|
|
return []complex128{}
|
|
}
|
|
|
|
// Calcular la siguiente potencia de 2.
|
|
size := nextPow2(n)
|
|
|
|
// Convertir a complex128 con zero-padding.
|
|
x := make([]complex128, size)
|
|
for i := 0; i < n; i++ {
|
|
x[i] = complex(data[i], 0)
|
|
}
|
|
|
|
fftRecursive(x)
|
|
return x
|
|
}
|
|
|
|
// nextPow2 retorna la menor potencia de 2 >= n.
|
|
func nextPow2(n int) int {
|
|
p := 1
|
|
for p < n {
|
|
p <<= 1
|
|
}
|
|
return p
|
|
}
|
|
|
|
// fftRecursive aplica Cooley-Tukey radix-2 DIT in-place.
|
|
func fftRecursive(x []complex128) {
|
|
n := len(x)
|
|
if n <= 1 {
|
|
return
|
|
}
|
|
|
|
// Separar pares e impares.
|
|
even := make([]complex128, n/2)
|
|
odd := make([]complex128, n/2)
|
|
for i := 0; i < n/2; i++ {
|
|
even[i] = x[2*i]
|
|
odd[i] = x[2*i+1]
|
|
}
|
|
|
|
fftRecursive(even)
|
|
fftRecursive(odd)
|
|
|
|
for k := 0; k < n/2; k++ {
|
|
t := cmplx.Rect(1, -2*math.Pi*float64(k)/float64(n)) * odd[k]
|
|
x[k] = even[k] + t
|
|
x[k+n/2] = even[k] - t
|
|
}
|
|
}
|