Zeitdiskreter Sinus mit wählbarer Signal- & Abtastfreqen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ilja
User
Beiträge: 9
Registriert: Sonntag 23. Oktober 2005, 12:55

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ilja
User
Beiträge: 9
Registriert: Sonntag 23. Oktober 2005, 12:55

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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  )
        )
    )
Zuletzt geändert von jens am Donnerstag 15. Dezember 2005, 20:34, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ilja
User
Beiträge: 9
Registriert: Sonntag 23. Oktober 2005, 12:55

Ja? Wie sollte ich sie stattdessen wählen?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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)
ilja
User
Beiträge: 9
Registriert: Sonntag 23. Oktober 2005, 12:55

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...
ilja
User
Beiträge: 9
Registriert: Sonntag 23. Oktober 2005, 12:55

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.
Antworten