mirror of
https://github.com/sjlongland/atinysynth.git
synced 2025-09-13 10:03:15 +10:00
I left this out because I thought the idea of modulus and division on a MCU that lacks a hardware multiplier would be too much for it… and indeed it was too much with my other project. Thinking about it this afternoon, I had an idea. If I have 2^N samples, then the modulus can be optimised to: ``` mod = sample & ((2**n)-1) ``` and the segment can be figured out by: ``` segment = sample >> n ``` The segment is two bits. A function that returns the scaled sine value for a given scaled angle can be given as: ``` int8_t fp_sine(uint8_t angle) { uint8_t segment = (angle >> POLY_SINE_SZ_BITS) & 3; uint8_t offset = angle & ((1 << POLY_SINE_SZ_BITS)-1); switch (segment) { case 0: return _poly_sine[offset]; case 1: return _poly_sine[ POLY_SINE_SZ - offset]; case 2: return -_poly_sine[offset]; case 3: return -_poly_sine[ POLY_SINE_SZ - offset]; } } ``` … or something like that. If `POLY_SINE_SZ_BITS=6`, then `angle=255` represents 360°.
9 lines
44 B
Plaintext
9 lines
44 B
Plaintext
.*.swp
|
|
*.swp
|
|
*.o
|
|
*.elf
|
|
*.hex
|
|
sine.c
|
|
obj
|
|
bin
|