Test oscillation.m

From 2006.igem.org

Jump to: navigation, search
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
Personal tools
Past/present/future years