2017-02-13 45 views
0

Меня интересует поиск начала сигнала, определяемого как точка, в которой сигнал отклоняется от базовой линии (то есть среднего значения базовой линии) и никогда не возвращается. Следующий код находит начало в сигнале 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 
+2

Когда вы говорите «векторизовать» ты на самом деле означает [векторизовать] (https://mathworks.com/help/matlab/matlab_prog/vectorization.html), или вы используете термин как синоним " улучшение синтаксиса "или" более разумный код "? – codeaviator

+1

Нет описания того, что должен делать этот код, и мы не можем даже запустить его сами, потому что мы не знаем, что такое 'ini'. Все, что мы можем сделать с этим, - это догадка. – beaker

+0

Прошу прощения за это. Я отредактировал вопрос и установил более четкий пример, который, надеюсь, позволит вам проверить и понять, чего я пытаюсь достичь. Приветствия. – AJMA

ответ

1

Я не могу проверить код, как вы, я не знаю, все переменные, но может быть что-то, как это может быть сделано:

for ii = 1:size(ONSETS,2) 
    baseline = F(ONSETS(ii)-500:ONSETS(ii)-50); 
    max_baseline = max(baseline); 

    idx = find(ini(:,ii) < 0); 
    idxWorking = length(idx); 
    while idxWorking > 0 & F(idx(idxWorking)) > max_baseline 
     idxWorking = idxWorking-1; 
    end 
    ONSETS(1,ii) = idxWorking; 
end 

В качестве альтернативы вы можете применить функцию F ко всему значению idx и просто выбрать последнее значение, которое удовлетворяет условию.

for ii = 1:size(ONSETS,2) 
    baseline = F(ONSETS(ii)-500:ONSETS(ii)-50); 
    max_baseline = max(baseline); 

    idx = find(ini(:,ii) < 0); 
    Fvalues = F(idx); 
    ONSETS(1,ii) = idx(find(Fvalues<max_baseline,1,'last')); 
end 
+0

Я отредактировал мой вопрос, чтобы лучше описать то, что я искал, но ваша вторая альтернатива работает отлично! Спасибо! – AJMA

 Смежные вопросы

  • Нет связанных вопросов^_^