Signalerzeugung in Matlab (Sinesweep mit steigender Frequenz(e-Funktion))

Gast #3222573
Hallo,

ich komme bei meinem folgenden Problem einfach nicht weiter:
Ich möchte mit Matlab eine Anregung erzeugen (Sinussignal mit nach einer 
e-Funktion steigender Frequenz und konstanter Amplitude; das alles mit 
1000Hz Auflösung) und irgendwie geht das so nicht:

Amp = 5;
T_End=55;
EKoeff=0.8432;
EExp=0.061;
T=0:0.001:T_End;
T=T';
Frequ=EKoeff*exp(EExp*T);
omega=2*pi*Frequ;
Master=Amp*sin(omega.*T);

Die Koeffizienten der e-Funktion habe ich aus Messtechnik gefittet 
(siehe Anhang). Laut Excel soll mit diesen Koeffizienten die e-Funktion 
bei 55 Sekunden (T_End... Endzeitpunkt) die Apmlitude (maximale 
Frequenz) bei ca. 25Hz sein.
Aus irgendeinem Grund hat das Signal am Endzeitpunkt jedoch 100Hz.
Kann mir da jemand weiterhelfen?

Danke und LG,
Mille
Angehängte Dateien:
Gast
Hallo,

ich bin mir ziemlich sicher, dass man das so nicht machen kann. Der 
Fehler scheint daran zu liegen, dass zu einem beliebigen Zeitpunkt die 
Formel

  sin(omega.*T)

davon ausgeht, dass omega eine Konstante für alle früheren Zeitpunkte 
war, was sie aber nicht ist.

Kann dir keine geschlossene Lösung bieten (im Sinne einer Formel), aber 
Pseudo-Code, der das richtige Ergebnis liefern müsste (Pseudo-Code, da 
ich Matlab nicht kann);

Amp = 5;
T_End=55;
EKoeff=0.8432;
EExp=0.061;
DeltaT=0.001;

T = 0; Argument = 0; i=0;
repeat
  Frequ=EKoeff*exp(EExp*T);
  Argument = Argument + PI*Frequ*DeltaT;
  Master[i]=Amp*sin(Argument);
  i = i+1;
  T = T + DeltaT;
until T > T_End

Dieser Code berechnet für jeden neuen Zeitschritt den dann notwendigen 
Phasenwinkel (hier Argument genannt) und benötigt diesen später zur 
Berechnung des nächsten Zeitschrittes.

Kann es in Matlab nicht ausprobieren, läuft aber gut in Pascal bei mir 
wenn man für Master ein entsprechen großes Array benutzt.

Gerhard
Gast
Hallo,

danke für deine Antwort, du hast Recht gehabt.
Ich habe deinen Pseudo-Code umgesetzt und es funktioniert:

Amp = 5;
T_End=55;
EKoeff=0.8432;
EExp=0.061;

Master = zeros(55000,2);
Argument = 0;
T = 0;
DeltaT = 0.001;
for i = 1 : 55000
    Frequ = EKoeff * exp(EExp * T);
    Argument = Argument + 2  pi  Frequ * DeltaT;
    Master(i,1) = T;
    Master(i,2) = Amp * sin(Argument);
    T = T + DeltaT;
end


Ich habe nur das Problem bei meiner Variante im Vergleich zu deiner 
nicht verstanden???
Deine Variante ändert ja das Argument der sin-Funktion auch in jedem 
Zeitschritt...

LG Mille
Gast
Hier sieht man noch das omega graphisch über der Zeit (durch 2*pi ergibt 
das schon die 25Hz) bei meiner Lösungsvariante...
Soll zeigen das das omega eigentlich passen sollte.

LG Mille
Angehängte Dateien:
Gast
Hallo,

ich benutze zur Erzeugung von Sweeps immer die Formel:
g(t) = sin(2*pi*Int(f_t)),

wobei f_t der Frequenzvektor mit der gewünschten Zunahmefunktion 
(linear, logarithmisch, e-Funktion, ...) ist. Somit spart man sich die 
Schleife.

Die Zeile "Argument = Argument + 2  pi  Frequ * DeltaT;" in der 
For-Schleife ist auch nichts anderes als eine Integralbildung.

LG nichtNick
Gast
Hallo Mille,

ja, dein Omega stimmt, habe ich nicht in Frage gestellt. Aber du darfst 
die Formel so nicht verwenden. Ich habe mal zur Veranschaulichung ein 
Bild angehängt. Darin rotiert ein Zeiger im Einheitskreis im 
Uhrzeigersinn. Links mit konstanter Frequenz. Im Beispiel wird der 
Zeiger pro Sample gerade um 30° weiter rotiert (von t1 über t2 nach t3).

Jetzt nimm an, die Frequenz wächst, so dass zwar t1 nach t2 30°, von t2 
nach t3 aber 45° rotiert werden muss. Du bekommst die richtige 
Darstellung wie im mittleren Bild.

In deiner Formel wird aber im Zeitpunkt 3 angenommen, dass das neue 
Omega für alle alten Zeitpunkte gegolten hat, also wird der Zeitpunkt t3 
berechnet, als ob immer 45° verschoben werden müssen, dein neuer Zeiger 
rotiert also von t2 zu t3 um 60°. Da dieser Fehler für jedes neue Sample 
passiert, rotiert dein Zeiger insgesamt zu schnell und du bekommst als 
Effekt zu hohe Frequenzen, selbst wenn dein Omega richtig berechnet ist!

@nichtNick: Danke für den Tip. Ja, mir war nicht aufgefallen, das meine 
diskrete Summe im Endeffekt das Integral ist. Wieder was gelernt.

Gerhard
Angehängte Dateien:
Gast
Danke Gerhard, jetzt habe ich meinen Fehler verstanden!

Nur eine Frage bleibt noch übrig:
Wieso bekomme ich mit meiner Formel genau die 4-fache Endfrequenz 
heraus?
Ist zwar nicht wichtig, interessiert mich aber trotzdem :-)

LG
Gast
Tja, da fällt mir auf Anhieb auch keine vernünftige Begründung ein. 
Müsste eigentlich an der Steigung der Frequenzsweeps liegen. Du kannst 
ja mal mit anderen Steigungen fon Omega über der Zeit die alte und die 
neue Methode vergleichen.

Gerhard

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.