【问题标题】:How to obtain spectrogram of a 3D accelerometer file in python?如何在 python 中获取 3D 加速度计文件的频谱图?
【发布时间】:2018-05-11 03:56:27
【问题描述】:

这是我的代码,但它不起作用

加载数据集

dataset = np.loadtxt("filename", delimiter=",")
X = dataset[:,0:5]
Y = dataset[:,5]

计算频谱图

N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.001 * X / 2
time = np.arange(dataset) / X
freq = np.linspace(1e3, 2e3, N)
x = amp * np.sin(2*np.pi*freq*time)
x += np.random.normal(scale=np.sqrt(noise_power), size=time.shape)

计算并绘制频谱图。

f, t, Sxx = signal.spectrogram(x, X)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

这是我的数据集的一部分

33,4.9106E+13,-0.6946377,12.680544,0.50395286
33,4.91061E+13,5.012288,11.264028,0.95342433
33,4.91061E+13,4.903325,10.882658,-0.08172209
33,4.91062E+13,-0.61291564,18.496431,3.0237172

【问题讨论】:

  • 你的问题是什么?
  • 如何在python中获取3D加速度计文件的频谱图?
  • 我的代码不起作用。
  • 我认为您必须先共享几行数据文件,然后才能有人提供帮助。还有为什么要自己做谱图,为什么不直接用specgram内置的mpl呢?顺便说一句,您实际上并没有说明什么不符合您的预期......
  • 我知道 mpl 内置函数,但我不知道如何将它与我的数据集一起使用

标签: python python-3.x signal-processing accelerometer spectrogram


【解决方案1】:

您发布的数据没有标题,所以我猜您的最后 3 列是实际加速度,第一列不感兴趣,第二列象征时间。但是,如果这是您以什么频率采样的时间信号?

你还没有真正解释什么不是你所期望的,但是你似乎试图用几个不同的渠道制作一个情节。据我所知,人们只对一个信号制作频谱图。

以下是我将如何处理与您类似的数据,尽管我必须伪造所有数据以使其成为有意义的图。

import numpy as np
import matplotlib.pyplot as plt

# faked data with noise & trends, with assumption of which column is what
fake_size = int(1e4)
time = np.arange(fake_size)/1000 # 1kHz
# your dataset[:,1] ?
base_freq = 2 * np.pi * 100
x = np.sin(4*base_freq*time) + 0.2 * np.random.random(fake_size)
# your dataset[:,2] ?
y = np.sin(2*base_freq*time) + 0.1 * np.random.random(fake_size) - 0.05 + time
# your dataset[:,3] ?
z = np.sin(3*base_freq*time) + np.sin(1.5*base_freq*time)+ 0.1 * np.random.random(fake_size) - 0.05
# your dataset[:,4] ?

xyz_magnitude = x**2 + y**2 + z**2

to_plot = [('x', x), ('y', y), ('z', z), ('xyz', xyz_magnitude)]

for chl, data in to_plot:
    plt.figure(); plt.title(chl)
    plt.specgram(data, Fs=1000)
    plt.xlabel('Time [s]'); plt.ylabel('Frequency [Hz]')

这将很快给出这些频谱中频率的图片,但是如果您真正追求相对幅度和/或相位,则必须进行额外的数学运算和绘图。请注意,您对频率的视觉印象取决于幅度,因此,例如,如果您在 xyz_magnitude 上执行 np.sqrt,则绘图看起来不会完全相同。

【讨论】:

  • 非常感谢您的回复,它对我有帮助.. 但我想问一个问题!... x 和 z 在您的代码中是一个创建的信号?如果是这样,如何在每个轴上添加我的文本文件信号?
  • 产生*信号?
  • 注释#您的数据... 旨在作为分配数据的猜测,即x = dataset[:,2] 等,这是一个猜测,因为您没有为列提供任何标题,所以只有您知道哪些数据在哪一列,我的假设是您的实际数据集在第三列中有x。您粘贴的数据似乎没有以秒为单位的时间保存任何通道,无论如何都可以使用plt.specgram,但是您需要知道实际的采样频率才能最终在 x 和 y 轴上进行正确的缩放在剧情中。
  • 当我编写例如 x = dataset[:,2] 以获取 x 中的第三列时,它给了我以下错误警告(来自警告模块):文件“C:\Users\hadeer. elziaat\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axes_axes.py",第 7221 行 Z = 10。* np.log10(spec) RuntimeWarning: 除以零出现在 log10
  • 显然你最终会处于被零除的状态,这是你必须弄清楚原因的事情,但它要么是数据的内容,要么是 x/y 的形状/大小/z,iexshape 应该像 (m,) 一样打印。一些提示:a)数据集中的内容与文本文件是一对一的吗? b)你有足够的数据来做谱图(对于 fft 窗口)? c) 如果 a & b 没问题,那么您可以尝试找出导致错误的信号部分并在绘图之前将其删除。
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多