【问题标题】:Fast Fourier Transform of subset of vibration dataset振动数据集子集的快速傅里叶变换
【发布时间】:2021-11-20 03:47:18
【问题描述】:

我是信号处理的新手。我正在尝试计算和绘制给定数据集的 FFT。该数据集对应于使用加速度计捕获的振动信号。数据集包含 x、y 和 z 方向的幅度以及时间。

我面临的问题是,当我尝试获取数据的子集时,FFT 给出了一条直线,我看不到其中的频率和幅度。以下是我正在使用的代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy.fftpack import fft
from scipy import signal
import tkinter as tk
from tkinter import filedialog
import time

#Prompt user for file
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(filetypes=[("Two Column CSV","*.csv")])
print(file_path)
title = input("Enter Experiment Name: ")

#Load Data (assumes two column array
tic = time.process_time()
x, y, z, t = np.genfromtxt(file_path,delimiter=',', unpack=True)
print(t)
toc = time.process_time()
print("Load Time:",toc-tic)

#Determine variables
N = np.int(np.prod(t.shape))#length of the array
Fs = 1/((t[1]-t[0])/10**9)  #sample rate (Hz)
total_duration = (t[-1] - t[0])/10**9
T = 1/Fs
t_sec = [(t[i+1] - t[0])/10**9 for i in range(0,len(t)-1)]
print('Total Duration: ', total_duration)
print("# Samples:",N)
print('Sampling rate: ',Fs)

tic = time.process_time()
fig_fft, host_fft = plt.subplots()
fig_fft.set_size_inches(16,9)
plt.figure(3)  
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)
yf = fft(x)
plt.plot(xf, 2.0/N * np.abs(yf[0:np.int(N/2)]))
plt.grid()
plt.xlabel('Frequency (Hz)', fontsize=14)
plt.ylabel('Acc (m/$sec^2$)', fontsize=14)
plt.title('FFT (X)- ' + title, fontsize=18)
plt.savefig('FFT (X) {}'.format(title), dpi=300, bbox_inches='tight')
plt.show()

here is the link to main dataset

here is the link to 10sec data extracted from above dataset

请告诉我如何解决这个问题。 谢谢

【问题讨论】:

    标签: python scipy signal-processing fft vibration


    【解决方案1】:

    我经常遇到这个问题。傅里叶变换的第零项包含信号的积分(或总和)。如果您的信号不是以零为中心,则此条目将始终非常大。

    有两种简单的方法可以解决这个问题:将测量数据集中在零附近(但也许您希望将中心信息保留用于其他目的)

    x = x - np.mean(x)
    

    或者,只需将第零分量设置为零:

    yf[0] = 0
    

    第三种方法是不绘制数组的第零项。

    【讨论】:

      【解决方案2】:

      没有问题。图表是正确的。它们都不是一条直线,但事实是您的完整数据几乎是 DC,而您的子集数据更是如此,因此几乎所有的能量都在第一个 bin 中。如果您放大图表的其余部分,您会发现它不是直的。

      跟进

      根据@terri 的建议,这里是您的“x”数据图,其中移除了直流分量(通过x -= x.mean())。请注意,与原始直流分量相比,此处的幅度很小。这就是为什么你在情节中看不到它们的原因。他们都在那里,只是非常小的价值。您的数据实际上是白噪声。只是没有任何强频率成分。

      【讨论】:

      • 感谢您的回复!但是如果我们绘制子集的时间序列,我们可以看到大部分加速度都在 0.8-0.82 之间,但是这里这些加速度被跳过/省略了。请参考我发布的编辑。
      • 没有任何遗漏。也许您对 FFT 的作用感到困惑。在您正在绘制的“x”数据中,直流分量为 0.49,其他幅度为 +/- 0.04。 FFT 的直流分量淹没其他微小的频率分量也就不足为奇了。
      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2012-12-10
      • 2013-03-31
      • 2015-08-19
      • 2020-03-29
      相关资源
      最近更新 更多