File size: 1,001 Bytes
89df499
 
79de4b9
89df499
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79de4b9
89df499
79de4b9
 
 
89df499
79de4b9
 
89df499
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np

def fourier_approximate(smooth_curve, n_frequencies=None):
    """
    Function 4: Approximate smooth curve using Fourier series
    
    Returns:
        frequencies: Integer frequencies for epicycles
        magnitude: Circle radii (amplitudes)
        phases: Starting angles
    """
    # Create complex signal
    z = smooth_curve[:,0] + 1j * smooth_curve[:,1]
    N = len(z)
    
    # Compute FFT and frequencies
    coefficients = np.fft.fft(z , norm='forward')
    frequencies = np.fft.fftfreq(N, 1/N)  # integer frequencies
       
    # Keep n largest components
    mask= frequencies!=0
    frequencies = frequencies[mask]
    coefficients = coefficients[mask]
    indices = np.argsort(-np.abs(coefficients))[:n_frequencies]

    
    frequencies = frequencies[indices]
    coefficients = coefficients[indices]
    
    # Get amplitudes and phases
    magnitude = np.abs(coefficients)
    phases = np.angle(coefficients)
    
    return frequencies, magnitude, phases