XBert
06.01.2010, 21:47
Hi,
ich hab mich mal zur berechnung des cos/sin an das folgende tutorial gehalten und
würde jetzt gerne wissen wie ich mit der selben tabelle die inversen funktionen (arcus sinus reicht da ja acos=90°-asin) dazu berechne.
Hier das Tutorial: http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)
und hier mein Versuch:
int16_t linasin(int16_t input)
{
uint8_t neg = input<0?1:0;
input &= ~(1 << 15); //=abs()
for (uint8_t i = 0; i < 91; i++) {
if (input >= linsin_tab[i] && input < linsin_tab[i +1]) {
uint16_t data0 = linsin_tab[i+1] - linsin_tab[i];
uint16_t data1 = input - linsin_tab[i];
int16_t res = i * 256 + 256 * data1 / data0;
return neg ? -res :res;
}
}
}
MFG XBert
ich hab mich mal zur berechnung des cos/sin an das folgende tutorial gehalten und
würde jetzt gerne wissen wie ich mit der selben tabelle die inversen funktionen (arcus sinus reicht da ja acos=90°-asin) dazu berechne.
Hier das Tutorial: http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)
und hier mein Versuch:
int16_t linasin(int16_t input)
{
uint8_t neg = input<0?1:0;
input &= ~(1 << 15); //=abs()
for (uint8_t i = 0; i < 91; i++) {
if (input >= linsin_tab[i] && input < linsin_tab[i +1]) {
uint16_t data0 = linsin_tab[i+1] - linsin_tab[i];
uint16_t data1 = input - linsin_tab[i];
int16_t res = i * 256 + 256 * data1 / data0;
return neg ? -res :res;
}
}
}
MFG XBert