fft spectrual analysis: 使用scipy.fftpack.fft进行频谱分析


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

发布了63 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_41521681/article/details/103024576
FFT