2016-07-08 8 views
0

Es wird versucht, eine 2Hz Rechteckwelle mit 4Hz zu zeichnen (siehe folgende Abbildung). Warum bin ich nicht eine Gleichförmigkeit für Probe eingekreist rot wird die IMO bei -1 durch zweiten roten Pfeil markiert werden soll:Falsche Rechteckwellenabtastung mit scipy

enter image description here

Hier ist mein Python-Code (unter der Annahme ipython Shell und importiert numpy (als np) , scipy (Signal) und matplotlib (PLT))

t4 = np.linspace(0,4,16,endpoint=False) 
s2t4 = signal.square(2.0*np.pi*2.0*t4) 
t500 = np.linspace(0,4,500,endpoint=False) 
s2t500 = signal.square(2*np.pi*2*t500) 
plt.ylim(-2,2); plt.plot(t500,s2t500,'k',t4,s2t4,'b',t4,s2t4,'bo'); plt.show() 
+1

Meine Schätzung wäre Gleitkommafehler. Der Punkt, den Sie eingekreist haben, ist wahrscheinlich sehr geringfügig kleiner als 2,75, also ist der Wert 1. Der einfachste Weg, dies zu beheben, wäre, Ihre dreieckige Welle an den Mittelpunkten der Rechteckwelle und nicht an den Ecken zu messen. –

Antwort

4

, dass wegen der normalen Gleitkomma-Ungenauigkeit ist. Sie versuchen, die Rechteckwelle genau an den Punkten abzutasten, an denen die Sprünge stattfinden. Dies wird empfindlich auf die Ungenauigkeit von Fließkommazahlen reagieren.

Der eingekreiste Wert ist s2t4[11] und t4[11] ist 2,75. Werfen Sie einen Blick:

In [15]: signal.square(2.0*np.pi*2.0*t4[11]) 
Out[15]: array(1.0) 

eine winzige Menge auf das Argument hinzufügen, und das Ergebnis -1:

In [16]: signal.square(2.0*np.pi*2.0*t4[11] + 1e-14) 
Out[16]: array(-1.0) 

Wenn Sie verschieben t4 so sind die Proben von den Diskontinuitäten, sollte es funktionieren.