Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
LUTs/LUTS.cpp@10:258a1eca02cc, 2020-05-06 (annotated)
- Committer:
- lukeocarwright
- Date:
- Wed May 06 19:51:22 2020 +0000
- Revision:
- 10:258a1eca02cc
- Parent:
- 9:f6ba53e355a0
- Child:
- 11:6ae098535da9
Added Triangle/saw LUT with debug test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lukeocarwright | 7:33cb5f2db1ee | 1 | #include "mbed.h" |
lukeocarwright | 7:33cb5f2db1ee | 2 | #include "LUTs.h" |
lukeocarwright | 7:33cb5f2db1ee | 3 | |
lukeocarwright | 7:33cb5f2db1ee | 4 | LUTs::LUTs() |
lukeocarwright | 7:33cb5f2db1ee | 5 | { |
lukeocarwright | 7:33cb5f2db1ee | 6 | } |
lukeocarwright | 7:33cb5f2db1ee | 7 | LUTs::~LUTs() |
lukeocarwright | 7:33cb5f2db1ee | 8 | { |
lukeocarwright | 7:33cb5f2db1ee | 9 | } |
lukeocarwright | 10:258a1eca02cc | 10 | volatile uint16_t sin_wavtable[1024]; |
lukeocarwright | 10:258a1eca02cc | 11 | volatile uint16_t tri_wavtable[1024]; |
lukeocarwright | 10:258a1eca02cc | 12 | |
lukeocarwright | 10:258a1eca02cc | 13 | |
lukeocarwright | 10:258a1eca02cc | 14 | void LUTs::initial_wavetables() |
lukeocarwright | 10:258a1eca02cc | 15 | { |
lukeocarwright | 10:258a1eca02cc | 16 | sin_wavetable(); |
lukeocarwright | 10:258a1eca02cc | 17 | tri_wavetable(50); |
lukeocarwright | 10:258a1eca02cc | 18 | } |
lukeocarwright | 7:33cb5f2db1ee | 19 | |
lukeocarwright | 7:33cb5f2db1ee | 20 | void LUTs::sin_wavetable() |
lukeocarwright | 7:33cb5f2db1ee | 21 | { |
lukeocarwright | 10:258a1eca02cc | 22 | printf("Generating sin Wavetable \n"); |
lukeocarwright | 9:f6ba53e355a0 | 23 | for (int i=0; i<1024; i++) { |
lukeocarwright | 9:f6ba53e355a0 | 24 | sin_d= 65535*(0.5*sin(2.0*PI*(i/1024.0))+0.5); |
lukeocarwright | 9:f6ba53e355a0 | 25 | //calculates remainder for rounding |
lukeocarwright | 9:f6ba53e355a0 | 26 | rem= fmod(sin_d,1); |
lukeocarwright | 9:f6ba53e355a0 | 27 | //printf("preround= %g -", sin_d); //DEBUG |
lukeocarwright | 9:f6ba53e355a0 | 28 | if (rem>=0.5) { |
lukeocarwright | 9:f6ba53e355a0 | 29 | sin_d=ceil(sin_d); //round UP |
lukeocarwright | 9:f6ba53e355a0 | 30 | } else { |
lukeocarwright | 9:f6ba53e355a0 | 31 | sin_d= floor(sin_d-rem); //round DOWN |
lukeocarwright | 9:f6ba53e355a0 | 32 | } |
lukeocarwright | 10:258a1eca02cc | 33 | // printf("Postround= %g -",sin_d); //DEBUG |
lukeocarwright | 9:f6ba53e355a0 | 34 | sin_u=((uint16_t)sin_d); |
lukeocarwright | 9:f6ba53e355a0 | 35 | //printf("sin_u= %u \n", sin_u); |
lukeocarwright | 9:f6ba53e355a0 | 36 | sin_wavtable[i]=sin_u; |
lukeocarwright | 9:f6ba53e355a0 | 37 | //sin_wavtable[i]=get_sin(i); |
lukeocarwright | 9:f6ba53e355a0 | 38 | } |
lukeocarwright | 10:258a1eca02cc | 39 | /*//DEBUG |
lukeocarwright | 9:f6ba53e355a0 | 40 | for (int i=0; i<1024; i=i+128) { |
lukeocarwright | 9:f6ba53e355a0 | 41 | printf("sin_wav[%d]= %u \n", i, sin_wavtable); |
lukeocarwright | 7:33cb5f2db1ee | 42 | } |
lukeocarwright | 9:f6ba53e355a0 | 43 | */ |
lukeocarwright | 9:f6ba53e355a0 | 44 | } |
lukeocarwright | 9:f6ba53e355a0 | 45 | |
lukeocarwright | 10:258a1eca02cc | 46 | void LUTs::tri_wavetable(int pulsewidth) |
lukeocarwright | 10:258a1eca02cc | 47 | { |
lukeocarwright | 10:258a1eca02cc | 48 | printf("Generating Tri-wavetable\n"); |
lukeocarwright | 10:258a1eca02cc | 49 | tri_wavtable[0]=0; |
lukeocarwright | 10:258a1eca02cc | 50 | rise_t=(pulsewidth*1024/100); |
lukeocarwright | 10:258a1eca02cc | 51 | fall_t=1-rise_t; |
lukeocarwright | 10:258a1eca02cc | 52 | dif=65536/rise_t; |
lukeocarwright | 10:258a1eca02cc | 53 | dif_u=(uint16_t)dif; |
lukeocarwright | 10:258a1eca02cc | 54 | for (int i=1; i<rise_t; i++) { |
lukeocarwright | 10:258a1eca02cc | 55 | tri_wavtable[i]=tri_wavtable[i-1]+dif_u; |
lukeocarwright | 10:258a1eca02cc | 56 | } |
lukeocarwright | 10:258a1eca02cc | 57 | dif=65536/fall_t; |
lukeocarwright | 10:258a1eca02cc | 58 | dif_u=(uint16_t)dif; |
lukeocarwright | 10:258a1eca02cc | 59 | for (int i=rise_t; i<1024; i++) { |
lukeocarwright | 10:258a1eca02cc | 60 | tri_wavtable[i]=tri_wavtable[i-1]-dif_u; |
lukeocarwright | 10:258a1eca02cc | 61 | } |
lukeocarwright | 10:258a1eca02cc | 62 | } |
lukeocarwright | 9:f6ba53e355a0 | 63 | |
lukeocarwright | 9:f6ba53e355a0 | 64 | |
lukeocarwright | 9:f6ba53e355a0 | 65 | /* |
lukeocarwright | 9:f6ba53e355a0 | 66 | uint16_t get_sin(int i) |
lukeocarwright | 9:f6ba53e355a0 | 67 | { |
lukeocarwright | 9:f6ba53e355a0 | 68 | //calculates sin val as double (0->65535) |
lukeocarwright | 9:f6ba53e355a0 | 69 | |
lukeocarwright | 9:f6ba53e355a0 | 70 | sin_d= 65535*(0.5*sin(2.0*PI*(i/1024.0))+0.5); |
lukeocarwright | 9:f6ba53e355a0 | 71 | //calculates remainder for rounding |
lukeocarwright | 9:f6ba53e355a0 | 72 | rem= fmod(sin_d,1); |
lukeocarwright | 9:f6ba53e355a0 | 73 | //printf("preround= %g -", sin_d[i]); //DEBUG |
lukeocarwright | 9:f6ba53e355a0 | 74 | if (rem>=0.5) { |
lukeocarwright | 9:f6ba53e355a0 | 75 | sin_d=ceil(sin_d); //round UP |
lukeocarwright | 9:f6ba53e355a0 | 76 | } else { |
lukeocarwright | 9:f6ba53e355a0 | 77 | sin_d= floor(sin_d-rem); //round DOWN |
lukeocarwright | 9:f6ba53e355a0 | 78 | } |
lukeocarwright | 9:f6ba53e355a0 | 79 | //printf("Postround= %g -",sin_d[i]); //DEBUG |
lukeocarwright | 9:f6ba53e355a0 | 80 | return((uint16_t)sin_d); |
lukeocarwright | 9:f6ba53e355a0 | 81 | |
lukeocarwright | 9:f6ba53e355a0 | 82 | //summed into one function |
lukeocarwright | 9:f6ba53e355a0 | 83 | return((uint16_t)floor(65535*(0.5*sin(2.0*PI*(i/1024.0))+0.5))); |
lukeocarwright | 9:f6ba53e355a0 | 84 | } |
lukeocarwright | 9:f6ba53e355a0 | 85 | */ |