傅里叶(四):傅立叶变换(FFT)求时间序列的周期

  • 傅里叶级数:在时域是一个周期且连续的函数,而在频域是一个非周期离散的函数。
  • 傅里叶变换:我们接下去要讲的傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号

首先要来理解什么是频率 :

        通用解释为 -----频率,是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,常用符号f或ν表示,单位为秒分之一,Hz是频率的基本单位,通常是以1秒完成的动作次数。比如你1秒能吃3个馒头那就记作你吃馒头的频率是3Hz(3赫兹),比如你的眼皮1秒能跳动10次就记作你眼皮跳动10Hz(10赫兹)。

import numpy as np
import matplotlib.pyplot as plt
import numpy as np

fs = 100  # frequency: 100  Hz
Fs = 1000 # sampling frequency: 1000 Hz

dt = 1/Fs # sampling period
N = 2048

T = N * dt # span

t = np.linspace(0, T, N, endpoint = False) # time
data = np.cos(2 * np.pi * fs * t) + np.random.normal(scale = 0.2, size = len(t))

# data = np.random.randint(6, 10, 300)  # 生成随机数
X = np.fft.fft(data) # Discrete Fourier Transform by fft
X = np.abs(X)
plt.plot(data[:100])
plt.show()
plt.plot(X)
plt.show()
print(1)

mean_X = np.mean(X)
distance = (X-mean_X) ** 2
mean_distance = np.mean(distance)
frequency = [i for i in range(len(distance)) if distance[i] > 0.8 * mean_distance]

length = len(X)
if len(frequency) > 2:
    if frequency[0] == 0:
        period = length // frequency[1]  # length个点中,完成了frequency[1]个周期
        if period >= 0.5 * length:
            print("none")
        print(period)
    else:
        period = length // frequency[1]
        if period >= 0.5 * length:
            print("none")
        print(period)
else:
    print("none")

你可能感兴趣的:(预测,算法,python,预测)