Forum: Digitale Signalverarbeitung / DSP / Machine Learning sinus sweep in matlab


von tobias hofer (Gast)


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

von Alex (Gast)


Angehängte Dateien:

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

von Hägar (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

Das verursacht aber höchstwahrscheinlich eine Unstetigkeit in der Mitte, 
oder?

von Detlef _. (detlef_a)


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

von Phil (Gast)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.