'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');
и то же самое для массива времени.