Interessanter Sketch.

Hier ein Sketch zum Ausprobieren.

int x;
int y;
int i;

void setup() 
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  y = 32000;
  x = 0;

}

void loop() 
{
  // put your main code here, to run repeatedly:

  y = y - x / 4000;
  x = x + y / 4000;
  ++i;

  if (i % 100 == 0)
  {
   Serial.println(x);
  }
  
  }

Ladet es auf einem leeren Arduino, schaut Euch den Ausgang im Serial Plotter und staunt.

Die Erfahrene können mal vorab raten, was herauskommt...

Was soll das?

Hi

Eine lustige Graphik auf den X/Y-Plotter werfen - erinnert mich etwas an gaaanz alte Basic-Zeiten auf dem Schneider CPC :=)

MfG

uwefed:
Was soll das?

Hast du es ausprobiert, Uwe?

Es zeigt vor, dass man keine komplizierte Mathematik braucht, um mit ganz wenige Anweisungen iterativ ein Sinus am Arduino zu berechnen.
Wenn ich nur an solche "optimierte" Lösungen denke, die mit Lookuptabellen oder ähnliches herumfuchteln, kann ich nur schmunzeln.

RIN67630:
Es zeigt vor, dass man keine komplizierte Mathematik braucht, um mit ganz wenige Anweisungen iterativ ein Sinus am Arduino zu berechnen.

ich hab es nicht ausprobiert, aber es ist sicher kein Sinus, sondern ein - vermutlich hübscher - Effekt deiner int - Überläufe. Man braucht komplizierte Mathematik, wenn man das für ein etwas anderes Ergebnis gezielt modifizieren will, rate ich mal.
Wenn das eine Sinus Kurve zeigt, dann zeig mal eine Sinuskurve mit 1/3 Frequenz. Dann schau ich es mir genauer an 8)

michael_x:
ich hab es nicht ausprobiert, aber es ist sicher kein Sinus, sondern ein - vermutlich hübscher - Effekt deiner int - Überläufe.
Man braucht komplizierte Mathematik, wenn man das für ein etwas anderes Ergebnis gezielt modifizieren will, rate ich mal.
Wenn das eine Sinus Kurve zeigt, dann zeig mal eine Sinuskurve mit 1/3 Frequenz. Dann schau ich es mir genauer an 8)

Was macht dich so sicher, dass es kein Sinus ist?
Probiere es aus! *

Warum mathematisch x ein Sinus und y ein Cosinus sein müssen, lässt sich auch ganz leicht erklären...
Sucht mal die Lösung :stuck_out_tongue:

*1/3 der Frequenz ist leicht zu realisieren:
y = y - x / 12000;
x = x + y / 12000;

Sucht mal die Lösung

OK, versprochen ist versprochen.

Danke dafür.

Ok, sieht nach sinus-Kurve aus!

Den Zusammenhang mit der Super-String-Theorie hab ich leider nicht verifizieren können. :slight_smile:


wenn dir das als Annäherung an eine Sinuskurve genügt

Und hat schon mit der Annäherung an sin / cos zu tun, zugegeben.


Auch wenn man nicht nur jeden 100. Wert plottet, sieht es gut aus :slight_smile: Hier jeder Wert, x/50

michael_x:
...und hat schon mit der Annäherung an sin / cos zu tun, zugegeben...

wenn die Divisorzahl groß genug ist, ist die Sinuskurve wenn man jeden Wert plottet, praktisch perfekt.

Die Frage ist: warum kommt eine Sinusoide heraus?

Diese Frage konnten schon ein Paar mir bekannten Mathe-Lehrer nicht beantworten.
Die Antwort ist aber verblüffend einfach (in 2 Sätze), ganz ohne Superstrings oder fractale Räume!

Wer nimmt die Herausforderung an?

P.S. Mittlerweile bin ich schon dabei, eine Applikation für die Wintertage zu schreiben:

3 bis 4 solchen Sinusoide mit ausgewählten Frequenzen, davon 4 Kombinationen+Offset auf die PCM Ausgänge des Arduinos und schon hat man einen Tannenbaum, der sanfter und schöner funzelt.
Wenn Weihnachten vorbei ist, kommen die Lämpchen als feinstaubfreier Kaminsimulator zum Einsatz.

Wenn der Divisor zu groß ist, wird deine Kurve wegen Integer-Arithmetik viel zu eckig.

Zum Plotten von int16_t Daten ist ein Divisor von 100 bei einem Wertebereich von 10000 viel glatter.
Solltest auch nicht nur jeden hundertsten Wert ausgeben...

Viel Spass noch

michael_x:
Wenn der Divisor zu groß ist, wird deine Kurve wegen Integer-Arithmetik viel zu eckig.

Zum Plotten von int16_t Daten ist ein Divisor von 100 bei einem Wertebereich von 10000 viel glatter.
Solltest auch nicht nur jeden hundertsten Wert ausgeben...

Viel Spass noch

Stimmt!
Ideal sollte divisor 512 sein. Konnte man sogar mit einem bitshift noch schneller machen.
Da steigt die Performance noch einmal deutlich!

RIN67630:
Da steigt die Performance noch einmal deutlich!

Das wird dir schon der Compiler machen. /256 oder >> 8 ist dasselbe.

michael_x:
Das wird dir schon der Compiler machen. /256 oder >> 8 ist dasselbe.

Danke, ich wußte nicht, dass der so schlau ist.

Die Berechnung am UNO sollte schon viel schneller, als die Möglichkeit den Ergebnis zu visualisieren sein.
Ein SPI basierter DAC mit dem aufwendigen Protokollhandling herum dürfte auch langsamer, als die Berechnung sein.

Ein direkangetriebenes DAC, wäre besser. Der DAC vom DUE dürfte 1MHz erreichen

Ich werde mir mal einen bestellen und sehen, wie schnell man damit gehen kann.

RIN67630:
Die Frage ist: warum kommt eine Sinusoide heraus?

Diese Frage konnten schon ein Paar mir bekannten Mathe-Lehrer nicht beantworten.
Die Antwort ist aber verblüffend einfach (in 2 Sätze), ganz ohne Superstrings oder fractale Räume!

Wer nimmt die Herausforderung an?

Es liegt daran, dass die Ableitung des Cosinus minus Sinus ist und vom Sinus plus Cosinus. Von Schritt zu Schritt addiert man jeweils die Ableitung mal eine Schrittweite dphi=1/4000 hinzu.

y=y-x/4000 kann man in

cos( phin+1 )= cos( phin )- sin( phin )/4000

f ( phin+1 )=f ( phin )+f´( phin )*dphi
übersetzen.

Theseus:
Es liegt daran, dass die Ableitung des Cosinus minus Sinus ist und vom Sinus plus Cosinus. Von Schritt zu Schritt addiert man jeweils die Ableitung mal eine Schrittweite dphi=1/4000 hinzu.

y=y-x/4000 kann man in

cos( phin+1 )= cos( phin )- sin( phin )/4000

f ( phin+1 )=f ( phin )+f´( phin )*dphi
übersetzen.

Die Erklärung ist etwas konfus. Es geht leichter:

In einer Schleife bilden y = y - x/n und x = x - y/n jeweils eine Integralfunktion.

Es gibt nur eine Lösung für das Gleichungssystem.
Nur sinus und cosinus sind sich gegenseitig Integral.

Es gibt nur eine Lösung für das Gleichungssystem.
Nur sinus und cosinus sind sich gegenseitig Integral.

Ich sehe kein Gleichungssystem mit einer Lösung. Du hast zwei Wertzuweisungen, die du in einer Schleife durchläufst. (Numerische Integration)

Da du eine numerische Annäherung an Sinus und Cosinus machst, und das Ganze gutmütig ist, siehst du tatsächlich solche sehr (oder auch weniger) ähnlichen Kurven.

michael_x:
...Da du eine numerische Annäherung an Sinus und Cosinus machst, und das Ganze gutmütig ist, siehst du tatsächlich solche sehr (oder auch weniger) ähnlichen Kurven.

Du darfst gern, statt dem Plotten, die Werte ausdrücken und mit den mathematischen genauen Sinus/Cosinus Werte z.B. in Excel vergleichen. Das habe ich gemacht.

Ich konnte z.B. bei Anfangs y=10000 und n= 57 (ergibt ziemlich genau 1° Schritte) keine Abweichungen größer als 0,19% (im Bereich 45°) feststellen.

Wer mathematische Genauigkeit braucht, kann immer noch auf Gleitpunktarithmetik umschalten, auf Kosten der Geschwindigkeit, natürlich.

Was istnbei dir?
Ein Fehler kommt durch die Integer-Division ( /4000 in deinem ersten Post )

10000/128 = 78.125 oder hier 78, also ein Fehler von 0.125 / 78, also etwa 0.15 % :wink:
Der Vorteil ist auch, dass der Wertebereich immer +- MAX bleibt, und die aktuelle Frequenz nicht sehr von der theoretischen abweicht. Diesen Fehler könntest du wohl nach einigen Schwingungen eher sehen.

Viel Spass.

"Was will man mehr"
Richtig !

michael_x:
Was istnbei dir?

n war der divisor.

hier nochmal die Tabelle:

Schritt	Arduino		Winkel in °	Sinus Arduino	Sinus Excel	Abweichung
1	175		1	0,0175	0,017452406	0,00%
2	350		2	0,035	        0,034899497	-0,01%
3	525		3	0,0525	0,052335956	-0,02%
4	700		4	0,07	        0,069756474	-0,02%
5	874		5	0,0874	0,087155743	-0,02%
6	1048		6	0,1048	0,104528463	-0,03%
7	1222		7	0,1222	0,121869343	-0,03%
8	1395		8	0,1395	0,139173101	-0,03%
9	1568		9	0,1568	0,156434465	-0,04%
10	1741		10	0,1741	0,173648178	-0,05%
11	1913		11	0,1913	0,190808995	-0,05%
12	2084		12	0,2084	0,207911691	-0,05%
13	2255		13	0,2255	0,224951054	-0,05%
14	2425		14	0,2425	0,241921896	-0,06%
15	2594		15	0,2594	0,258819045	-0,06%
16	2763		16	0,2763	0,275637356	-0,07%
17	2931		17	0,2931	0,292371705	-0,07%
18	3098		18	0,3098	0,309016994	-0,08%
19	3264		19	0,3264	0,325568154	-0,08%
20	3429		20	0,3429	0,342020143	-0,09%
21	3593		21	0,3593	0,35836795	-0,09%
22	3756		22	0,3756	0,374606593	-0,10%
23	3918		23	0,3918	0,390731128	-0,11%
24	4078		24	0,4078	0,406736643	-0,11%
25	4237		25	0,4237	0,422618262	-0,11%
26	4395		26	0,4395	0,438371147	-0,11%
27	4552		27	0,4552	0,4539905	        -0,12%
28	4707		28	0,4707	0,469471563	-0,12%
29	4861		29	0,4861	0,48480962	        -0,13%
30	5013		30	0,5013	0,5	                -0,13%
31	5164		31	0,5164	0,515038075	-0,14%
32	5313		32	0,5313	0,529919264	-0,14%
33	5461		33	0,5461	0,544639035	-0,15%
34	5607		34	0,5607	0,559192903	-0,15%
35	5751		35	0,5751	0,573576436	-0,15%
36	5893		36	0,5893	0,587785252	-0,15%
37	6034		37	0,6034	0,601815023	-0,16%
38	6173		38	0,6173	0,615661475	-0,16%
39	6310		39	0,631	        0,629320391	-0,17%
40	6445		40	0,6445	0,64278761	        -0,17%
41	6578		41	0,6578	0,656059029	-0,17%
42	6709		42	0,6709	0,669130606	-0,18%
43	6838		43	0,6838	0,68199836	        -0,18%
44	6965		44	0,6965	0,69465837	        -0,18%
45	7090		45	0,709	        0,707106781	-0,19%
46	7212		46	0,7212	0,7193398	        -0,19%
47	7332		47	0,7332	0,731353702	-0,18%
48	7450		48	0,745	        0,743144825	-0,19%
49	7566		49	0,7566	0,75470958	        -0,19%
50	7679		50	0,7679	0,766044443	-0,19%
51	7790		51	0,779	        0,777145961	-0,19%
52	7899		52	0,7899	0,788010754	-0,19%
53	8005		53	0,8005	0,79863551	        -0,19%
54	8109		54	0,8109	0,809016994	-0,19%
55	8210		55	0,821	        0,819152044	-0,18%
56	8309		56	0,8309	0,829037573	-0,19%
57	8405		57	0,8405	0,838670568	-0,18%
58	8499		58	0,8499	0,848048096	-0,19%
59	8590		59	0,859	        0,857167301	-0,18%
60	8678		60	0,8678	0,866025404	-0,18%
61	8764		61	0,8764	0,874619707	-0,18%
62	8847		62	0,8847	0,882947593	-0,18%
63	8927		63	0,8927	0,891006524	-0,17%
64	9005		64	0,9005	0,898794046	-0,17%
65	9080		65	0,908	        0,906307787	-0,17%
66	9152		66	0,9152	0,913545458	-0,17%
67	9221		67	0,9221	0,920504853	-0,16%
68	9287		68	0,9287	0,927183855	-0,15%
69	9351		69	0,9351	0,933580426	-0,15%
70	9412		70	0,9412	0,939692621	-0,15%
71	9470		71	0,947	        0,945518576	-0,15%
72	9525		72	0,9525	0,951056516	-0,14%
73	9577		73	0,9577	0,956304756	-0,14%
74	9626		74	0,9626	0,961261696	-0,13%
75	9672		75	0,9672	0,965925826	-0,13%
76	9715		76	0,9715	0,970295726	-0,12%
77	9755		77	0,9755	0,974370065	-0,11%
78	9792		78	0,9792	0,978147601	-0,11%
79	9826		79	0,9826	0,981627183	-0,10%
80	9857		80	0,9857	0,984807753	-0,09%
81	9885		81	0,9885	0,987688341	-0,08%
82	9910		82	0,991	        0,990268069	-0,07%
83	9932		83	0,9932	0,992546152	-0,07%
84	9951		84	0,9951	0,994521895	-0,06%
85	9967		85	0,9967	0,996194698	-0,05%
86	9980		86	0,998	        0,99756405	        -0,04%
87	9990		87	0,999	        0,998629535	-0,04%
88	9997		88	0,9997	0,999390827	-0,03%
89	10001	89	1,0001	0,999847695	-0,03%
90	10002	90	1,0002	1	                -0,02%