import os
import sys
sys.path.append("./package/")
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
class FFTAcc(object):
def __init__(self,df_acc, fs=200):
self.fs=fs
self.df_signal = df_acc.copy()
self.N = df_acc.shape[0]
self.df_signal["t"] = self.df_signal.index*1/fs
self.df_signal["f"] = self.df_signal.index/self.df_signal.index[-1]*fs
def get_fft_result(self,col_name,return_result=False):
from scipy.fftpack import fft
df_signal = self.df_signal
df_signal["acc_f"] = fft(df_signal[col_name])
df_signal["acc_f_mod"] = np.abs(df_signal["acc_f"])/self.N*2
df_signal["acc_f_pha"] = np.angle(df_signal["acc_f"])
self.df_fft_result = df_signal.loc[:int(self.N/2),["acc_f_mod","f"]]
if return_result:
return self.df_fft_result
def plot_fft_result(self,ind="", file_name=""):
title = "fft result({}:{})".format(ind,file_name)
fig = plt.figure(title)
plt.title(title, fontsize=20)
plt.plot(self.df_fft_result["f"], self.df_fft_result["acc_f_mod"],label="频谱分布")
plt.legend(fontsize=18)
plt.ylim((0,70))
plt.xlim((0.01,20))
return fig
#%%
fs = 200 #采样率
N = 60*fs #数据长度
ls_f = [3,5,9] #生成数据的频谱
df_signal = pd.DataFrame()
df_signal["t"] = np.arange(0,60,1/fs)
_f = lambda t: 10*np.sin(2*np.pi*ls_f[0]*t) + 5*np.sin(2*np.pi*ls_f[1]*t) + 3*np.sin(2*np.pi*ls_f[2]*t)
df_signal["acc"] = df_signal["t"].apply(lambda x: _f(x))
fft_sig = FFTAcc(df_signal[["acc"]])
fft_sig.get_fft_result(col_name="acc")
fft_sig.plot_fft_result()
reference: https://blog.csdn.net/qq_27825451/article/details/88553441