Seite 1 von 1

Zeitdiskreter Sinus mit wählbarer Signal- & Abtastfreqen

Verfasst: Donnerstag 15. Dezember 2005, 17:47
von ilja
Hallo!

Ich versuche einen zeitdiskreten Sinus zu mit frei wählbaren Signal- und Abtastfrequenzen zu berechnen.
Mit Hilfe von gnuplot lasse ich mir das ganze dann dar stellen.

Was ich bisher geschrieben hab ist:

Code: Alles auswählen

f_sig = 1.0                    # Signal frequency in Hz 
f_smp = 10.0                # sample rate in Hz

T_sig = 1.0/f_sig                # Periodendauer in s
T_smp = 1.0/f_smp               # Abtastintervall in s

for i in range (10):
    print i * T_smp , ' ' , sin(radians( 2 * pi * f_sig * i * T_smp  ) )
Also, ich habe eine Abtastfrequenz von 10 Hz, das sind 10 Werte in der Sekunde. Der Sinus hat eine Frequenz von 1 Hz, also genau eine Periodendauer in der Sekunde.
Wenn ich mir jetzt die ersten 10 Abtastwerte anschaue, sollte genau ein Sinusverlauf zu sehen sein. Zu sehen ist aber folgendes:
http://www2.inf.fh-bonn-rhein-sieg.de/~ ... _Werte.pdf

Wenn man sich die ersten 1000 Abtastwerte anschaut, also

Code: Alles auswählen

for i in range (1000):
    print i * T_smp , ' ' , sin(radians( 2 * pi * f_sig * i * T_smp  ) )
sieht man mal ein bisschen weniger als zwei Sinusdurchläufe...
http://www2.inf.fh-bonn-rhein-sieg.de/~ ... _Werte.pdf

Wo ist der Fehler?

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Donnerstag 15. Dezember 2005, 19:55
von jens
Bei dem 10er Variante zählst du i von 0 bis 10 hoch... In der 1000er Variante von 0 bis 1000... Ich denke damit erhöchst du nicht die Abtastrate (also Werte pro Zeiteinheit) sondern ehr den gesammtbereich...

Müßtest du nicht ehr die Schrittweite bzw die Werte pro Zeiteinheit variieren???

Verfasst: Donnerstag 15. Dezember 2005, 20:17
von ilja
Ne ne, die Abtastrate soll dabei nicht verändert werden. In der Variablen f_smp wird sie erstmal eingestellt und soll dann konstant bleiben.

Ich hab mir das so gedacht:
Die Variable T_smp enthält das Abtastintervall (oder Schrittweite), z.B. 0,1 Sekunden und nach 10 Abtastintervallen (also bei i = 10) ist dann genau eine Sekunde vergangen. Wenn der Sinus nun die Frequenz von 1Hz hat, müsste man dann eigentlich genau eine ganze Schwingung von ihm sehen...
Irgendwas mache ich falsch. Vielleicht die Formel?

Verfasst: Donnerstag 15. Dezember 2005, 20:24
von jens
ilja hat geschrieben:Die Variable T_smp enthält das Abtastintervall (oder Schrittweite), z.B. 0,1 Sekunden und nach 10 Abtastintervallen (also bei i = 10) ist dann genau eine Sekunde vergangen. Wenn der Sinus nun die Frequenz von 1Hz hat, müsste man dann eigentlich genau eine ganze Schwingung von ihm sehen...
Das hört sich absolut korrekt an...

Aber die Werte in deinem ersten Beitrag sehen komisch aus, besonders f_smp...

EDIT: Also ich hab ein wenig mit den Werten gespielt... ich blick da nicht durch...

Ich hab mal deine Sourcen leicht modifiziert:

Code: Alles auswählen

import math

f_sig = 1.0                     # Signal frequency in Hz
f_smp = 10.0                # sample rate in Hz

T_sig = 1.0/f_sig           # Periodendauer in s
T_smp = 1.0/f_smp       # Abtastintervall in s

for i in range (30):
    print "%5s %.3f" % (
        i * T_smp ,
        math.sin(
            math.radians( 2 * math.pi * f_sig * i * T_smp  )
        )
    )

Verfasst: Donnerstag 15. Dezember 2005, 20:31
von ilja
Ja? Wie sollte ich sie stattdessen wählen?

Re: Zeitdiskreter Sinus mit wählbarer Signal- & Abtastfr

Verfasst: Donnerstag 15. Dezember 2005, 22:56
von Joghurt
ilja hat geschrieben:radians( 2 * pi * f_sig * i * T_smp )
Du gibst den Wert doch schon in Radians und nicht in Grad an! Also

Code: Alles auswählen

sin(2*pi*f_sig*i*T_smp)
Radians brauchst du, wenn du z.B. sin(200°) haben willst:

Code: Alles auswählen

sin(radians(200))
Oder, äquivalent (was anderes macht radians auch nicht)

Code: Alles auswählen

sin(200. / 180 * pi)
(eigentlich /360 * 2 * pi, aber das kürzt sich ja raus)

Verfasst: Freitag 16. Dezember 2005, 08:22
von ilja
Danke für die Antwort. Hatte ich auch schon ausprobiert.
Hab aber nochmal den code geändert:

Code: Alles auswählen

for i in range (1000):
    print i * T_smp , ' ' , sin(2 * pi * f_sig * i * T_smp )
Und das Ergebnis davon ist folgendes:
http://www2.inf.fh-bonn-rhein-sieg.de/~ ... _Werte.pdf
..irgendwas ganz komisches...

Verfasst: Sonntag 18. Dezember 2005, 17:40
von ilja
Hey Leute,

der letzte Tip war richtg! Man müsste nur noch schlau genug sein, die Ausgaben, die man so fabriziert, auch richtig lesen zu können. :oops:

Dankeschön :wink: Jetzt funktionierts.