Spaces:
Running
Running
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
|