From 2006.igem.org
function v = test_oscillation(yt, x, Tx, tstep, tfinal)
%parameters:%
peakdiff = 0.5; % die erwünschten peaks sollten mindestens 1/peakdiff mal
% so hoch sein wie die unerwünschten.
periode = Tx./tstep.*4; % (*2) weil die Periode der unteren beiden inputs 2*Tx ist,
% und nochmals (*2) weil die Signale nur jede zweite Periode
% einen Peak haben.
extend = zeros(ceil(periode),1);
extend_length = length(extend);
yt = [extend; yt; extend];
i_yt_anfang = extend_length + 1; %Die Indexpositionen, an denen yt jeweils beginnt bzw. endet.
i_yt_ende = length(yt) - extend_length;
boundary = round(periode./2); %Ich will die Randbedingungen nicht miteinbeziehen
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Suche einen der Peaks im Signal yt:%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
yt= round(yt.*10000)./10000; %Schwankungen auf der 5. Nachkommastelle interessieren mich nicht.
%'erster gefundener Peak:'
[m,i] = max(yt(i_yt_anfang + boundary : i_yt_ende - boundary,:));
i = i + boundary + i_yt_anfang - 1; %setze den index wieder an die richtige stelle
%Bei einem Plateau gibt max() den ersten maximalwert zurück (linkes ende
%vom Plateau). Ich will aber ein wert ungefähr in der mitte des plateaus.
for k = 1:50,
if yt(i + k.*20) < (yt(i)-0.0001)
i = round(i + ((k-1).*20)./2);
break;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ich will wissen, ob y4 (mit Periode Tx*2) oszilliert:%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
v=1;
number_of_periods = floor(tfinal./Tx./4); % Muss immer angepasst werden!
if number_of_periods < 2
'Error: zu wenig lange auswertung (erhöhe tfinal)!!!'
end
%'1. maxpeak:'
%%%%%%%%%%%%%%
peak1 = mod(i, periode) + periode + (number_of_periods-1) * periode;
% die Stelle, an der der erste Peak ungefähr sein sollte
area = round(periode./5);
% der Bereich links und rechts um den vermuteten peak,
% in dem der richtige Peak zu finden sein muss
[peak1_max , peak1_i] = max(yt(peak1-area:peak1+area, :));
peak1_i = (peak1_i + peak1 - area - 1);
%'2. maxpeak:'
%%%%%%%%%%%%%%
peak2 = peak1 - periode;
[peak2_max, peak2_i] = max(yt(peak2-area:peak2+area, :));
peak2_i = (peak2_i + peak2 - area - 1);
P = [peak1_max, peak2_max];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Schaue, ob das maximum im bereich wo der peak sein sollte grösser ist als%
%das maximum vom bereich wo kein peak sein sollte. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%'1. minpeak:'
%%%%%%%%%%%%%%
minpeak1 = peak1 - round(periode ./ 2);
[minpeak1_max, minpeak1_i] = max(yt(minpeak1-area:minpeak1+area, :));
minpeak1_i = (minpeak1_i + minpeak1 - area - 1);
%'2. minpeak:'
%%%%%%%%%%%%%%
minpeak2 = minpeak1 - periode;
[minpeak2_max, minpeak2_i] = max(yt(minpeak2-area:minpeak2+area, :));
minpeak2_i = (minpeak2_i + minpeak2 - area - 1);
minP = [minpeak1_max, minpeak2_max];
V = [P; minP];
A = [peak1_max, (peak1_i-extend_length).*tstep;
peak2_max, (peak2_i-extend_length).*tstep;
minpeak1_max, (minpeak1_i-extend_length).*tstep;
minpeak2_max, (minpeak2_i-extend_length).*tstep];
for q=1:length(P),
if (peakdiff.*V(1,q)) <= V(2,q) % Der grosse Peak sollte doppelt
% so gross sein wie der kleine
v = 0;
end
end