Forum: Digitale Signalverarbeitung / DSP / Machine Learning Matlab Sägezahnsignal


von steen (Gast)


Angehängte Dateien:

Lesenswert?

Moin Moin,

ich stehe momentan vor einem kleinen Problem und würde mich über eure 
Hilfe freuen.

Ich möchte ein Sägezahnsignal plotten lassen, welches eine amplitude von 
0.02 hat.
Der Ablauf soll sein: Signal steigt(von 0) so lange linear, bis +0.02 
erreicht ist. Bei diesem Zeitpunkt soll das Signal dann durch 
dotenew=-0.001; solange fallen, bis der Wert -0.02 erreicht ist und dann 
wieder positiv etc...

Mein Problem ist jetzt, dass sobald der Wert 0.02 erreicht ist, durch 
"else" dotenew=-0.001 ist, dies jedoch nur genau einmal passiert und 
anschließend wieder dotenew wieder positiv ist, wodruch das Signal 
ständig zwischen 0.021 und 0.02 pendelt.

Ich weiß, dass mir eine Bedingung fehlt, welche sagt, dass dotenew erst 
wieder positiv sein soll, sobald -0.02 erreicht worden ist. Hat jemand 
eine Idee wie ich diese Bedingung programmieren kann?

Die Matlabdatei befindet sich im Anhang :)

Danke!

von Stephan S. (plonk)


Lesenswert?

Ganz unelegant kann man das mittels eines Flags lösen.
Zumindest würde ich das so machen ;-)

MfG

von steen (Gast)


Lesenswert?

Okay, wie genau meinst du das?
Ich denke halt eher an eine zusätzliche Bedignung, welche irgendwie 
feststellt, dass -0.02 noch nicht erreicht wurde und deswegen weiterhin 
dotenew=-0.001 ist. Nur bekomme ich keinen funktionierenden Code 
zusammen.

von Stephan S. (plonk)


Lesenswert?

Also nach deinem Code würde ich so gehen:
1
if enew>=0.02 & flag==0;          %steptime<=20
2
% blocker>0          %Dehnung, Epsilon
3
%else blocker  
4
%steptime<=10        %wenn steptime kleiner gleich 10 ist...
5
%dotenew=+0.001;     %Dehnrate
6
flag=1;     %aufwärts
7
8
elseif enew<=-0.02 & flag==1
9
%  enew>=-0.02;           %Dehnung, Epsilon
10
%dotenew=-0.001;       %Dehnrate
11
flag=0;     %abwärts
12
blocker=1;
13
%bis -0.02 erreicht wurde, dann wieder dotenew+0.001
14
end

danach auf die Zustände prüfen
1
if flag==1;
2
dotenw=0.001;
3
else
4
dotenw=-0.001;
5
end


MfG

Edit: ein wenig abgeändert... Denkfehler. Jetzt aber.

: Bearbeitet durch User
von steen (Gast)


Lesenswert?

super :) also ich habe den code mal getestet, jedoch war nur ein linear 
sinkendes Signal zu sehen. Ich hab den Code mal angepasst, jetzt ist das 
Sägezahnsignal erkennbar:


1
enew<=0.02 & flag==0;

und
1
elseif enew>=-0.02 & flag==1

Leider schwingt das Signal jedoch zwischen 0-1 (das Ziel ist 0.02 und 
-0.02). Wie kann das sein, obwohl enew max +-0.02 ist?

von Stephan S. (plonk)


Lesenswert?

Genau, da habe ich noch einen Vorzeichenfehler dringehabt.
Mit diesem Code geht es von -0.02 bis 0.02:
1
clear;
2
enew=0.0;
3
flag=0;
4
5
for N=1:400
6
   if enew>=0.02 & flag==0;          %steptime<=20       
7
       %dotenew=0.001;     %Dehnrate
8
       flag=1;
9
   elseif enew <=-0.02 & flag==1 
10
      %dotenew=-0.001;       %Dehnrate
11
      blocker=1;
12
      flag=0;
13
      %bis -0.02 erreicht wurde, dann wieder dotenew+0.001
14
   end
15
   if flag==0;
16
       dotenew=0.001;
17
   else
18
       dotenew=-0.001;
19
   end    
20
   enew=enew+dotenew;
21
   Y(N,1)=enew;
22
   %disp(enew);
23
  
24
end
25
N=1:1:400;
26
plot(N,Y);
Sollte passen. Hat gegenüber deiner Version die Vergleichszeichen anders 
und die Flags waren vorhin beim hoch- und runterzählen falschherum.

MfG

: Bearbeitet durch User
von steen (Gast)


Lesenswert?

Herzlichen Dank, funktioniert!

von Detlef _. (detlef_a)


Lesenswert?

Das geht mit guter Kenntnis der mächtigen Matlab Syntax auch in drei 
Zeilen:

y1=repmat(1e-3*[1 -1],40,5);
y2=cumsum(y1(:))-0.02;
y3=[y2(21:end);y2(1:20)];

Yo ;))))
Cheers
Detlef

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.