如何在python中获取三维加速度计文件的频谱图?

如何在python中获取三维加速度计文件的频谱图?,python,python-3.x,signal-processing,accelerometer,spectrogram,Python,Python 3.x,Signal Processing,Accelerometer,Spectrogram,这是我的代码,但它不起作用 加载数据集 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

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

加载数据集

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

您发布的数据没有标题,所以我猜最后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_magnity
上使用
np.sqrt
,则绘图将不完全相同。

您发布的数据没有标题,因此我猜测您的最后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_震级
上做
np.sqrt
,那么绘图看起来就不完全一样了。

你的问题是什么?如何在python中获取三维加速度计文件的频谱图?我的代码不起作用。我想你必须先共享几行数据文件,然后才能得到任何人的帮助。还有,为什么你自己做频谱图,为什么不直接使用内置的mpl?顺便说一句,你实际上没有说明什么东西没有按你预期的那样工作……我知道mpl内置函数,但我不知道如何将它用于我的数据集。你的问题是什么?如何用python获取三维加速度计文件的频谱图?我的代码不起作用。我想你必须先共享几行数据文件,然后才能得到任何人的帮助。还有,为什么你自己做频谱图,为什么不直接使用内置的mpl?顺便说一句,你实际上没有说明什么是不工作的,因为你的预期…我知道mpl内置的功能,但我不知道如何使用它与我的datasetthnx很多你的答复它帮助我。。但是我想问一个问题!。。。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\u axes.py”,第7221行Z=10.*np.log10(spec)RuntimeWarning:在log10中遇到的被零除可能会导致被零除的状态,这是您必须弄清楚的原因,但这要么是数据的内容,要么是x/y/z的形状/大小,即x.shape应该像(m,)一样打印。一些提示:a)数据集中的内容是否与文本文件一一对应?b) 您是否有足够的数据(用于fft窗口)进行specgram?c) 如果a&b正常,那么您可以尝试找出导致错误的信号部分,并在绘图之前删除该部分。thnx对于您的回答,它对我很有帮助。。但是我想问一个问题!。。。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\u axes.py”,第7221行Z=10.*np.log10(spec)RuntimeWarning:在log10中遇到被零除的情况很明显,您最终会处于被零除的状态,这是您必须弄清楚的原因,但这要么是数据的内容,要么是x/y/z的形状/大小