'resample', чтобы иметь одинаковый размер сигналов

У меня есть 4 (2 тарифа и 2 раза) сигналов, и мне нужно выровнять их размеры. Я отрежу их в первую очередь, потому что мне это тоже нужно. Размер первого сигнала и скорости - 3901, другой - 830. Но не только для удаления элементов, я хочу сохранить кривую. Я подумал, что мне нужна интерполяция, и попробовал "ресамплировать", но он не идеален. Похоже на фото. Как я должен улучшить свои коды? Любая идея?

 index=time >= 9.6 & tsyn <= 13.5; %time boundaries of first time signal
 time1=tsyn(index); %first time signal
 time_f=resample(time1,830,3901);
 Rate1=CLU_YR1(index)              %first rate signal
 Rate_f=resample(Rate1,830,3901);

 index2 = cm.Time.data >= 26.3 & cm.Time.data <= 30.45; %time boundaries of second time signal
 time2=cm.Time.data(index2)   %second time signal
 Rat2=cm.BodySensor_SC1_Omega_B_z.data*(-180/pi)        %second rate signal
 Rate_p=Rat2(index2)

1 ответ

Решение

Я полагаю, что некоторые несоответствия ваших кривых происходят из-за того факта, что исходная последовательность не является (близкой к) 0 в конце вектора. Из документации Matlab Resample:

При фильтрации resample предполагает, что входная последовательность x равна нулю до и после выборок, которые ей даны. Большие отклонения от нуля в конечных точках x могут привести к неожиданным значениям для y.

Что является лучшей альтернативой, зависит от того, что вы хотите делать дальше. Если вы хотите иметь новую версию с повышенной дискретизацией (т.е. оба сигнала длиной 3901), вы можете посмотреть наinterp1, который поддерживает несколько разных методов. Если вы решите сделать это, имейте в виду, что значения в y(t) будет интерполироваться в соответствии со значениями t Вы предоставляете. Поскольку ваши временные массивы не выглядят выровненными (один между 9,6 и 13 с, другой между 26 и 30), вам, вероятно, лучше всего сделать что-то вроде:

y_new = interp1( linspace(1,100,830), rate_p, linspace(1,100,3901), 'linear');

и то же самое для массива времени.

Другие вопросы по тегам