#include #define TABLE_SIZE 1024 #define SAMPLE_RATE 44100 #define FREQ_SIZE 8 #define TABLE {\ 00, 201, 402, 603, 804, \ 1005, 1206, 1406, 1607, 1808, \ 2009, 2209, 2410, 2610, 2811, \ 3011, 3211, 3411, 3611, 3811, \ 4011, 4210, 4409, 4608, 4807, \ 5006, 5205, 5403, 5601, 5799, \ 5997, 6195, 6392, 6589, 6786, \ 6982, 7179, 7375, 7571, 7766, \ 7961, 8156, 8351, 8545, 8739, \ 8932, 9126, 9319, 9511, 9703, \ 9895, 10087, 10278, 10469, 10659, \ 10849, 11038, 11227, 11416, 11604, \ 11792, 11980, 12166, 12353, 12539, \ 12724, 12909, 13094, 13278, 13462, \ 13645, 13827, 14009, 14191, 14372, \ 14552, 14732, 14911, 15090, 15268, \ 15446, 15623, 15799, 15975, 16150, \ 16325, 16499, 16672, 16845, 17017, \ 17189, 17360, 17530, 17699, 17868, \ 18036, 18204, 18371, 18537, 18702, \ 18867, 19031, 19194, 19357, 19519, \ 19680, 19840, 20000, 20159, 20317, \ 20474, 20631, 20787, 20942, 21096, \ 21249, 21402, 21554, 21705, 21855, \ 22004, 22153, 22301, 22448, 22594, \ 22739, 22883, 23027, 23169, 23311, \ 23452, 23592, 23731, 23869, 24006, \ 24143, 24278, 24413, 24546, 24679, \ 24811, 24942, 25072, 25201, 25329, \ 25456, 25582, 25707, 25831, 25954, \ 26077, 26198, 26318, 26437, 26556, \ 26673, 26789, 26905, 27019, 27132, \ 27244, 27355, 27466, 27575, 27683, \ 27790, 27896, 28001, 28105, 28208, \ 28309, 28410, 28510, 28608, 28706, \ 28802, 28897, 28992, 29085, 29177, \ 29268, 29358, 29446, 29534, 29621, \ 29706, 29790, 29873, 29955, 30036, \ 30116, 30195, 30272, 30349, 30424, \ 30498, 30571, 30643, 30713, 30783, \ 30851, 30918, 30984, 31049, 31113, \ 31175, 31236, 31297, 31356, 31413, \ 31470, 31525, 31580, 31633, 31684, \ 31735, 31785, 31833, 31880, 31926, \ 31970, 32014, 32056, 32097, 32137, \ 32176, 32213, 32249, 32284, 32318, \ 32350, 32382, 32412, 32441, 32468, \ 32495, 32520, 32544, 32567, 32588, \ 32609, 32628, 32646, 32662, 32678, \ 32692, 32705, 32717, 32727, 32736, \ 32744, 32751, 32757, 32761, 32764, \ 32766, 32767, 32766, 32764, 32761, \ 32757, 32751, 32744, 32736, 32727, \ 32717, 32705, 32692, 32678, 32662, \ 32646, 32628, 32609, 32588, 32567, \ 32544, 32520, 32495, 32468, 32441, \ 32412, 32382, 32350, 32318, 32284, \ 32249, 32213, 32176, 32137, 32097, \ 32056, 32014, 31970, 31926, 31880, \ 31833, 31785, 31735, 31684, 31633, \ 31580, 31525, 31470, 31413, 31356, \ 31297, 31236, 31175, 31113, 31049, \ 30984, 30918, 30851, 30783, 30713, \ 30643, 30571, 30498, 30424, 30349, \ 30272, 30195, 30116, 30036, 29955, \ 29873, 29790, 29706, 29621, 29534, \ 29446, 29358, 29268, 29177, 29085, \ 28992, 28897, 28802, 28706, 28608, \ 28510, 28410, 28309, 28208, 28105, \ 28001, 27896, 27790, 27683, 27575, \ 27466, 27355, 27244, 27132, 27019, \ 26905, 26789, 26673, 26556, 26437, \ 26318, 26198, 26077, 25954, 25831, \ 25707, 25582, 25456, 25329, 25201, \ 25072, 24942, 24811, 24679, 24546, \ 24413, 24278, 24143, 24006, 23869, \ 23731, 23592, 23452, 23311, 23169, \ 23027, 22883, 22739, 22594, 22448, \ 22301, 22153, 22004, 21855, 21705, \ 21554, 21402, 21249, 21096, 20942, \ 20787, 20631, 20474, 20317, 20159, \ 20000, 19840, 19680, 19519, 19357, \ 19194, 19031, 18867, 18702, 18537, \ 18371, 18204, 18036, 17868, 17699, \ 17530, 17360, 17189, 17017, 16845, \ 16672, 16499, 16325, 16150, 15975, \ 15799, 15623, 15446, 15268, 15090, \ 14911, 14732, 14552, 14372, 14191, \ 14009, 13827, 13645, 13462, 13278, \ 13094, 12909, 12724, 12539, 12353, \ 12166, 11980, 11792, 11604, 11416, \ 11227, 11038, 10849, 10659, 10469, \ 10278, 10087, 9895, 9703, 9511, \ 9319, 9126, 8932, 8739, 8545, \ 8351, 8156, 7961, 7766, 7571, \ 7375, 7179, 6982, 6786, 6589, \ 6392, 6195, 5997, 5799, 5601, \ 5403, 5205, 5006, 4807, 4608, \ 4409, 4210, 4011, 3811, 3611, \ 3411, 3211, 3011, 2811, 2610, \ 2410, 2209, 2009, 1808, 1607, \ 1406, 1206, 1005, 804, 603, \ 402, 201, 0, -201, -402, \ -603, -804, -1005, -1206, -1406, \ -1607, -1808, -2009, -2209, -2410, \ -2610, -2811, -3011, -3211, -3411, \ -3611, -3811, -4011, -4210, -4409, \ -4608, -4807, -5006, -5205, -5403, \ -5601, -5799, -5997, -6195, -6392, \ -6589, -6786, -6982, -7179, -7375, \ -7571, -7766, -7961, -8156, -8351, \ -8545, -8739, -8932, -9126, -9319, \ -9511, -9703, -9895, -10087, -10278, \ -10469, -10659, -10849, -11038, -11227, \ -11416, -11604, -11792, -11980, -12166, \ -12353, -12539, -12724, -12909, -13094, \ -13278, -13462, -13645, -13827, -14009, \ -14191, -14372, -14552, -14732, -14911, \ -15090, -15268, -15446, -15623, -15799, \ -15975, -16150, -16325, -16499, -16672, \ -16845, -17017, -17189, -17360, -17530, \ -17699, -17868, -18036, -18204, -18371, \ -18537, -18702, -18867, -19031, -19194, \ -19357, -19519, -19680, -19840, -20000, \ -20159, -20317, -20474, -20631, -20787, \ -20942, -21096, -21249, -21402, -21554, \ -21705, -21855, -22004, -22153, -22301, \ -22448, -22594, -22739, -22883, -23027, \ -23169, -23311, -23452, -23592, -23731, \ -23869, -24006, -24143, -24278, -24413, \ -24546, -24679, -24811, -24942, -25072, \ -25201, -25329, -25456, -25582, -25707, \ -25831, -25954, -26077, -26198, -26318, \ -26437, -26556, -26673, -26789, -26905, \ -27019, -27132, -27244, -27355, -27466, \ -27575, -27683, -27790, -27896, -28001, \ -28105, -28208, -28309, -28410, -28510, \ -28608, -28706, -28802, -28897, -28992, \ -29085, -29177, -29268, -29358, -29446, \ -29534, -29621, -29706, -29790, -29873, \ -29955, -30036, -30116, -30195, -30272, \ -30349, -30424, -30498, -30571, -30643, \ -30713, -30783, -30851, -30918, -30984, \ -31049, -31113, -31175, -31236, -31297, \ -31356, -31413, -31470, -31525, -31580, \ -31633, -31684, -31735, -31785, -31833, \ -31880, -31926, -31970, -32014, -32056, \ -32097, -32137, -32176, -32213, -32249, \ -32284, -32318, -32350, -32382, -32412, \ -32441, -32468, -32495, -32520, -32544, \ -32567, -32588, -32609, -32628, -32646, \ -32662, -32678, -32692, -32705, -32717, \ -32727, -32736, -32744, -32751, -32757, \ -32761, -32764, -32766, -32767, -32766, \ -32764, -32761, -32757, -32751, -32744, \ -32736, -32727, -32717, -32705, -32692, \ -32678, -32662, -32646, -32628, -32609, \ -32588, -32567, -32544, -32520, -32495, \ -32468, -32441, -32412, -32382, -32350, \ -32318, -32284, -32249, -32213, -32176, \ -32137, -32097, -32056, -32014, -31970, \ -31926, -31880, -31833, -31785, -31735, \ -31684, -31633, -31580, -31525, -31470, \ -31413, -31356, -31297, -31236, -31175, \ -31113, -31049, -30984, -30918, -30851, \ -30783, -30713, -30643, -30571, -30498, \ -30424, -30349, -30272, -30195, -30116, \ -30036, -29955, -29873, -29790, -29706, \ -29621, -29534, -29446, -29358, -29268, \ -29177, -29085, -28992, -28897, -28802, \ -28706, -28608, -28510, -28410, -28309, \ -28208, -28105, -28001, -27896, -27790, \ -27683, -27575, -27466, -27355, -27244, \ -27132, -27019, -26905, -26789, -26673, \ -26556, -26437, -26318, -26198, -26077, \ -25954, -25831, -25707, -25582, -25456, \ -25329, -25201, -25072, -24942, -24811, \ -24679, -24546, -24413, -24278, -24143, \ -24006, -23869, -23731, -23592, -23452, \ -23311, -23169, -23027, -22883, -22739, \ -22594, -22448, -22301, -22153, -22004, \ -21855, -21705, -21554, -21402, -21249, \ -21096, -20942, -20787, -20631, -20474, \ -20317, -20159, -20000, -19840, -19680, \ -19519, -19357, -19194, -19031, -18867, \ -18702, -18537, -18371, -18204, -18036, \ -17868, -17699, -17530, -17360, -17189, \ -17017, -16845, -16672, -16499, -16325, \ -16150, -15975, -15799, -15623, -15446, \ -15268, -15090, -14911, -14732, -14552, \ -14372, -14191, -14009, -13827, -13645, \ -13462, -13278, -13094, -12909, -12724, \ -12539, -12353, -12166, -11980, -11792, \ -11604, -11416, -11227, -11038, -10849, \ -10659, -10469, -10278, -10087, -9895, \ -9703, -9511, -9319, -9126, -8932, \ -8739, -8545, -8351, -8156, -7961, \ -7766, -7571, -7375, -7179, -6982, \ -6786, -6589, -6392, -6195, -5997, \ -5799, -5601, -5403, -5205, -5006, \ -4807, -4608, -4409, -4210, -4011, \ -3811, -3611, -3411, -3211, -3011, \ -2811, -2610, -2410, -2209, -2009, \ -1808, -1607, -1406, -1206, -1005, \ -804, -603, -402, -201}//scaled by 2^15-1=32767 int main (int argc, char **argv){ //int freq[FREQ_SIZE] = {5000,10000,15000,20000,21200,22000,22100,40000}; int freq[FREQ_SIZE] = {21000,21000,21000,21000,21000,21000,21000,21000}; int sin[TABLE_SIZE] = TABLE; int i,j, index; int out, inc; double inc_f, phase; FILE *f; f = fopen(argv[1], "w"); for(i = 0; i < FREQ_SIZE; i++){ //inc = ((double) (freq[i] * TABLE_SIZE) ) / ((double)SAMPLE_RATE); //instead of /SAMPLE_RATE => *3/(2^17) and instead of *TABLESIZE => <<9 //inc = 3*(freq[i]<<9)>>17; => inc = 3*freq[i]>>8; => inc shifted up by 10 for precision inc = inc_f = ((double)freq[i]*TABLE_SIZE)/SAMPLE_RATE; inc_f = inc_f - inc; //compute each wave over one sec for(j = 0; j < SAMPLE_RATE; j++){ index = (int)(((int)phase)%TABLE_SIZE); out = ((int)(inc_f*(sin[index+1] - sin[index]))) + sin[index]; //out = sin[index]; phase += ((double)inc + inc_f); fprintf(f, "%d \n", out); } } return 0; } /*address <= phase[18:10];//%TABLE_SIZE; //interpolation temp2 = (y-x) * inc[9:0] temp <= (temp2[25:10]) + x; //data <= (((y - x)*(inc & 1023)) >> 10) + x; */ /*int freq[FREQ_SIZE] = {5000,10000,15000,20000,21200,22000,22100,40000}; //double sin[TABLE_SIZE] = TABLE; int sin[TABLE_SIZE] = TABLE; int i,j; //double phase, inc, frac; int phase, inc, frac; int index, out; FILE *f; f = fopen(argv[1], "w"); for(i = 0; i < FREQ_SIZE; i++){ //inc = ((double) (freq[i] * TABLE_SIZE) ) / ((double)SAMPLE_RATE); //instead of div by SAMPLE_RATE = *3/(2^17) and instead of TABLESIZE <<9 inc = 3*(freq[i]<<9)>>17; //compute each wave over one sec for(j = 0; j < SAMPLE_RATE; j++){ index = (phase)%TABLE_SIZE; //fprintf(f, "%10.20f\n", inc); //inc*(sin[index+1] - sin[index]) frac = phase - (double)index; // nw out = (int)((frac*(sin[index+1]-sin[index]) + sin[index])*2048); out = (int)(sin[index]*2048); phase += inc; fprintf(f, "%d \n", out); } } return 0;*/