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