www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP sinus sweep in matlab


Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte einen sweep programmieren, in matlab zur grafischen ausgabe.
Der Sinus sollte von 0Hz bis 10Hz gehen in der Zeit von 0-1s dann von
10Hz wieder auf 0 in der Zeit von 1-2s.

0-1s:

a(t) = sin(w*fs1*tn)

wobei fs1 ein array mit den werten von 0-10 ist,
tn die zeit zum punkt n.

funktioniert gut.

1-2s:
a(t) = sin(w*fs2*tn)

wobei fs2 ein array mit den werten von 10-0 ist. Das funktioniert
so jedoch nicht.

wie kann ich das am besten programmieren?

gruss tobias

Autor: Alex (Gast)
Datum:
Angehängte Dateien:
  • sweep.m (318 Bytes, 545 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Interessante Aufgabenstellung :)

Eine Idee:

Nimm eine beliebige Funktion die im gewünschten Zeitintervall zu Beginn 
einen niedrigen Anstieg hat, dann bei T/2 ihren maximalen Anstieg hat 
und am Ende des Intervalls wieder einen Anstieg von Null hat. Wenn du 
diese Funktion korrekt skalierst kannst du die von ihr generierten Werte 
als wt = 2*pi*f*t nutzen.

Nur die Frequenz als bspw. sin²(x) oder Dreieck zu ändern und mit einem 
Zeitvektor zu multiplizieren bringt wie du gemerkt hast ja nicht das 
gewünschte Ergebnis.

Alternativ bietet Matlab auch eine "chirp" Funktion, die kann aber auch 
nur in eine Richtung sweepen.


Gruß,
Alex

Autor: Hägar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müsste so in etwa gehen:
t=0:1e-3:1;
f0=0; f1=10;
y1=chirp(t,f0,1,f1);
y2=fliplr(y1);
y=[y1 y2];
plot(0:1e-3:2+1e-3, y);

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das verursacht aber höchstwahrscheinlich eine Unstetigkeit in der Mitte, 
oder?

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den zweiten Teil des Signals einfach spiegeln mit flip, wie Hägar das 
macht. Aber auf so kruden Voodoo bullshit wie 'chirp' würde ich nicht 
zurückgreifen.

Das ist ne linear ansteigende Winkelgeschwindigkeit des umlaufenden 
Zeigers von 0 bis 2*pi*10 rad/sec. Das aufintegriert liefert den 
Phasenwinkel, davon den Sinus, fertig ist die Laube.

fsample=8000; %Abtastfrequenz
dph=10*2*pi*(0:1/fsample:1);
ph=cumsum(dph);
signal=sin(ph);
signal=[signal fliplr(signal)];


gute Nacht
Detlef

Autor: Phil (Gast)
Datum:
Angehängte Dateien:
  • sweep.m (404 Bytes, 1015 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde es so lösen (siehe Anhang).
Die Idee dabei ist, dass man den Zeiger in der komplexen Ebene immer um 
2*pi*f(aktuell)*dt weiterdreht.
Der sweep ergibt sich dann aus dem Imaginärteil.

Gruß, Philipp

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.