WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Sinusfunktion

 

EteZabel
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 08:45     Titel: Sinusfunktion
  Antworten mit Zitat      
Hallo,

im Rahmen meiner Bachelorarbeit benötige ich ein sinusförmiges Eingangssignal mit zufälligen Amplitudenwerte von 0..20. Ich habe mir bereits ein solches Signal programmiert.

Jedoch das Signal nur über Werte von Pi. Wie kann ich das Signal einfach für z. B. 1000s erzeugen???

Code:
for i=1:181
zufall=rand(i);
end
zufallszahlen=2.125*zufall;
x=0:pi/90:2*pi;
esignal=abs(sin(x)*zufallszahlen);


Besten Dank schon mal für Eure Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 09:04     Titel: Re: Sinusfunktion
  Antworten mit Zitat      
Code:
for i=1:181
    zufall=rand(i);
end

Gibt es einen tieferen Sinn dahinter? Du weist der Variablen zufall so etwa 181 verschiede Werte zu und überschreibst dabei immer den alten Wert. Behalten wird dabei nur der letzte Wert, also rand(181), was wiederum eine 181x181-Matrix ist. Im prinzip kannst Du die Schleife auch weglassen.

Die allgemeine Form (kein matlab-code) eines Sinus-Signals ist jene:
Code:
y(t) = A * sin(omega * t + phi)

A ist dabei die Amplitude, omega ist die Frequenz (in rad/s), t die Zeitvariable und phi (in rad) die Phasenverschiebung. In Matlab sieht das so aus:

Code:

A = 5;
t = 0:0.01:100; %Zeitvektor
omega = 10; %rad/s
phi = 1; %rad
y = A * sin(omega * t + phi);
 


Da musst Du jetzt nur noch deine Zufallsamplituden mit einbringen. Wobei mir da nicht ganz klar ist, ob Du 20 Signale mit verschiedenen Amplituden willst oder ein Signal, das über den gesamten Verlauf 20 Amplituden annimmt.

Wenn Du 20 Signale mit verschiedenen Amplituden willst, dann kannst Du das so machen:
Code:

A = rand(10, 1); %zufälliger Amplitudenvektor mit 10 Werten
t = 0:0.01:100; %Zeitvektor
omega = 10; %rad/s
phi = 1; %rad
y = A * sin(omega * t + phi);
 


Im anderen Fall (ein Signal, das die Amplitude wechselt) gibt es diverse Möglichkeiten - kommt sehr darauf an, was Du dann genau haben willst.
Private Nachricht senden Benutzer-Profile anzeigen
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 09:12     Titel: Re: Re: Sinusfunktion
  Antworten mit Zitat      
Danke nochmal.

Also, ich möchte EIN Signal mit unterschiedlichen, zufälligen Amplitudenwerten, die zwischen 0 und 20 variieren.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 09:43     Titel:
  Antworten mit Zitat      
Und in welcher Form soll der Übergang zwischen den Amplituden stattfinden? Sprunghaft? Dann bekommst Du ein unstetiges oder ein nicht differenzierbares Signal. Problem?
Und jede Amplitude für eine bestimmte Zeit? Oder soll die Zeit zwischen den Amplitudenwechseln auch zufällig sein?
Private Nachricht senden Benutzer-Profile anzeigen
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 09:50     Titel: Re: Sinussignal
  Antworten mit Zitat      
Die Zeit zwischen den Amplituden kann durchaus auch zufällig sein. Es muss nicht an bestimmten Zeiten ein bestimmter Amplitudenwert erreicht werden.

Ein sprunghaftänderndes Signal ist erst einmal, denke ich jetzt, kein Problem.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 09:55     Titel:
  Antworten mit Zitat      
Der Trick wird sein, dass A ein Zeilenvektor sein wird, der genau so viele Elemente hat, wie y bzw. t. Diesen A-Vektor multiplizierst Du dann elementweise mit deinem Sinus-Signal:

Code:

A = rand(length(t), 1); %A-Vektor
y = A .* sin(omega * t + phi); %Elementweise Multiplikation mit .* statt *
 


Dann musst Du nur noch irgendwie den A-Vektor richtig basteln (im Beispiel ist er falsch). Der A-Vektor besteht dann aus 20 zur x-achse parallelen Geraden-Stückchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 10:14     Titel: Re: Sinusfunktion
  Antworten mit Zitat      
Was meinst Du mit der lengh(t)-Funktion? Was verbirgt sich dahinter?

Ich habe die Sinusfunktion schon mal zurecht gebastelt, nur ohne zufällige Amplitudenwerte. Die Amplitude ist jetzt konstant bei 20, sie müsste nur noch zwischen 0..20 variieren.

Code:

A=20;
t=0:0.01:1000;
omega=0.1;
phi=1;
esignal=abs(A*sin(omega*t+phi));
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 10:21     Titel: Re: Sinussignal
  Antworten mit Zitat      
mal noch eine allgemeine Frage...

Wie kann man eigentlich die Sinus-Funktion auf der y-Achse verschieben?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 10:23     Titel:
  Antworten mit Zitat      
Ah, sie soll zwischen 0 und 20 Variieren, nicht in 20 Schritten, 20 verschiedene, konstante Werte annehmen?

length gibt die Länge eines Vektors zurück. Der Amplituden-Vektor muss ja genau so lang sein, wie dein Signal-Vektor:

Signal_mit_wechselnder_Amplitude = Amplitude_zu_jedem_Zeitpunkt .* Signal_mit_konstanter_amplitude

Wenn Dein Sinus-Signal 1000 Werte hat, dann muss zu jedem dieser 1000 Werte auch eine Amplitudeninformation vorliegen. Du könntest einfach 1000 random-Werte ausgeben lassen, aber dann bekommst Du ein (fast) Zufallssignal raus. Also musst Du dir noch was cleveres einfallen lassen, wie dein Amplituden-Signal aussieht, damit man hinterher noch einen Sinus erkennen kann. Das musst aber Du wissen, was Du dir da wünschst.

Die Verschiebung auf der x-achse bewirkst Du mit der Phase phi. Auf der y-Achse verschiebst Du einfach per Addition eines Wertes (offset):

Code:
y = A * sin(omega*t + phi) + offset
Private Nachricht senden Benutzer-Profile anzeigen
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:02     Titel: Re: Sinussignal
  Antworten mit Zitat      
Besten Dank für Deine Hilfe.

Nun habe ich die Sinuskurve so verschoben, dass ich bei maximaler Amplitude nur positive Werte erhalte.

Code:

A=9.0;
t=0:0.01:1000;
omega=0.1;
phi=1;
esignal=A*sin(omega*t+phi)+9.50;
 


Wie meintest Du die Sache mit dem random von 1000 Werten? Amplitudenwerte dürfen nun bis max. 9.0 reichen, da ich die Kurve in den positiven Bereich verschoben habe.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:08     Titel: Re: Sinussignal
  Antworten mit Zitat      
EteZabel hat Folgendes geschrieben:

Wie meintest Du die Sache mit dem random von 1000 Werten? Amplitudenwerte dürfen nun bis max. 9.0 reichen, da ich die Kurve in den positiven Bereich verschoben habe.


Naja, aktuell ist deine Amplitude ja konstant 9. Wenn ich das richtig verstehe, willst Du aber nicht immer die gleiche, sondern eine variable Amplitude.
Wenn Du das machst, ist A aber kein Skalar (einfache Zahl) mehr, sondern ein Vektor, in dem für jeden Zeitpunkt eine Amplitude vermerkt ist.

Die Kunst ist es jetzt, diesen Vektor sinnvoll zu erzeugen. Wenn Du ihn mit rand() erzeugst, hast Du für jeden Zeitschritt eine andere Amplitude. Das würde ziemlich wild und vermutlich überhaupt nicht mehr nach Sinus aussehen. Also musst Du dir was anderes ausdenken, wo die Amplitude etwas langsamer verändert wird. Zum Beispiel könntest Du immer 2 Sekunden lang den gleichen Zufallswert als Amplitude verwenden. Kommt eben darauf an, was Du willst. Aber das kann Dir hier niemand verraten - das musst Du schon selbst wissen/rausfinden.
Private Nachricht senden Benutzer-Profile anzeigen
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:16     Titel: Re: Sinussignal
  Antworten mit Zitat      
Ok, dann werde ich mal etwas tüfteln...... Question

Vielen Dank für Deine zahlreiche Hilfe. Danke. Laughing Laughing Laughing
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:23     Titel: Re: Sinussignal
  Antworten mit Zitat      
Wenn die Funktion den Amplitudenwert für eine bestimmte Zeit halten soll, gibt es eine wait-Funktion?

Code:

wait(2);%für 2 Sekunden warten
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
EteZabel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 06.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:29     Titel: Re: Sinussignal
  Antworten mit Zitat      
Ok, es gibt eine Pause-Funktion.

Code:

for i=1:1000
zufall=9.15*rand(i);
A=zufall;
t=0:0.01:1500;
omega=0.1;
phi=1;
esignal=A*sin(omega*t+phi)+9,50;
pause(2);
end
 


Meintest Du es so mit den 1000 Werten?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2009, 11:30     Titel:
  Antworten mit Zitat      
Es gibt die Funktion wait aber die tut was völlig anderes...

Du musst die 2 Sekunden zunächst in dein Zeitraster umsetzen, damit Du weißt, wieviele Werte das in deinem Signal-Vektor sind:
Code:

zeitschritt = 0.01;
t = 0:zeitschritt:100;
Anzahl_der_werte_in_zwei_sekunden = 2/zeitschritt; %=2/0.01=200
 


Mit dieser Information kannst Du den Vektor jetzt befüllen:
Code:

zufallszahl = rand(1) * 9; %gibt eine Zufallszahl zwischen 0 und 9 aus
A(1:Anzahl_der_werte_in_zwei_sekunden) = zufallszahl;
 


Das ganze könntest Du in einer Schleife verpacken, in der Du nach und nach den Amplitudenvektor auffüllst.

Code:

schrittweite = Anzahl_der_werte_in_zwei_sekunden;
for iCount = 1:49 %50 schritte (zu je 2 Sekunden)
    zufallszahl = rand(1) * 9;
    A(iCount*schrittweite : (iCount+1)*schrittweite) = zufallszahl;
end
 


Die Pause-Funktion gibt es wirklich, hat aber auch nichts mit deinem Problem zu tun, sondern hält einfach die Ausführung deines Programms für 2 Sekunden an...

PS: Du addierst da 9,5 statt 9.5
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.