Я вручную проанализировал треугольную волну, используя ряд Фурье, а затем используя пакет scipy.fft. Я получаю одинаковые абсолютные значения коэффициентов, но с противоположными знаками.

Вручную:
Я взял интервал [-1,1], вычислил интеграл, чтобы получить a0 = 1, затем a1, a3 и a5. используя результат интеграции:

И все bn равны 0.
Затем я просто построил ряд, где первый член равен a0/2, второй a1×cos(n Pi t/T) и так далее, и построил график этих волн. , сумма которых дает хорошее приближение к исходному сигналу.
Коэффициенты:
a0 = 0,5 а1 = -0,4053 а3 = -0,0450 а5 = -0,0162

[img]https://i.stack .imgur.com/7WPmm.png[/img]
Scipy.fft:
Я определил частоту дискретизации fs=50 и создал пространство для функции с помощью space=np.linspace(-1,1,2*fs).
Затем определили fft1 = fft.fft(triang(space)), где «triang» — это функция, которая генерирует сигнал. Я сразу же масштабировал результаты, разделив на количество выборок (100) и умножив каждый член, кроме 0-го, на 2. Далее были частоты freq1 = fft.fftfreq(space.shape[-1], d=1/ фс). Итоговые коэффициенты (действительные части, относящиеся к an):
a0 = 0,5051 а1 = 0,4091 а3 = 0,0452 а5 = 0,0161 Как видите, абсолютные значения верны, а знаки — нет. Чего мне не хватает?

[img]https://i. stack.imgur.com/LRYIM.png[/img]
И еще один бонусный вопрос, если можно: если делать это таким образом (используя scipy) и отображать каждую волну отдельно, следует ли мне добавлять фазовый угол из np.angle(fft1[n]) в каждый член, например a1×cos(n Pi t/T + theta) + b1×sin(n Pi t/T + theta)? Я бы сказал да, но в этом примере все bn равны 0, как и фазовые углы, поэтому я не смог это проверить.