Black D. schrieb:
> Deshalb meine Idee mit der Viertelkurve.
1 | //Sinussignal
|
2 | signed char S[400]=
|
Warum zum Geier nimmt man 400 Werte für einen Viertelsinus? Wenn einem
mal klar geworden ist, dass so ein binäres Konstrukt wie ein
Mikroprozessor viel besser mit binären Zahlen zurecht kommt, dann findet
man vorrangig Arraygrößen in Zweierpotenzen wie z.B. ... 32, 64, 128,
256, 512, ...
Und hier hätten 256 locker gereicht, denn selbst am Punkt mit der
stärksten Steigung hast du immer mindestens 2 Werte: 0,0,1,1,2,2,2, ...
Dass dann dein Ausgabewert natürlich auch nur bis 100 (bzw. 99) geht ist
natürlich auch dem Zehnfingersystem des Menschen zu verdanken. Ein
digitales Bauteil würde hier 127 als Obergrenze und damit einem
Wertebereich von -127..127 vorziehen (das mit -128 ist dann doch eher
für Fortgeschrittene).
Zum Code:
1 | if(l<400){
|
2 | m=m+1;
|
3 | }
|
4 |
|
5 | if(l>400 && l<800){
|
6 | m=m-1;
|
7 | }
|
Dir ist hoffentlich schon klar, dass m hier auch mal 400 werden wird,
dein Array aber nur Elemente von 0..399 hat?
Also 2 Schritte zur Lösung:
1. Ich würde hier über die Quadranten gehen (das tust du auch, aber eben
umständlich):
1 | int q=0;
|
2 | int idx=0;
|
3 |
|
4 | :
|
5 | :
|
6 |
|
7 |
|
8 | if (idx<399) { // Index schon am Ende des Viertelkreises angekommen?
|
9 | idx=++; // Nein: Index hochzählen
|
10 | }
|
11 | else { // ja: Viertelkreis fertig -->
|
12 | idx=0;
|
13 | if (q<3) q++; // nächsten Quadranten berechnen
|
14 | else q=0;
|
15 | }
|
16 |
|
17 | // Wert aus Array holen und Ausgabewert berechnen
|
18 | switch (q) {
|
19 | case 0: val = S[idx]; break;
|
20 | case 1: val = S[399-idx]; break;
|
21 | case 2: val = -S[idx]; break;
|
22 | case 3: val = -S[399-idx]; break;
|
23 | }
|
Und dann würde ich natürlich mit Zweierpotenzen reichen. Damit wird das
voll simpel:
1 | int q=0;
|
2 | int idx=0;
|
3 |
|
4 | //Sinussignal
|
5 | signed char S[256]= {0,1,2,2,3,... ...};
|
6 |
|
7 | :
|
8 | :
|
9 |
|
10 | // Index hochzählen, einfach immer weiter...
|
11 | idx=++;
|
12 |
|
13 | // den aktuellen Quadranten berechnen, der steckt in den Bits 8 und 9
|
14 | q = (idx>>8)&0x03; // --> diese beiden Bits auf q abbilden
|
15 |
|
16 | // Wert abhängig vom Quadranten aus Array holen und Ausgabewert berechnen
|
17 | switch (q) {
|
18 | case 0: val = S[idx]; break;
|
19 | case 1: val = S[255-idx]; break;
|
20 | case 2: val = -S[idx]; break;
|
21 | case 3: val = -S[255-idx]; break;
|
22 | }
|