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
DSP.cpp@0:82ff15078322, 2012-01-25 (annotated)
- 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?
User | Revision | Line number | New 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 | //--------------------------------------------------------------------------- |