QRSS Rx Network receiver. A receiver to sample a segment of RF spectrum and send this data to a server for further processing and display. NXP mbed Design Challenge entry (Honorable Mention). Published in Circuit Cellar, Feb 2012

Dependencies:   NetServices mbed DNSResolver

Committer:
claytong
Date:
Wed Jan 25 20:32:53 2012 +0000
Revision:
0:82ff15078322
1.0 (initial public release)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
claytong 0:82ff15078322 1 /*---------------------------------------------------------------------------
claytong 0:82ff15078322 2
claytong 0:82ff15078322 3 QRSS Receiver Application
claytong 0:82ff15078322 4
claytong 0:82ff15078322 5 by Clayton ZL3TKA/VK1TKA
claytong 0:82ff15078322 6 clayton@isnotcrazy.com
claytong 0:82ff15078322 7
claytong 0:82ff15078322 8 DSP Processing class
claytong 0:82ff15078322 9
claytong 0:82ff15078322 10 ---------------------------------------------------------------------------*/
claytong 0:82ff15078322 11 // include files
claytong 0:82ff15078322 12
claytong 0:82ff15078322 13 #include "DSP.h"
claytong 0:82ff15078322 14
claytong 0:82ff15078322 15 // Definitions
claytong 0:82ff15078322 16
claytong 0:82ff15078322 17 // Macros
claytong 0:82ff15078322 18
claytong 0:82ff15078322 19 // Local Data
claytong 0:82ff15078322 20
claytong 0:82ff15078322 21 // Global Data
claytong 0:82ff15078322 22
claytong 0:82ff15078322 23 // Function Prototypes
claytong 0:82ff15078322 24
claytong 0:82ff15078322 25
claytong 0:82ff15078322 26 /*
claytong 0:82ff15078322 27
claytong 0:82ff15078322 28 LP FIR Filter calculated from Web calculator
claytong 0:82ff15078322 29 http://www-users.cs.york.ac.uk/~fisher/cgi-bin/mkfscript
claytong 0:82ff15078322 30
claytong 0:82ff15078322 31 Sample Rate: 35156
claytong 0:82ff15078322 32 Corner Freq: 200
claytong 0:82ff15078322 33 Taps: 511
claytong 0:82ff15078322 34 Beta: 0.5
claytong 0:82ff15078322 35
claytong 0:82ff15078322 36 // Digital filter designed by mkfilter/mkshape/gencode A.J. Fisher
claytong 0:82ff15078322 37 // Command line: /www/usr/fisher/helpers/mkshape -c 5.6889293435e-03 5.0000000000e-01 511 -b 16 -l
claytong 0:82ff15078322 38
claytong 0:82ff15078322 39 #define NZEROS 510
claytong 0:82ff15078322 40 #define GAIN 8.763528442e+01
claytong 0:82ff15078322 41
claytong 0:82ff15078322 42 static float xv[NZEROS+1];
claytong 0:82ff15078322 43
claytong 0:82ff15078322 44 static float xcoeffs[] =
claytong 0:82ff15078322 45 { +0.0006713867, +0.0008544922, +0.0010375977, +0.0012817383,
claytong 0:82ff15078322 46 +0.0015258789, +0.0017700195, +0.0020446777, +0.0023498535,
claytong 0:82ff15078322 47 +0.0026855469, +0.0030212402, +0.0033874512, +0.0037841797,
claytong 0:82ff15078322 48 +0.0041809082, +0.0046081543, +0.0050659180, +0.0055236816,
claytong 0:82ff15078322 49 +0.0060119629, +0.0065002441, +0.0070190430, +0.0075378418,
claytong 0:82ff15078322 50 +0.0080871582, +0.0086364746, +0.0092163086, +0.0097961426,
claytong 0:82ff15078322 51 +0.0103759766, +0.0109558105, +0.0115661621, +0.0121765137,
claytong 0:82ff15078322 52 +0.0127868652, +0.0133972168, +0.0140075684, +0.0146179199,
claytong 0:82ff15078322 53 +0.0151977539, +0.0158081055, +0.0163879395, +0.0169677734,
claytong 0:82ff15078322 54 +0.0175476074, +0.0180969238, +0.0186462402, +0.0191650391,
claytong 0:82ff15078322 55 +0.0196533203, +0.0201416016, +0.0205688477, +0.0209960938,
claytong 0:82ff15078322 56 +0.0213928223, +0.0217590332, +0.0220947266, +0.0223693848,
claytong 0:82ff15078322 57 +0.0226440430, +0.0228576660, +0.0230102539, +0.0231323242,
claytong 0:82ff15078322 58 +0.0232238770, +0.0232238770, +0.0232238770, +0.0231323242,
claytong 0:82ff15078322 59 +0.0229797363, +0.0227966309, +0.0225219727, +0.0222167969,
claytong 0:82ff15078322 60 +0.0218200684, +0.0213623047, +0.0208435059, +0.0202636719,
claytong 0:82ff15078322 61 +0.0195922852, +0.0188598633, +0.0180664062, +0.0171813965,
claytong 0:82ff15078322 62 +0.0162048340, +0.0151672363, +0.0140380859, +0.0128479004,
claytong 0:82ff15078322 63 +0.0115661621, +0.0102233887, +0.0087890625, +0.0072631836,
claytong 0:82ff15078322 64 +0.0056762695, +0.0039978027, +0.0022277832, +0.0003967285,
claytong 0:82ff15078322 65 -0.0015258789, -0.0035095215, -0.0055847168, -0.0077514648,
claytong 0:82ff15078322 66 -0.0099792480, -0.0122680664, -0.0146484375, -0.0170898438,
claytong 0:82ff15078322 67 -0.0195922852, -0.0221557617, -0.0248107910, -0.0274963379,
claytong 0:82ff15078322 68 -0.0302429199, -0.0330505371, -0.0359191895, -0.0388183594,
claytong 0:82ff15078322 69 -0.0417785645, -0.0447692871, -0.0477905273, -0.0508422852,
claytong 0:82ff15078322 70 -0.0539245605, -0.0570373535, -0.0601501465, -0.0632934570,
claytong 0:82ff15078322 71 -0.0664367676, -0.0695800781, -0.0727233887, -0.0758666992,
claytong 0:82ff15078322 72 -0.0789794922, -0.0820922852, -0.0851745605, -0.0881958008,
claytong 0:82ff15078322 73 -0.0912170410, -0.0941467285, -0.0970764160, -0.0999145508,
claytong 0:82ff15078322 74 -0.1026916504, -0.1054077148, -0.1080322266, -0.1105651856,
claytong 0:82ff15078322 75 -0.1130065918, -0.1153564453, -0.1175842285, -0.1197204590,
claytong 0:82ff15078322 76 -0.1217346191, -0.1235961914, -0.1253356934, -0.1269226074,
claytong 0:82ff15078322 77 -0.1283569336, -0.1296386719, -0.1307373047, -0.1316833496,
claytong 0:82ff15078322 78 -0.1324462891, -0.1329956055, -0.1333923340, -0.1335754394,
claytong 0:82ff15078322 79 -0.1335144043, -0.1332702637, -0.1328125000, -0.1321105957,
claytong 0:82ff15078322 80 -0.1311950684, -0.1300048828, -0.1286010742, -0.1269226074,
claytong 0:82ff15078322 81 -0.1250000000, -0.1228332519, -0.1203613281, -0.1176452637,
claytong 0:82ff15078322 82 -0.1146545410, -0.1113586426, -0.1077880859, -0.1039428711,
claytong 0:82ff15078322 83 -0.0997924805, -0.0953369141, -0.0906066895, -0.0855407715,
claytong 0:82ff15078322 84 -0.0802001953, -0.0745544434, -0.0686035156, -0.0623168945,
claytong 0:82ff15078322 85 -0.0557250977, -0.0488586426, -0.0416564941, -0.0341186523,
claytong 0:82ff15078322 86 -0.0263061523, -0.0181579590, -0.0097351074, -0.0009765625,
claytong 0:82ff15078322 87 +0.0080871582, +0.0174255371, +0.0270996094, +0.0370483398,
claytong 0:82ff15078322 88 +0.0473022461, +0.0578308105, +0.0686645508, +0.0797729492,
claytong 0:82ff15078322 89 +0.0911560059, +0.1028137207, +0.1147155762, +0.1268920898,
claytong 0:82ff15078322 90 +0.1393432617, +0.1520080566, +0.1649169922, +0.1780700684,
claytong 0:82ff15078322 91 +0.1914367676, +0.2050170898, +0.2188110352, +0.2327880859,
claytong 0:82ff15078322 92 +0.2469482422, +0.2613220215, +0.2758178711, +0.2904968262,
claytong 0:82ff15078322 93 +0.3053283691, +0.3203125000, +0.3353881836, +0.3505859375,
claytong 0:82ff15078322 94 +0.3659057617, +0.3812866211, +0.3967590332, +0.4122924805,
claytong 0:82ff15078322 95 +0.4279174805, +0.4435424805, +0.4591979981, +0.4748840332,
claytong 0:82ff15078322 96 +0.4905700684, +0.5062561035, +0.5219116211, +0.5375366211,
claytong 0:82ff15078322 97 +0.5531005859, +0.5686035156, +0.5840148926, +0.5993652344,
claytong 0:82ff15078322 98 +0.6145935059, +0.6296997070, +0.6446838379, +0.6595153809,
claytong 0:82ff15078322 99 +0.6741943359, +0.6886901855, +0.7030334473, +0.7171325684,
claytong 0:82ff15078322 100 +0.7310485840, +0.7447204590, +0.7581787109, +0.7713623047,
claytong 0:82ff15078322 101 +0.7843017578, +0.7969665527, +0.8093261719, +0.8214111328,
claytong 0:82ff15078322 102 +0.8331604004, +0.8446044922, +0.8557128906, +0.8664855957,
claytong 0:82ff15078322 103 +0.8768920898, +0.8869323730, +0.8966064453, +0.9058837891,
claytong 0:82ff15078322 104 +0.9147949219, +0.9232788086, +0.9313659668, +0.9390258789,
claytong 0:82ff15078322 105 +0.9462585449, +0.9530944824, +0.9594421387, +0.9653625488,
claytong 0:82ff15078322 106 +0.9708557129, +0.9758605957, +0.9804077148, +0.9844970703,
claytong 0:82ff15078322 107 +0.9880981445, +0.9912414551, +0.9938964844, +0.9960937500,
claytong 0:82ff15078322 108 +0.9977722168, +0.9989929199, +0.9997253418, +0.9999694824,
claytong 0:82ff15078322 109 +0.9997253418, +0.9989929199, +0.9977722168, +0.9960937500,
claytong 0:82ff15078322 110 +0.9938964844, +0.9912414551, +0.9880981445, +0.9844970703,
claytong 0:82ff15078322 111 +0.9804077148, +0.9758605957, +0.9708557129, +0.9653625488,
claytong 0:82ff15078322 112 +0.9594421387, +0.9530944824, +0.9462585449, +0.9390258789,
claytong 0:82ff15078322 113 +0.9313659668, +0.9232788086, +0.9147949219, +0.9058837891,
claytong 0:82ff15078322 114 +0.8966064453, +0.8869323730, +0.8768920898, +0.8664855957,
claytong 0:82ff15078322 115 +0.8557128906, +0.8446044922, +0.8331604004, +0.8214111328,
claytong 0:82ff15078322 116 +0.8093261719, +0.7969665527, +0.7843017578, +0.7713623047,
claytong 0:82ff15078322 117 +0.7581787109, +0.7447204590, +0.7310485840, +0.7171325684,
claytong 0:82ff15078322 118 +0.7030334473, +0.6886901855, +0.6741943359, +0.6595153809,
claytong 0:82ff15078322 119 +0.6446838379, +0.6296997070, +0.6145935059, +0.5993652344,
claytong 0:82ff15078322 120 +0.5840148926, +0.5686035156, +0.5531005859, +0.5375366211,
claytong 0:82ff15078322 121 +0.5219116211, +0.5062561035, +0.4905700684, +0.4748840332,
claytong 0:82ff15078322 122 +0.4591979981, +0.4435424805, +0.4279174805, +0.4122924805,
claytong 0:82ff15078322 123 +0.3967590332, +0.3812866211, +0.3659057617, +0.3505859375,
claytong 0:82ff15078322 124 +0.3353881836, +0.3203125000, +0.3053283691, +0.2904968262,
claytong 0:82ff15078322 125 +0.2758178711, +0.2613220215, +0.2469482422, +0.2327880859,
claytong 0:82ff15078322 126 +0.2188110352, +0.2050170898, +0.1914367676, +0.1780700684,
claytong 0:82ff15078322 127 +0.1649169922, +0.1520080566, +0.1393432617, +0.1268920898,
claytong 0:82ff15078322 128 +0.1147155762, +0.1028137207, +0.0911560059, +0.0797729492,
claytong 0:82ff15078322 129 +0.0686645508, +0.0578308105, +0.0473022461, +0.0370483398,
claytong 0:82ff15078322 130 +0.0270996094, +0.0174255371, +0.0080871582, -0.0009765625,
claytong 0:82ff15078322 131 -0.0097351074, -0.0181579590, -0.0263061523, -0.0341186523,
claytong 0:82ff15078322 132 -0.0416564941, -0.0488586426, -0.0557250977, -0.0623168945,
claytong 0:82ff15078322 133 -0.0686035156, -0.0745544434, -0.0802001953, -0.0855407715,
claytong 0:82ff15078322 134 -0.0906066895, -0.0953369141, -0.0997924805, -0.1039428711,
claytong 0:82ff15078322 135 -0.1077880859, -0.1113586426, -0.1146545410, -0.1176452637,
claytong 0:82ff15078322 136 -0.1203613281, -0.1228332519, -0.1250000000, -0.1269226074,
claytong 0:82ff15078322 137 -0.1286010742, -0.1300048828, -0.1311950684, -0.1321105957,
claytong 0:82ff15078322 138 -0.1328125000, -0.1332702637, -0.1335144043, -0.1335754394,
claytong 0:82ff15078322 139 -0.1333923340, -0.1329956055, -0.1324462891, -0.1316833496,
claytong 0:82ff15078322 140 -0.1307373047, -0.1296386719, -0.1283569336, -0.1269226074,
claytong 0:82ff15078322 141 -0.1253356934, -0.1235961914, -0.1217346191, -0.1197204590,
claytong 0:82ff15078322 142 -0.1175842285, -0.1153564453, -0.1130065918, -0.1105651856,
claytong 0:82ff15078322 143 -0.1080322266, -0.1054077148, -0.1026916504, -0.0999145508,
claytong 0:82ff15078322 144 -0.0970764160, -0.0941467285, -0.0912170410, -0.0881958008,
claytong 0:82ff15078322 145 -0.0851745605, -0.0820922852, -0.0789794922, -0.0758666992,
claytong 0:82ff15078322 146 -0.0727233887, -0.0695800781, -0.0664367676, -0.0632934570,
claytong 0:82ff15078322 147 -0.0601501465, -0.0570373535, -0.0539245605, -0.0508422852,
claytong 0:82ff15078322 148 -0.0477905273, -0.0447692871, -0.0417785645, -0.0388183594,
claytong 0:82ff15078322 149 -0.0359191895, -0.0330505371, -0.0302429199, -0.0274963379,
claytong 0:82ff15078322 150 -0.0248107910, -0.0221557617, -0.0195922852, -0.0170898438,
claytong 0:82ff15078322 151 -0.0146484375, -0.0122680664, -0.0099792480, -0.0077514648,
claytong 0:82ff15078322 152 -0.0055847168, -0.0035095215, -0.0015258789, +0.0003967285,
claytong 0:82ff15078322 153 +0.0022277832, +0.0039978027, +0.0056762695, +0.0072631836,
claytong 0:82ff15078322 154 +0.0087890625, +0.0102233887, +0.0115661621, +0.0128479004,
claytong 0:82ff15078322 155 +0.0140380859, +0.0151672363, +0.0162048340, +0.0171813965,
claytong 0:82ff15078322 156 +0.0180664062, +0.0188598633, +0.0195922852, +0.0202636719,
claytong 0:82ff15078322 157 +0.0208435059, +0.0213623047, +0.0218200684, +0.0222167969,
claytong 0:82ff15078322 158 +0.0225219727, +0.0227966309, +0.0229797363, +0.0231323242,
claytong 0:82ff15078322 159 +0.0232238770, +0.0232238770, +0.0232238770, +0.0231323242,
claytong 0:82ff15078322 160 +0.0230102539, +0.0228576660, +0.0226440430, +0.0223693848,
claytong 0:82ff15078322 161 +0.0220947266, +0.0217590332, +0.0213928223, +0.0209960938,
claytong 0:82ff15078322 162 +0.0205688477, +0.0201416016, +0.0196533203, +0.0191650391,
claytong 0:82ff15078322 163 +0.0186462402, +0.0180969238, +0.0175476074, +0.0169677734,
claytong 0:82ff15078322 164 +0.0163879395, +0.0158081055, +0.0151977539, +0.0146179199,
claytong 0:82ff15078322 165 +0.0140075684, +0.0133972168, +0.0127868652, +0.0121765137,
claytong 0:82ff15078322 166 +0.0115661621, +0.0109558105, +0.0103759766, +0.0097961426,
claytong 0:82ff15078322 167 +0.0092163086, +0.0086364746, +0.0080871582, +0.0075378418,
claytong 0:82ff15078322 168 +0.0070190430, +0.0065002441, +0.0060119629, +0.0055236816,
claytong 0:82ff15078322 169 +0.0050659180, +0.0046081543, +0.0041809082, +0.0037841797,
claytong 0:82ff15078322 170 +0.0033874512, +0.0030212402, +0.0026855469, +0.0023498535,
claytong 0:82ff15078322 171 +0.0020446777, +0.0017700195, +0.0015258789, +0.0012817383,
claytong 0:82ff15078322 172 +0.0010375977, +0.0008544922, +0.0006713867,
claytong 0:82ff15078322 173 };
claytong 0:82ff15078322 174
claytong 0:82ff15078322 175 static void filterloop()
claytong 0:82ff15078322 176 { for (;;)
claytong 0:82ff15078322 177 { float sum; int i;
claytong 0:82ff15078322 178 for (i = 0; i < NZEROS; i++) xv[i] = xv[i+1];
claytong 0:82ff15078322 179 xv[NZEROS] = next input value / GAIN;
claytong 0:82ff15078322 180 sum = 0.0;
claytong 0:82ff15078322 181 for (i = 0; i <= NZEROS; i++) sum += (xcoeffs[i] * xv[i]);
claytong 0:82ff15078322 182 next output value = sum;
claytong 0:82ff15078322 183 }
claytong 0:82ff15078322 184 }
claytong 0:82ff15078322 185
claytong 0:82ff15078322 186 */
claytong 0:82ff15078322 187
claytong 0:82ff15078322 188 const int16_t aiFIRCoefficients[DSP_FIR_COEFFICIENTS] = {
claytong 0:82ff15078322 189 22,28,34,42,50,58,67,77,
claytong 0:82ff15078322 190 88,99,111,124,137,151,166,181,
claytong 0:82ff15078322 191 197,213,230,247,265,283,302,321,
claytong 0:82ff15078322 192 340,359,379,399,419,439,459,479,
claytong 0:82ff15078322 193 498,518,537,556,575,593,611,628,
claytong 0:82ff15078322 194 644,660,674,688,701,713,724,733,
claytong 0:82ff15078322 195 742,749,754,758,761,761,761,758,
claytong 0:82ff15078322 196 753,747,738,728,715,700,683,664,
claytong 0:82ff15078322 197 642,618,592,563,531,497,460,421,
claytong 0:82ff15078322 198 379,335,288,238,186,131,73,13,
claytong 0:82ff15078322 199 -50,-115,-183,-254,-327,-402,-480,-560,
claytong 0:82ff15078322 200 -642,-726,-813,-901,-991,-1083,-1177,-1272,
claytong 0:82ff15078322 201 -1369,-1467,-1566,-1666,-1767,-1869,-1971,-2074,
claytong 0:82ff15078322 202 -2177,-2280,-2383,-2486,-2588,-2690,-2791,-2890,
claytong 0:82ff15078322 203 -2989,-3085,-3181,-3274,-3365,-3454,-3540,-3623,
claytong 0:82ff15078322 204 -3703,-3780,-3853,-3923,-3989,-4050,-4107,-4159,
claytong 0:82ff15078322 205 -4206,-4248,-4284,-4315,-4340,-4358,-4371,-4377,
claytong 0:82ff15078322 206 -4375,-4367,-4352,-4329,-4299,-4260,-4214,-4159,
claytong 0:82ff15078322 207 -4096,-4025,-3944,-3855,-3757,-3649,-3532,-3406,
claytong 0:82ff15078322 208 -3270,-3124,-2969,-2803,-2628,-2443,-2248,-2042,
claytong 0:82ff15078322 209 -1826,-1601,-1365,-1118,-862,-595,-319,-32,
claytong 0:82ff15078322 210 265,571,888,1214,1550,1895,2250,2614,
claytong 0:82ff15078322 211 2987,3369,3759,4158,4566,4981,5404,5835,
claytong 0:82ff15078322 212 6273,6718,7170,7628,8092,8563,9038,9519,
claytong 0:82ff15078322 213 10005,10496,10990,11488,11990,12494,13001,13510,
claytong 0:82ff15078322 214 14022,14534,15047,15561,16075,16589,17102,17614,
claytong 0:82ff15078322 215 18124,18632,19137,19640,20139,20634,21125,21611,
claytong 0:82ff15078322 216 22092,22567,23037,23499,23955,24403,24844,25276,
claytong 0:82ff15078322 217 25700,26115,26520,26916,27301,27676,28040,28393,
claytong 0:82ff15078322 218 28734,29063,29380,29684,29976,30254,30519,30770,
claytong 0:82ff15078322 219 31007,31231,31439,31633,31813,31977,32126,32260,
claytong 0:82ff15078322 220 32378,32481,32568,32640,32695,32735,32759,32767,
claytong 0:82ff15078322 221 32759,32735,32695,32640,32568,32481,32378,32260,
claytong 0:82ff15078322 222 32126,31977,31813,31633,31439,31231,31007,30770,
claytong 0:82ff15078322 223 30519,30254,29976,29684,29380,29063,28734,28393,
claytong 0:82ff15078322 224 28040,27676,27301,26916,26520,26115,25700,25276,
claytong 0:82ff15078322 225 24844,24403,23955,23499,23037,22567,22092,21611,
claytong 0:82ff15078322 226 21125,20634,20139,19640,19137,18632,18124,17614,
claytong 0:82ff15078322 227 17102,16589,16075,15561,15047,14534,14022,13510,
claytong 0:82ff15078322 228 13001,12494,11990,11488,10990,10496,10005,9519,
claytong 0:82ff15078322 229 9038,8563,8092,7628,7170,6718,6273,5835,
claytong 0:82ff15078322 230 5404,4981,4566,4158,3759,3369,2987,2614,
claytong 0:82ff15078322 231 2250,1895,1550,1214,888,571,265,-32,
claytong 0:82ff15078322 232 -319,-595,-862,-1118,-1365,-1601,-1826,-2042,
claytong 0:82ff15078322 233 -2248,-2443,-2628,-2803,-2969,-3124,-3270,-3406,
claytong 0:82ff15078322 234 -3532,-3649,-3757,-3855,-3944,-4025,-4096,-4159,
claytong 0:82ff15078322 235 -4214,-4260,-4299,-4329,-4352,-4367,-4375,-4377,
claytong 0:82ff15078322 236 -4371,-4358,-4340,-4315,-4284,-4248,-4206,-4159,
claytong 0:82ff15078322 237 -4107,-4050,-3989,-3923,-3853,-3780,-3703,-3623,
claytong 0:82ff15078322 238 -3540,-3454,-3365,-3274,-3181,-3085,-2989,-2890,
claytong 0:82ff15078322 239 -2791,-2690,-2588,-2486,-2383,-2280,-2177,-2074,
claytong 0:82ff15078322 240 -1971,-1869,-1767,-1666,-1566,-1467,-1369,-1272,
claytong 0:82ff15078322 241 -1177,-1083,-991,-901,-813,-726,-642,-560,
claytong 0:82ff15078322 242 -480,-402,-327,-254,-183,-115,-50,13,
claytong 0:82ff15078322 243 73,131,186,238,288,335,379,421,
claytong 0:82ff15078322 244 460,497,531,563,592,618,642,664,
claytong 0:82ff15078322 245 683,700,715,728,738,747,753,758,
claytong 0:82ff15078322 246 761,761,761,758,754,749,742,733,
claytong 0:82ff15078322 247 724,713,701,688,674,660,644,628,
claytong 0:82ff15078322 248 611,593,575,556,537,518,498,479,
claytong 0:82ff15078322 249 459,439,419,399,379,359,340,321,
claytong 0:82ff15078322 250 302,283,265,247,230,213,197,181,
claytong 0:82ff15078322 251 166,151,137,124,111,99,88,77,
claytong 0:82ff15078322 252 67,58,50,42,34,28,22
claytong 0:82ff15078322 253 };
claytong 0:82ff15078322 254
claytong 0:82ff15078322 255 /*
claytong 0:82ff15078322 256 Sin table to convert NCO phase to Oscillator outputs
claytong 0:82ff15078322 257 */
claytong 0:82ff15078322 258 const int16_t aiSinTable[256] = {
claytong 0:82ff15078322 259 0,6,13,19,25,31,37,44,
claytong 0:82ff15078322 260 50,56,62,68,74,80,86,92,
claytong 0:82ff15078322 261 98,103,109,115,120,126,131,136,
claytong 0:82ff15078322 262 142,147,152,157,162,167,171,176,
claytong 0:82ff15078322 263 180,185,189,193,197,201,205,208,
claytong 0:82ff15078322 264 212,215,219,222,225,228,231,233,
claytong 0:82ff15078322 265 236,238,240,242,244,246,247,249,
claytong 0:82ff15078322 266 250,251,252,253,254,254,255,255,
claytong 0:82ff15078322 267 255,255,255,254,254,253,252,251,
claytong 0:82ff15078322 268 250,249,247,246,244,242,240,238,
claytong 0:82ff15078322 269 236,233,231,228,225,222,219,215,
claytong 0:82ff15078322 270 212,208,205,201,197,193,189,185,
claytong 0:82ff15078322 271 180,176,171,167,162,157,152,147,
claytong 0:82ff15078322 272 142,136,131,126,120,115,109,103,
claytong 0:82ff15078322 273 98,92,86,80,74,68,62,56,
claytong 0:82ff15078322 274 50,44,37,31,25,19,13,6,
claytong 0:82ff15078322 275 0,-6,-13,-19,-25,-31,-37,-44,
claytong 0:82ff15078322 276 -50,-56,-62,-68,-74,-80,-86,-92,
claytong 0:82ff15078322 277 -98,-103,-109,-115,-120,-126,-131,-136,
claytong 0:82ff15078322 278 -142,-147,-152,-157,-162,-167,-171,-176,
claytong 0:82ff15078322 279 -180,-185,-189,-193,-197,-201,-205,-208,
claytong 0:82ff15078322 280 -212,-215,-219,-222,-225,-228,-231,-233,
claytong 0:82ff15078322 281 -236,-238,-240,-242,-244,-246,-247,-249,
claytong 0:82ff15078322 282 -250,-251,-252,-253,-254,-254,-255,-255,
claytong 0:82ff15078322 283 -255,-255,-255,-254,-254,-253,-252,-251,
claytong 0:82ff15078322 284 -250,-249,-247,-246,-244,-242,-240,-238,
claytong 0:82ff15078322 285 -236,-233,-231,-228,-225,-222,-219,-215,
claytong 0:82ff15078322 286 -212,-208,-205,-201,-197,-193,-189,-185,
claytong 0:82ff15078322 287 -180,-176,-171,-167,-162,-157,-152,-147,
claytong 0:82ff15078322 288 -142,-136,-131,-126,-120,-115,-109,-103,
claytong 0:82ff15078322 289 -98,-92,-86,-80,-74,-68,-62,-56,
claytong 0:82ff15078322 290 -50,-44,-37,-31,-25,-19,-13,-6
claytong 0:82ff15078322 291 };
claytong 0:82ff15078322 292
claytong 0:82ff15078322 293 //---------------------------------------------------------------------------
claytong 0:82ff15078322 294 // LOCAL FUNCTIONS
claytong 0:82ff15078322 295 //---------------------------------------------------------------------------
claytong 0:82ff15078322 296
claytong 0:82ff15078322 297 //---------------------------------------------------------------------------
claytong 0:82ff15078322 298 //
claytong 0:82ff15078322 299 // Perform a MAC Operation (multiply and Accumulate)
claytong 0:82ff15078322 300 // Assumes data is from samples structure, so skips every 2nd sample
claytong 0:82ff15078322 301 // Produces a 64 bit result
claytong 0:82ff15078322 302 //
claytong 0:82ff15078322 303 int64_t MAC_Samples( int64_t llSum, const int32_t *piSamples, const int16_t *piCoefficients, int iCnt )
claytong 0:82ff15078322 304 {
claytong 0:82ff15078322 305 int64_t llMult;
claytong 0:82ff15078322 306
claytong 0:82ff15078322 307 while ( iCnt>0 )
claytong 0:82ff15078322 308 {
claytong 0:82ff15078322 309 llMult = *piSamples;
claytong 0:82ff15078322 310 llMult *= *piCoefficients;
claytong 0:82ff15078322 311 llSum += llMult;
claytong 0:82ff15078322 312 piSamples++;
claytong 0:82ff15078322 313 piSamples++; // skip other sample pair
claytong 0:82ff15078322 314 piCoefficients++;
claytong 0:82ff15078322 315 iCnt--;
claytong 0:82ff15078322 316 }
claytong 0:82ff15078322 317 return llSum;
claytong 0:82ff15078322 318 }
claytong 0:82ff15078322 319
claytong 0:82ff15078322 320 //---------------------------------------------------------------------------
claytong 0:82ff15078322 321 //
claytong 0:82ff15078322 322 // Convert a 64 bit sum to a 32 bit output
claytong 0:82ff15078322 323 //
claytong 0:82ff15078322 324 int32_t ConvertToOutput( int64_t llSum )
claytong 0:82ff15078322 325 {
claytong 0:82ff15078322 326 return (int32_t)(llSum>>FIR_SHIFT_FACTOR);
claytong 0:82ff15078322 327 }
claytong 0:82ff15078322 328
claytong 0:82ff15078322 329 //---------------------------------------------------------------------------
claytong 0:82ff15078322 330 // DSP Methods
claytong 0:82ff15078322 331 //---------------------------------------------------------------------------
claytong 0:82ff15078322 332
claytong 0:82ff15078322 333 //---------------------------------------------------------------------------
claytong 0:82ff15078322 334 //
claytong 0:82ff15078322 335 // Set up NCO Increment from a frequency value
claytong 0:82ff15078322 336 //
claytong 0:82ff15078322 337 void TDSPProcessor::NCOFrequency( int32_t iFreq )
claytong 0:82ff15078322 338 {
claytong 0:82ff15078322 339 int64_t llFreq;
claytong 0:82ff15078322 340 int64_t llInc;
claytong 0:82ff15078322 341
claytong 0:82ff15078322 342 // Inc (32bit) = Freq * 2^32 / SampleRate
claytong 0:82ff15078322 343 // Use long long (64 bit int) for calculations to prevent overflow and get best resolution
claytong 0:82ff15078322 344 llFreq = iFreq;
claytong 0:82ff15078322 345 llInc = llFreq * 0x10000 * 0x10000 / SAMPLE_RATE;
claytong 0:82ff15078322 346 // Convert back to 32 bit unsigned via integer type
claytong 0:82ff15078322 347 uiMixerPhaseIncrement = (uint32_t)((int32_t)llInc);
claytong 0:82ff15078322 348 printf( "LO Freq set to %d - NCO Inc set to %u\r\n", iFreq, uiMixerPhaseIncrement );
claytong 0:82ff15078322 349 }
claytong 0:82ff15078322 350
claytong 0:82ff15078322 351
claytong 0:82ff15078322 352 //---------------------------------------------------------------------------
claytong 0:82ff15078322 353 //
claytong 0:82ff15078322 354 // Reset processing
claytong 0:82ff15078322 355 //
claytong 0:82ff15078322 356 void TDSPProcessor::Reset()
claytong 0:82ff15078322 357 {
claytong 0:82ff15078322 358 uiMixerPhaseAccumulator = 0;
claytong 0:82ff15078322 359 bLPFPartailsValid = false;
claytong 0:82ff15078322 360 Release();
claytong 0:82ff15078322 361 }
claytong 0:82ff15078322 362
claytong 0:82ff15078322 363 //---------------------------------------------------------------------------
claytong 0:82ff15078322 364 //
claytong 0:82ff15078322 365 // Mix samples with LO (local oscillator)
claytong 0:82ff15078322 366 //
claytong 0:82ff15078322 367 bool TDSPProcessor::MixLO()
claytong 0:82ff15078322 368 {
claytong 0:82ff15078322 369 int ii;
claytong 0:82ff15078322 370 int iLen = Length();
claytong 0:82ff15078322 371 TDataSample * pSample;
claytong 0:82ff15078322 372 int16_t iIlo;
claytong 0:82ff15078322 373 int16_t iQlo;
claytong 0:82ff15078322 374 int32_t iIin;
claytong 0:82ff15078322 375 int32_t iQin;
claytong 0:82ff15078322 376
claytong 0:82ff15078322 377 for ( ii=0,pSample=SamplePtr(); ii<iLen; ii++,pSample++ )
claytong 0:82ff15078322 378 {
claytong 0:82ff15078322 379 // generate quadrature oscillators. LO I=cos Q=sin
claytong 0:82ff15078322 380 iIlo = aiSinTable[ (64+(uiMixerPhaseAccumulator>>24))&0xFF ]; // COS
claytong 0:82ff15078322 381 iQlo = aiSinTable[ (uiMixerPhaseAccumulator>>24) ]; // SIN
claytong 0:82ff15078322 382 // inc NCO
claytong 0:82ff15078322 383 uiMixerPhaseAccumulator += uiMixerPhaseIncrement;
claytong 0:82ff15078322 384 // scale samples (they are only 24 bits)
claytong 0:82ff15078322 385 iIin = pSample->iIData / 256;
claytong 0:82ff15078322 386 iQin = pSample->iQData / 256;
claytong 0:82ff15078322 387 // complex multiply sample and LO
claytong 0:82ff15078322 388 // (A + Bi) * (C + Di) = (AC - BD) + (BC + AD)i
claytong 0:82ff15078322 389 pSample->iIData = (iIin * iIlo) - (iQin * iQlo);
claytong 0:82ff15078322 390 pSample->iQData = (iQin * iIlo) + (iIin * iQlo);
claytong 0:82ff15078322 391 }
claytong 0:82ff15078322 392
claytong 0:82ff15078322 393 return true;
claytong 0:82ff15078322 394 }
claytong 0:82ff15078322 395
claytong 0:82ff15078322 396 //---------------------------------------------------------------------------
claytong 0:82ff15078322 397 //
claytong 0:82ff15078322 398 // LPF processing
claytong 0:82ff15078322 399 //
claytong 0:82ff15078322 400 bool TDSPProcessor::LPF()
claytong 0:82ff15078322 401 {
claytong 0:82ff15078322 402 /*
claytong 0:82ff15078322 403 We just code this up for the parameters defined.
claytong 0:82ff15078322 404 It could be dynamically coded, but for simplicity hard-coding will be used
claytong 0:82ff15078322 405 */
claytong 0:82ff15078322 406 #if (BUFFERSYS_SIZE!=512)
claytong 0:82ff15078322 407 #error BUFFERSYS_SIZE has changed from 512
claytong 0:82ff15078322 408 #endif
claytong 0:82ff15078322 409 #if (DSP_FIR_COEFFICIENTS!=511)
claytong 0:82ff15078322 410 #error DSP_FIR_COEFFICIENTS has changed from 511
claytong 0:82ff15078322 411 #endif
claytong 0:82ff15078322 412 #if (DECIMATION_RATIO!=64)
claytong 0:82ff15078322 413 #error DECIMATION_RATIO has changed from 64
claytong 0:82ff15078322 414 #endif
claytong 0:82ff15078322 415 #if (LPF_OUTPUTS_SIZE!=8)
claytong 0:82ff15078322 416 #error LPF_OUTPUTS_SIZE has changed from 8
claytong 0:82ff15078322 417 #endif
claytong 0:82ff15078322 418
claytong 0:82ff15078322 419 int64_t iSum;
claytong 0:82ff15078322 420 int ii;
claytong 0:82ff15078322 421 bool bRet = false;
claytong 0:82ff15078322 422
claytong 0:82ff15078322 423 // Outputs
claytong 0:82ff15078322 424 if ( bLPFPartailsValid )
claytong 0:82ff15078322 425 {
claytong 0:82ff15078322 426 for ( ii=0; ii<8; ii++ )
claytong 0:82ff15078322 427 {
claytong 0:82ff15078322 428 iSum = MAC_Samples( asLPFPartials[ii].iIData, &(SamplePtr(0)->iIData), &(aiFIRCoefficients[448-(ii*64)]), (ii*64)+62 );
claytong 0:82ff15078322 429 asLPFOutputs[ii].iIData = ConvertToOutput( iSum );
claytong 0:82ff15078322 430 iSum = MAC_Samples( asLPFPartials[ii].iQData, &(SamplePtr(0)->iQData), &(aiFIRCoefficients[448-(ii*64)]), (ii*64)+62 );
claytong 0:82ff15078322 431 asLPFOutputs[ii].iQData = ConvertToOutput( iSum );
claytong 0:82ff15078322 432 }
claytong 0:82ff15078322 433 bRet = true;
claytong 0:82ff15078322 434 }
claytong 0:82ff15078322 435 // Partials
claytong 0:82ff15078322 436 for ( ii=0; ii<7; ii++ )
claytong 0:82ff15078322 437 {
claytong 0:82ff15078322 438 asLPFPartials[ii].iIData = MAC_Samples( 0, &(SamplePtr((ii*64)+64)->iIData), &(aiFIRCoefficients[0]), (7-ii)*64 );
claytong 0:82ff15078322 439 asLPFPartials[ii].iQData = MAC_Samples( 0, &(SamplePtr((ii*64)+64)->iQData), &(aiFIRCoefficients[0]), (7-ii)*64 );
claytong 0:82ff15078322 440 }
claytong 0:82ff15078322 441 // Partials[7] = 0
claytong 0:82ff15078322 442 asLPFPartials[7].iIData = 0;
claytong 0:82ff15078322 443 asLPFPartials[7].iQData = 0;
claytong 0:82ff15078322 444 bLPFPartailsValid = true;
claytong 0:82ff15078322 445
claytong 0:82ff15078322 446 return bRet;
claytong 0:82ff15078322 447 }
claytong 0:82ff15078322 448
claytong 0:82ff15078322 449 //---------------------------------------------------------------------------
claytong 0:82ff15078322 450 // END
claytong 0:82ff15078322 451 //---------------------------------------------------------------------------