Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def mFFT(arr, draw=False, name='a[n]', x1=0, x2=-1, y2=-1, norm=-1, draw_less=False, return_pair=False):
- """
- Parameters:
- arr : list
- Массив, для которого считается Фурье
- draw : bool
- Рисовать ли график
- name : str, optional
- Заголовок графика
- x1 : double, optional
- Левая граница по x на графике спектра
- x2 : double, optional
- Правая граница по x на графике спектра
- y2 : double, optional
- Верхняя граница по y на графике спектра
- norm : double
- Число для нормировки, стандартное - длина массива
- draw_less : bool
- Надо ли рисовать график последовательности вдобавок к спектру частот
- return_pair : bool
- Возвращать ли массив периодов (координаты по x)
- Returns:
- Если не выставлен флаг energy, то возвращается массив абсолютных значений амплитуд спектра.
- Если флаг выставлен, то возращается кортеж из четырех элементов - энергия амплитуды 27-дневного сигнала,
- энергия амплитуды полугодового сигнала, их отношение и массив абсолютных значений амплитуд сигнала.
- """
- if x2 == -1:
- x2 = len(arr) // 2
- if norm == -1:
- norm = len(arr)
- A = np.fft.rfft((arr - np.mean(arr)) / norm)
- n = np.arange(len(arr))
- n1 = len(arr) / n[1:]
- if draw:
- plt.rcParams['axes.grid'] = True
- if not draw_less:
- fig, ax = plt.subplots(2, figsize=(6, 4), dpi=150)
- plt.tight_layout()
- plt.subplots_adjust(hspace=0.5)
- ax[0].plot(n, arr, '.-')
- ax[0].set_title(name)
- ax[1].set_title('$A$')
- if y2 > 0:
- ax[1].set_ylim(0, y2)
- ax[1].set_xlim(x1, x2)
- ax[1].plot(n1[0: (len(arr) // 2 + 1)], np.abs(A), '-')
- ax[1].set_xlabel('Период (в днях)')
- else:
- fig, ax = plt.subplots(1, figsize=(4, 2), dpi=150)
- plt.tight_layout()
- plt.subplots_adjust(hspace=0.5)
- ax.set_title('$A$')
- if y2 > 0:
- ax.set_ylim(0, y2)
- ax.set_xlim(x1, x2)
- ax.plot(n1[0: (len(arr) // 2 + 1)], np.abs(A), '-')
- ax.set_xlabel('Период (в днях)')
- plt.show()
- if return_pair:
- return np.abs(A), n1[0: (len(arr) // 2 + 1)]
- return np.abs(A)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement