傅里叶方法去周期

#傅里叶方法算周期!!!带噪音的图像都能算.


import numpy as np
import matplotlib.pyplot as plt
import numpy as np
 
fs = 100  # frequency: 100  Hz        #======这个是cos函数的周期也就是我们最后要求的东西., cos频率100, 也就是周期1/100. 下面采样频率 1000, 所以一个cos周期包含10个采样点. 所以我们最后计算应该得到10!!!!!!!!!!!!!!!
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.5 * np.pi * fs * t) + np.random.normal(scale = 0.1, 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.subplot(2, 1, 1)
plt.plot(data[:100])  #==========只画出前100个点.


plt.subplot(2, 1, 2)
plt.plot(X)

 
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]  # 把X标准差数组里面大于他自己方差0.8倍的数据索引找出来.
 
length = len(X)
if len(frequency) > 0:
    if frequency[0] == 0:
        period = length // frequency[1]  # length个点中,完成了frequency[1]个周期
        if period >= 0.5 * length:
            print("none")
        print(period)
    else:
        period = length // frequency[0]     # length是总时间, frequcency是频率第一个高点.
        if period >= 0.5 * length: #周期大于长度一半的是不合法的!!!!!!!
            print("none")
        print(period)
else:
    print("none")
plt.savefig('傅里叶算周期4origin.png')

image

代码中frequency得到的就是那些高点. 也就是下面图片中的200多喝1700多.
第一个高点对应的大概是200多. 那就是周期性的频率.也就是采样到200多会重复一次. 所以周期8左右.

posted on 2024-02-24 07:29  张博的博客  阅读(7)  评论(0编辑  收藏  举报

导航