feat: 15 funciones datascience — estadística, DSP e IO de datos
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>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user