/* SIMULATION OF WEIGHTED NEURON Author: Robert John Morton YE572246C March 1993 */ #include #define R 32767 #define RR 65556 // 65534 + 22 #define NI 77 // number of inputs to the neuron int AL; short SigTab[1025]; int I[] = {11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329, 11376, 13425, 17920, 30226, 28763, 18940, 15329 }; //inputs int W[] = {12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557, 12345, 21345, 31245, 16730, 31662, 25460, 13557 }; //weights void SigGen(void) { int i; for (i = 0; i < 1024; i++) SigTab[i] = (double)(RR / (1 + exp(-((double)(((long)(i)) << 8))/R)) - R); SigTab[1024] = R; } int Neuron(int *pi, int *pw, int ni) { register i; //input array index, sigmoid table index int a, o, s; //activation level, output, sign long P, Hi, Lo; //long product, high & low accumulators for (Hi = 0, Lo = 0, i = 0; i < ni; i++) { P = (long)*(pi + i) * *(pw + i); Hi += P >> 16; Lo += P & 0xFFFF; } if ((s = (a = ((Hi << 1) + (Lo >> 15)) / ni)) < 0) a = -a; o = *(SigTab + (i = a >> 5)); o += ((*(SigTab + i + 1) - o) * (a & 0x1F)) >> 5; if (s < 0) o = -o; AL = a; //extra line to check activation level return(o); } main() { int OP; SigGen(); OP = Neuron(I, W, NI); printf("Activation Level = %6d\n", AL); printf("Neuron Output = %6d\n", OP); }