Меня интересует поиск начала сигнала, определяемого как точка, в которой сигнал отклоняется от базовой линии (то есть среднего значения базовой линии) и никогда не возвращается. Следующий код находит начало в сигнале F как последнюю отрицательную разницу элементов примыкания F. Однако из-за некоторого шума в сигнале F (я не хочу его фильтровать) начало может быть обнаружено позже, чем ожидалось (визуально).Как я могу улучшить следующий синтаксис, содержащий несколько операторов if?
В следующем примере сигнала F, то «визуально вправо» начало будет расположен в точке 944. Однако, в соответствии со способом, описанным выше, он сначала устанавливается в точке 1001.
Позднее часть из код, содержащий несколько операторов if, исправляет назад и ищет последний idx, который содержится в желаемом диапазоне F (в данном случае означает среднее значение (базовый уровень)).
Как можно улучшить эти утверждения if, чтобы он продолжал двигаться один за другим в векторе idx до тех пор, пока F (начало) < = mean_baseline is TRUE?
Сигнал выборки F.mat можно найти здесь: https://www.dropbox.com/s/r4t8nzz4s7t9x4e/F.mat?dl=0
Fs = 1926; % sampling frequency
ff = diff(F);
idx = find(ff < 0);
onset = idx(end); % here
% Take a chunk of F prior to "onset": baseline
Fs = 1926; % sampling frequency
baseline = F(1:onset-(Fs*0.15)); % create baseline as a chunk of F, 150ms before the onset found above
mean_baseline = mean(baseline); % we create this variable to be used later as condition in the if statements
% we are interested in indexing the latest negative idx (idx < 0) BUT only if the corresponding F value is equeal or lower than the desired value (in this case mean_baseline)
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-1);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-2);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-3);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-4);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-5);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-6);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-7);
if F(onset) > mean_baseline
idx = find(ff < 0);
onset = idx(end-8);
end
end
end
end
end
end
end
end
Когда вы говорите «векторизовать» ты на самом деле означает [векторизовать] (https://mathworks.com/help/matlab/matlab_prog/vectorization.html), или вы используете термин как синоним " улучшение синтаксиса "или" более разумный код "? – codeaviator
Нет описания того, что должен делать этот код, и мы не можем даже запустить его сами, потому что мы не знаем, что такое 'ini'. Все, что мы можем сделать с этим, - это догадка. – beaker
Прошу прощения за это. Я отредактировал вопрос и установил более четкий пример, который, надеюсь, позволит вам проверить и понять, чего я пытаюсь достичь. Приветствия. – AJMA