Ошибка петли спектрограммы Scipy - PullRequest
0 голосов
/ 21 мая 2018

Я хочу запустить scipy.signal.spectrogram в цикле с разными nperseg, noverlap и nfft каждый раз.Однако я получил:

Ошибка типа: объект 'numpy.float64' не может быть интерпретирован как целое число

Вот что я написал:

Fs=10e3
data = testData(Fs)
r = []
for i in numpy.linspace(-0.4, 0.4, 9):
    t_step = 0.5+i
    f_step = 0.5-i

    window_length = round(2 * t_step * Fs)
    noverlap = round(t_step * Fs)
    nfft = round(Fs / f_step)

    arr_f, arr_t, fft = scipy.signal.spectrogram(data, Fs,
                                                 nperseg=window_length, 
                                                 noverlap=noverlap,
                                                 nfft=nfft,
                                                 window='hanning')
    r.append((arr_f, arr_t, fft))

где testData копируется из документации спектрограммы , версия Scipy - 1.1.0.

Когда я запускаю один и тот же код с константами, жестко закодированными t_step и f_step (без +/-я) все идет гладко во всем диапазоне.Итак, вот мои вопросы:

  1. Почему это не работает?
  2. Есть ли способ не делать это вручную?

Полный возврат:

File "/Users/desktop/test.py", line 34, in main window='hanning')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/spectral.py", line 691, in spectrogram input_length=x.shape[axis])
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/spectral.py", line 1775, in _triage_segments win = get_window(window, nperseg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/scipy/signal/windows/windows.py", line 2106, in get_window return winfunc(*params)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 786, in hann return general_hamming(M, 0.5, sym)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 1016, in general_hamming return general_cosine(M, [alpha, 1. - alpha], sym)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 116, in general_cosine w = np.zeros(M)
TypeError: 'numpy.float64' object cannot be interpreted as an integer

1 Ответ

0 голосов
/ 21 мая 2018

Ваши вычисления tstep и fstep дают числа с плавающей запятой, но scipy ожидает целые числа.Например, вы можете изменить свой код на

arr_f, arr_t, fft = signal.spectrogram(data, Fs,
                                     nperseg=window_length.astype(int), 
                                     noverlap=noverlap.astype(int),
                                     nfft=nfft.astype(int),
                                     window='hanning')

, и scipy должен работать без проблем..astype(int) просто изменяет тип данных numpy, поэтому вместо числа с плавающей точкой 2000.0 Сципи получает целое число 2000. Более подробную информацию о numpy типах данных вы можете найти в официальной документации.

Конечно, лучше изменить ваши расчеты, чтобы они сразу производили целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...