Python - sosfiltfilt:向量 x 必须大于 padlen(实际上它更大)

问题描述 投票:0回答:1

我正在尝试对 Python 3.12.2 中的功率跟踪进行分析。我不断收到ValueError:输入向量 x 的长度必须大于 padlen,即 15。 在以下行中:

proc_pattern = sosfiltfilt(sos, env_pattern)

我检查了 env_pattern 的大小,为 70000。env_pattern 是 numpy.ndarray 类型以及可变 power 或 pattern。我也尝试过改变butter的参数,但只是错误地改变了padlen的长度。我的数据有70000条记录,所以它们的大小应该没有问题。所有 numpy.ndarray 都是二维的。我还尝试转置 env_pattern ,在这种情况下一切正常,但相应的图表中没有值。添加以下所有代码:

import os
import numpy as np
import matplotlib.pyplot as plt
from tools import *
import pandas as pd
from scipy.io import loadmat
from scipy import signal
import dask.dataframe as dd
from scipy.signal import hilbert, sosfiltfilt, butter

path = 'D:/DP data/data/'
tmp_directory = '../tmp'

os.chdir(path)
os.getcwd()

data = scipy.io.loadmat('20240408-0001.mat')
power = data['A'] 

pattern = power[2630000:2700000]
np.save(os.path.join(tmp_directory,'raw_outer_iteration_pattern.npy'),pattern)
hilbert_data = hilbert(pattern)
env_pattern = np.abs(hilbert_data)
sos = signal.butter(4, 0.01, output='sos')  
proc_pattern = sosfiltfilt(sos, env_pattern)
fig, axes = plt.subplots(2,1,figsize=(16,4))
axes[0].plot(env_pattern)
axes[0].set_title('Pattern envelop')
axes[1].plot(proc_pattern)
axes[1].set_title('Filtered pattern envelop')
plt.show()

我需要帮助来解决该错误:

Traceback (most recent call last): File "d:\DP data\spracovanie dat\attack.py", line 69, in <module> proc_pattern = sosfiltfilt(sos, env_pattern) File "C:\Users\jmiku\AppData\Local\Programs\Python\Python312\Lib\site-packages\scipy\signal\_signaltools.py", line 4452, in sosfiltfilt edge, ext = _validate_pad(padtype, padlen, x, axis, File "C:\Users\jmiku\AppData\Local\Programs\Python\Python312\Lib\site-packages\scipy\signal\_signaltools.py", line 4221, in _validate_pad raise ValueError("The length of the input vector x must be greater " ValueError: The length of the input vector x must be greater than padlen, which is 15.

我认为问题与 env_pattern 的形状有关,但到目前为止我无法识别它。

python scipy numpy-ndarray power-analysis
1个回答
0
投票

你说“我认为问题与 env_pattern 的形状有关,但到目前为止我无法识别它。”之前你写了“我检查了 env_pattern 的大小,为 70000”,并且你说所有数组都是 2D,所以我怀疑

env_pattern.shape
(70000, 1)
。默认情况下,
sosfiltfilt
作用于输入的最后一个维度。如果形状为
(70000, 1)
,则
sosfiltfilt
尝试将滤波器应用于长度为 1 的信号,这会导致您报告的错误。转置数组是有效的,因为这使得形状为
(1, 70000)
,因此
sosfiltfilt
应用于长度为 70000 的维度。

最简单的修复可能是在

axis=0
的调用中添加
sosfiltfilt
,例如

proc_pattern = sosfiltfilt(sos, env_pattern, axis=0)

或者,您可以调整

pattern
的创建,使其成为一维的,例如类似的东西

pattern = power[2630000:2700000, 0]

pattern = power[2630000:2700000].ravel()
© www.soinside.com 2019 - 2024. All rights reserved.