Le problème principal du PO est de générer l'index pour la consultation de la table.
Le code de l'OP tente d'accéder à un tableau extérieur sine_table[40]
conduisant à comportement indéfini . Réparez au moins ça.
const int sine_table[40] = {0, 5125, 10125, ...
...
x1 = (int) phase % 41; // -40 <= x1 <= 40
x2 = x1 + 1; // -39 <= x2 <= 41
y = (sine_table[x2] - sine_table[x1])*... // bad code, consider x1 = 40 or x2 = 40,41
Modification suggérée
x1 = (int) phase % 40; // mod 40, not 41
if (x1 < 0) x1 += 40; // Handle negative values
x2 = (x1 + 1) % 40; // Handle wrap-around
y = (sine_table[x2] - sine_table[x1])*...
Il existe de bien meilleures approches, mais pour se concentrer sur la méthode du PO, voir ci-dessous.
#include <math.h>
#include <stdio.h>
const int sine_table[40] = { 0, 5125, 10125, 14876, 19260, 23170, 26509, 29196,
31163, 32364, 32767, 32364, 31163, 29196, 26509, 23170, 19260, 14876, 10125,
5125, 0, -5126, -10126, -14877, -19261, -23171, -26510, -29197, -31164, -32365,
-32768, -32365, -31164, -29197, -26510, -23171, -19261, -14877, -10126, -5126 };
int i = 0;
int x1 = 0;
int x2 = 0;
float y = 0;
float sin1(float phase) {
x1 = (int) phase % 40;
if (x1 < 0) x1 += 40;
x2 = (x1 + 1) % 40;
y = (sine_table[x2] - sine_table[x1])
* ((float) ((int) (40 * 0.001 * i * 100) % 4100) / 100 - x1)
+ sine_table[x1];
return y;
}
int main(void) {
double pi = 3.1415926535897932384626433832795;
for (int j = 0; j < 1000; j++) {
float x = 40 * 0.001 * i;
float radians = x * 2 * pi / 40;
printf("%f %f %f\n", x, sin1(x) / 32768, sin(radians));
i = i + 1;
}
}
Sortie
OP's Reference sin()
0.000000 0.000000 0.000000
0.040000 0.006256 0.006283
0.080000 0.012512 0.012566
...
1.960000 0.301361 0.303035
2.000000 0.308990 0.309017
2.040000 0.314790 0.314987
...
39.880001 -0.020336 -0.018848
39.919998 -0.014079 -0.012567
39.959999 -0.006257 -0.006283
Un meilleur code ne passerait pas les valeurs i, x1, x2, y
comme variables globales, mais comme paramètres de fonction ou variables de fonction. Peut-être est-ce un artefact du débogage de l'OP.
Quelqu'un a-t-il une meilleure idée pour implémenter un générateur de sinus en C ?
C'est assez large. Meilleur en termes de vitesse, de précision, d'espace de code, de portabilité ou de maintenabilité ? sine()
sont faciles à réaliser. Celles de haute qualité demandent plus d'efforts.
Bien que floue, l'utilisation par le PO d'une petite table de consultation est un bon début - même si je vois que cela peut être fait sans aucune mathématique à virgule flottante. Je recommande à l'OP de construire une solution testée et fonctionnelle et de la poster dans le forum de l'UE. Examen du code pour des idées d'amélioration.
0 votes
Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .