Am besten wäre es, Du verstehst, was passiert. Dann beantwortet sich die Frage auch von selbst ;) (Falls nicht: die Antwort ist "nein, die Sinusfunktion ist abhängig vom Zeitvektor und nicht von einer beliebig gewählten Konstanten, die beschreibt, wie lange eine der zufälligen Amplituden verwendet werden soll").
Ich habe über die Zeilen auch nicht so sonderlich viel nachgedacht. Kann sein, dass da noch kleinere Fehler drin sind, so dass die Vektor-Dimensionen nicht passen. Also am besten nachvollziehen, was dort genau passiert und ggf. korrigieren.
Am meisten hilft es immernoch, es einfach auszuprobieren. So lange das Ergebnis nicht dem entspricht, wie man es sich vorgestellt hat, sind dort noch Fehler im Code.
zeitschritt=0.01;
t=0:zeitschritt:1000;
Anzahl_der_Werte_in_zwei_Sekunden=2/zeitschritt;
schrittweite=Anzahl_der_Werte_in_zwei_Sekunden;
for iCount=1:50
zufallszahl=rand(1)*9;
A(iCount*schrittweite:(iCount+1)*schrittweite)=zufallszahl;
esignal=A*sin(zeitschritt*t+1)+9.50;
end
Ich habe meine m-File hier gepostet. Ich bekomme irgendwie nicht unterschiedliche Amplitudewerte. Jede Amplitude soll einen anderen zufälligen Wert zwischen 0..20 haben. Jetzt haben die Amplituden alle den gleichen zufälligen Wert.
Weiß jemand Rat?
Danke schonmal....
Ich schlage vor das Ganze als Überlagerung (hier Multiplikation) von 2 Signalen zu realisieren.
Signal 1 mit fester Freuqenz und Amplitude 1
Signal 2 mit über den Zeitraum einer Schwingung konstanten Amplitude, aber für jede Schwingung aus einem Zufallswert bestehend, also z. B. bei einer Schwingun über 4 Samples: 4.2 4.2 4.2 4.2 1.8 1.8 1.8 1.8 15 15 15 15 usw.
Ja, ja, sieht sehr gut aus.
Das ist doch genau das, was ich möchte. Eine Funktion, die sinusförmig ist und unterschiedliche (zufällige) Amplituden hat.
Die erste Funktion ist nicht schwierig zu programmieren, siehe meinen letzten Post. Aber die zweite......
Entschuldigung, aber irgendwie habe ich doch meine Probleme, die Kurve mit konstanter Amplitude auf der oben gepostetten Graphik zu erzeugen.
Code:
A=1;%Amplitude ist 1
t=0:0.01:10;%Zeitvariable
omega=1;%Frequenz ist 1, da Periodendauer auch 1
phi=1;%Kurve fängt bei 1 auf der x-Achse an
esignal=A*sin(omega*t+phi)+offset;
Eigentlich müsste ich doch so auf die o. g. Kurve kommen, oder etwa nicht?
Tut mir Leid, aber ich bin wirklich ein absoluter Anfänger in Matlab und muss nun für meine Bachelorarbeit mich in Matlab einarbeiten und diese damit ausarbeiten. Ich versuche wirklich immer mein Bestes Eure Tipps auszuprobieren und weiter zu entwickeln (und natürlich auch eigene Ideen zu versuchen).
Entschuldigung, aber irgendwie habe ich doch meine Probleme, die Kurve mit konstanter Amplitude auf der oben gepostetten Graphik zu erzeugen.
Alles ganz einfach ;)
Code:
A=1;%Amplitude ist 1
t=0:0.01:10;%Zeitvariable
omega=1;%Frequenz ist 1, da Periodendauer auch 1
phi=1;%Kurve fängt bei 1 auf der x-Achse an
esignal=A*sin(omega*t+phi)+offset;
omega = 1 heißt, dass die Frequenz 1rad/s ist. Laut omega = 2*pi*f sind das nur 0,16Hz. Die Periodendauer ist also 6,3 Sekunden = 628 Samples (Zeitschritte).
Phi kannst Du der einfachheit halber am besten erstmal zu null annehmen, das macht das alles nur unnötig kompliziert.
Zitat:
Eigentlich müsste ich doch so auf die o. g. Kurve kommen, oder etwa nicht?
Die oben gemalte Kurve ist mit omega=2*pi (f=1Hz) und phi=0 berechnet worden.
Das Geheimnis der Treppenfunktion ist folgendes: Matlab weiß nichts davon, dass wir hier über Sekunden reden. Matlab sieht nur einzelne Schritte zwischen zwei Punkten. Der t-Vektor ordnet jedem Schritt eine Zeit zu und der sinus- bzw. der Treppenvektor ordnet jedem Schritt einen Wert zu.
Das heißt, wenn man eine neue Funktion (Treppenfunktion) basteln will, darf man nicht in Sekunden denken, sondern muss sich an die Schritte halten. Das ist aber ganz einfach, wenn man sich den Zusammenhang zwischen der Zeit und den Schritten überlegt. Dazu muss man die Schrittweite in Sekunden einführen.
Code:
schrittweite = 0.001; %Schrittweite in Sekunden
schritt_nummer = zeit/schrittweite;
zeit = schritt_nummer * schrittweite;
schrittweite = 0.001; %schrittweite: 1ms
dauer = 10; %So lange soll alles dauern
t=0:schrittweite:dauer; %Zeitvektor
anzahl_der_schritte = dauer / schrittweite; %umrechnung von einer Zeitdauer in eine Schrittzahl (wichtig!)
Mit dem code der letzten Zeile kannst Du also ausrechnen, an welcher Stelle Du einen Werte-Vektor (Treppen-Funktions-Vektor) mit einem Wert beschreiben musst, wenn Du nur eine Zeit vorgegeben hast.
Nun erzeuge ich mir doch noch die Zufallszahlen und schreibe diese für die Schritte in die Treppenfunktion. Oder?
Code:
for i=1:anzahl_der_schritte%10.000 Schritte
zufallszahlen=rand(1)*9;%Zufallszahlen von 0..9
esignal2=stairs(t2,zufallszahlen(i));%Treppenfunktion über die ausgerechnete Zeit mit den Zufallszahlen erzeugen
end
So, dies ist mein aktueller Stand. Die Sinusfunktion mit konstanter Amplitude funktioniert, die Amplitudenfunktion leider nicht.
Code:
%1.) Sinusfunktion (mit konstanter Amplitude)
A1=1;
t1=1:0.01:10;%Zeitvektor
omega1=2*pi;%Frequenz (in rad/s)
phi1=0;%Verschiebung auf der x-Achse
offset1=0;%Verschiebung auf der y-Achse
esignal1=A1*sin(omega1*t1+phi1)+offset1;
%2.)(definierte) Amplitudenfunktion (als Treppenfunktion)
schrittweite=0.01;%Schrittweite in Sekunden (10ms)
schritt_nummer=0;
schritt_nummer=(schritt_nummer*schrittweite)/schrittweite;
dauer=10;%so lange soll alles dauern
t2=0:schrittweite:dauer;%Zeitvektor
anzahl_der_schritte=dauer/schrittweite;%Umrechnung von einer Zeitdauer
%in eine Schrittzahl (hier 1000
%Schritte) for i=1:(anzahl_der_schritte+1)
zufallszahlen(i)=rand(1)*10;%Werte-Vektor
end
esignal2=zufallszahlen;
%1. Plot hold off
esignal1_a=plot(t1,esignal1,'b');
set(esignal1_a,'LineStyle','-');
set(esignal1_a,'LineWidth',2.25);
grid on
grid MINOR
title('1.) Sinusfunktion (mit konstanter Amplitude)','FontSize',14,'FontWeight','Bold');
xlabel('Zeit in [sec] \rightarrow');
legend('Sinusfunktion (mit konstanter Amplitude)','location','SouthEast');
figure();
%2. Plot hold off
esignal2_a=stairs(t2,esignal2,'g');
set(esignal2_a,'LineStyle','-');
set(esignal2_a,'LineWidth',2.25);
grid on
grid MINOR
title('2.)(definierte) Amplitudenfunktion','FontSize',14,'FontWeight','Bold');
xlabel('Zeit in [sec] \rightarrow');
legend('(definierte) Amplitudenfunktion','location','SouthEast');
Werte_pro_Schwingung=round((omega1/(schrittweite*pi)))
Schwingungen=round(dauer*pi/omega1)
sig2=[];
for k=1:Schwingungen
sig2=[sig2 repmat(rand(1),1,Werte_pro_Schwingung)];
end plot(sig2)
Das ist das "zweite Signal" welches mit dem ersten multipliziert werden muss. Es ist nur wichtig die Werte_pro_Schwingung und Schwingungen so korrekt zu setzen, dass Rundungseffekte irrelevant werden.
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
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.