0

最大値によって特徴付けられるサイクルの開始を識別しようとしています。データは周期的であるように見えますが、ポイント数が決まっていないため、データを 50 ポイントに分割して最大数を検索することはできません。ただし、チェックに使用される可能性のある 20 ポイント (pt_limit) が経過する前にサイクルを繰り返すことはできないことはわかっています。また、DAQ ハードウェアの制限により、データのトリガーもありません。以下にいくつかのサイクルを含めましたが、実際のデータセットには、これらの準周期的なサイクルが何千も含まれます。
以下に例を示します (データセットが長くなって申し訳ありません)。

data = [9147    9147    9513    9696    9696    9940    10093   10093   10246   10520   10520   10520   10795   10947   10947   11222   11772   11772   9452    4049    4049    4049    599 111 691 691 1515    2309    2309    2309    3072    3683    3683    4415    4995    4995    5453    5453    6063    6063    6643    7162    7162    7468    7742    7742    7742    8200    8536    8536    8841    9116    9116    9238    9543    9543    9543    9818    10001   10001   10246   10551   10551   10673   10673   10673   10917   10917   8749    4049    4049    1057    722 722 722 1210    2004    2004    2828    3683    3683    4293    4293    4751    4751    5270    5728    5728    6155    6643    6643    6643    7071    7437    7437    7712    8048    8048    8353    8353    8689    8689    9024    9269    9269    9513    9909    10215   10215   10215   10368   10673   10673   11008   11192   11192   11039   7864    7864    7864    2828    661 661 661 1332    1332    2309    2309    2950    2950    3683    4507    4507    5117    5667    5667    5667    6094    6521    6521    6949    7437    7437    7864    7864    8169    8169    8322    8689    9086    9086];  
dt = [0 diff(data)];  
t_thresh = -0.5;       % threshold to identify changes (exclude noise)  
ind = find(dt < t_thresh);  
figure
set(gcf,'position',[50 50 (1080) (675)])
ax(1) = subplot(2,1,1);
plot(data, '.')
xlim([-5 155])
grid on
ax(2) = subplot(2,1,2)
plot(dt, '.')
grid on
hold on
plot(ind, dt(ind), 'ro')
xlim([-5 155])
linkaxes(ax,'x')

多くの場合、データには反復点が含まれているため、導関数の大きな変化を探すだけでは困難です。
含まれているデータ セットでこの問題を解決するには、次のようにします。

cycle_ind = [18 68 116]

助けてくれてありがとう

どんな助けでも大歓迎です。

4

1 に答える 1

1

データをフィルタリングしてから、しきい値を設定するのではなく、導関数の符号の変化を探します。

B = fir1(8,0.5);
newData = filtfilt(B,1,data);
dt = [0 sign(diff(newData))];
ddt = -[0 diff(dt)];
localMaxima = data(ddt>0);
idx = find(ddt>0);
plot(1:length(data),[data;newData;ddt*max(data)])
于 2013-08-23T16:26:03.393 に答える