【问题标题】:TypeError: 1st argument must be a real sequence 2 signal.spectrogramTypeError:第一个参数必须是真实序列 2 signal.spectrogram
【发布时间】:2020-03-29 21:32:17
【问题描述】:

我正在尝试从电子读数中获取信号并将其分解为频谱图,但我不断收到一个奇怪的错误。代码如下:

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

这是错误:

convert_to_spectrogram(i_data.iloc[1000,:10020].dropna().values)
Traceback (most recent call last):

  File "<ipython-input-140-e5951b2d2d97>", line 1, in <module>
    convert_to_spectrogram(i_data.iloc[1000,:10020].dropna().values)

  File "<ipython-input-137-5d63a96c8889>", line 2, in convert_to_spectrogram
    f, t, Sxx = signal.spectrogram(wf, 130)

  File "//anaconda3/lib/python3.7/site-packages/scipy/signal/spectral.py", line 750, in spectrogram
    mode='psd')

  File "//anaconda3/lib/python3.7/site-packages/scipy/signal/spectral.py", line 1836, in _spectral_helper
    result = _fft_helper(x, win, detrend_func, nperseg, noverlap, nfft, sides)

  File "//anaconda3/lib/python3.7/site-packages/scipy/signal/spectral.py", line 1921, in _fft_helper
    result = func(result, n=nfft)

  File "//anaconda3/lib/python3.7/site-packages/mkl_fft/_numpy_fft.py", line 335, in rfft
    output = mkl_fft.rfft_numpy(x, n=n, axis=axis)

  File "mkl_fft/_pydfti.pyx", line 609, in mkl_fft._pydfti.rfft_numpy

  File "mkl_fft/_pydfti.pyx", line 502, in mkl_fft._pydfti._rc_fft1d_impl

TypeError: 1st argument must be a real sequence 2

我的读数包含 130 个观察值的完整周期,并将其存储为 pandas df 的单个值。我特别使用的 wave 可以在 here 找到。有人知道这个错误是什么意思吗?

(小免责声明,本人对信号处理了解不多,如有幼稚问题请见谅)

【问题讨论】:

  • df 中有多少列?什么dtype
  • 你是如何获取 i_data 的?
  • i_data 只是电线的读数。这些列是双精度的时间序列序列。
  • 那么,它是一个列表,数组,...?
  • 对不起。它是我使用 .values 方法的熊猫数据框的一行,所以它将是一个 numpy.ndarray

标签: pandas numpy scipy signal-processing


【解决方案1】:

Python 3.6.9,scipy 1.3.3

下载您的file 并使用pandas.read_csv 阅读它,我可以生成以下频谱图。

import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import spectrogram
i_data = pd.read_csv('wave.csv')
f, t, Sxx = spectrogram(i_data.values[:, 1], 130)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

【讨论】:

  • 那很奇怪,你的东西也对我有用。但 wave.csv 原本只是类似文件的数据框的随机行。当我从数据框中取一行时,它似乎不起作用。我怀疑我有一个变量类型问题。
  • 如果你打印这一行的形状,你会得到什么?
  • (10019,) 是我得到的
  • 我无法解释/:我要试试 for 循环?或类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2021-11-14
  • 2021-03-20
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多