www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Problem mit Matlab


Autor: Peter M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab da ein Signal x(k) das ich zuerst in eine geschlossene 
Darstellung
gebracht habe: x(k)= 2*h(k-1)-2*h(k-2)+2*h(k-3) --> x(k) --> X(z)
Im Anschluss daran habe ich dieses Signal mit der Übertragungsfunktion 
G(z) multipliziert. Somit erhalte ich dann das Ausgangssignal Y(z).
Dieses Y(z) wandelt man dann in y(k) um. Wie kann man mit Matlab solch 
eine Aufgabe lösen? Wie kann man in Matlab das x(k) bzw. y(k) grafisch 
darstellen?

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es in Matlab keine Möglichkeit das diskrete Zeitsignal z.B.
x(k)= 2*h(k-1)-2*h(k-2)+2*h(k-3)+2*(1/2)^(k-5)*h(k-5) grafisch zu 
plotten?

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vorausgesetzt du hast dein h(k) schon, dann kannst du einfach in einer 
Schleife dein x(k) erzeugen und dann plotten... sonst musst du natürlich 
erst noch das h(k) erzeugen

for k = 6:ENDWERT+6
  x(k-5)= 2*h(k-1)-2*h(k-2)+2*h(k-3)+2*(1/2)^(k-5)*h(k-5);
end

figure(1);
plot(x);

Die Hilfe von MATLAB ist aber auch sehr gut! Einfach mal reinschauen...

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst dann noch die länge von h(k) anpassen, entweder nullen hinten 
anhängen, oder wenn du die Schleife von 1 an durchlaufen willst, dann 
Nullen vorne vorsetzen...
Ist immer ein bisschen gebastel mit den Indizes.
Mit "whos" im MATLAB-Fenster kannst du dir die Länge der Variablen 
anzeigen lassen. Seht hilfreich!

h=[h zeros(1,6)];

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab da kene Ahnung wie so ein Sprung erzeugen könnte.
Es soll ja so sein, dass wenn der Sprung h(k-1) kommt, dass bei k=1 ein 
Sprung auf 1 erzeugt wird. Wie man dies in Matlab  allgemeingültig 
hinbekommt, das weiss ich nicht.

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal in Matlab das ganze versucht. Nun ist es so das der Sprung 
bis jetzt nur bei k=1 auf 1 springt. Wie könnte man in Matlab dies 
allgemeingültig hinbekommen? Beispiel: h(k-7): Sprung bei k=7

function [x] = h(k)

if(k==1)
    x=1;
else
    x=0;
end

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe deine Frage noch nicht so ganz...
Wie soll denn dein Signal h(k) aussehen? Wie lang soll es sein? Wieviele 
Sprünge?
Da es sich um ein diskretes Signal handelt, brauchst du für einen Sprung 
auf 1 nur eine 1 in den Vektor schreiben.
Der Vektorindex fängt aber immer bei 1 an und darf nicht 0 werden!

Bsp.

h=[ 0 0 0 1 1 0 0 0 0 0];

dann hast du bei h(4) einen Sprung auf 1... h(5) ist auch 1 der Rest ist 
Null...

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:

x(k)= 2*h(k-1)-2*h(k-5)

Bei k=1 soll der Sprung auf 1 gehen und bei k=5 soll dieser Sprung 
wieder auf 0 gehen.  Dies bedeutet dass bei k=2 und k=3 und k=4 der 
Sprung auf 1 ja bleiben soll. Erst bei k=5 soll der Sprung wieder auf 0 
gehen und da auch bleiben.

Autor: Peter M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sprung Funktion:

function [x] = h(k,m)
if(k==m | k>m)
    x=1;
else
    x=0;
end


Matlab Programm:

x=[0,0,0,0,0,0,0,0,0,0];
for k = 1:8
  x(k)= 2*h(k,1)-2*h(k,5)
end

figure(1);
plot(x);

Was mir da noch nicht so gefällt ist, dass der Sprung bei k=5 nicht 
gleich auf Null springt. Wie könnte man dies in Matlab lösen?

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also du willst dein x(k) bauen?

hilft es dir, wenn du mit
x=zeros(1,laenge);
x =

     0     0     0     0     0     0     0     0     0     0
einen Vektor der Länge laenge mit Nullen erzeugst und du dann die 
Sprünge einfügst?

x(3)=1;
x(5:8)=1;
x =

     0     0     1     0     1     1     1     1     0     0

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, jetzt habe ich deinen Weg verstanden, so geht es auch... erscheint 
mir aber etwas umständlich. Meist sieht ein Algorithmus auf dem Papier 
anders aus als die MATLAB-Implementation...

die Schräge kommt zustande, weil die Plotfunktion einfach nur die Werte 
geradlinig verbindet. Dein x(4) ist 1, dein x(5) ist 0, also ergibt das 
verbunden eine Schräge...

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tue mit der Funktion "stem" das ganze grafisch darstellen.
Das ist besser. Danke für die Hilfe.

Autor: Peter M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wie erreicht man das der Plot bei 0 beginnt und nicht bei 1?

Bei der Verwendung von Rampen funktioniert meine Funktion nicht.

Beispiel:
N=5;
x=zeros(1,N);

for k = 1:N
  x(k)= k*h(k,0) - k*h(k,3);
end

figure(1);
stem(x);
grid on;

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich muss ich für die Rampe auch eine eigene Funktion 
schreiben.

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Plot kann meines Wissens nicht bei Null anfangen, da der Index Null 
nicht existiert. Bei meinen Simulationen fällt das aber kaum auf... 
(>90000 Samples)

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Wie sieht dann die Rampenfunktion aus?

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
x(k)= k*h(k,0) - k*h(k,3);

In diesem Beispiel beginnt die Rampe bei k=0. Bei k=3 geht die Rampe 
wieder nach unten. Das in Matlab zu programmieren bereitet mir probleme.

Autor: mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß, das ist nicht so, wie du es haben willst, aber vielleicht 
hilft es beim Basteln:

x1=0:1/10:1;
x2=ones(1,10);
x3=1:-1/10:0;
x=[x1 x2 x3];

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Plot der bei null anfängt:

>> x= 1:10;
>> t=0:length(x);
>> t=0:length(x)-1;
>> plot(t,x)

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Rampenfunktion ist eine echt knifflige Angelegenheit.

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
y(k) = k * r(k,0,5)

Rampenfunktion:

% m1: Start der Rampe
% m2: Ende Rampe
function [x] = r(k,m1,m2)

if(k>=m1 & k<m2)
    x=k;
else
    x=m2;
end

------------------------------------------------------------------
Soweit funktioniert mal die Rampenfunktion. Nur beim abschalten 
"-k*r(k,5,10)" da klemmt es noch.

Autor: Peter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir da jemand noch einen Rat geben, wie man so eine Rampenfunktion 
in Matlab programmiert?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.