Control Library by altb
Dependents: My_Libraries IndNav_QK3_T265
PRBS.cpp@15:c70cad2f4e64, 2020-01-16 (annotated)
- Committer:
- pmic
- Date:
- Thu Jan 16 09:12:50 2020 +0000
- Revision:
- 15:c70cad2f4e64
- Parent:
- 0:d49418189c5c
Revisit IIR_filter.h and IIR_filter.cpp. Change internal double to float arithmetic.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
altb | 0:d49418189c5c | 1 | /* |
altb | 0:d49418189c5c | 2 | PRBS: pseudo random binary sequence generator |
altb | 0:d49418189c5c | 3 | |
altb | 0:d49418189c5c | 4 | instantiate option: PRBS(int n) |
altb | 0:d49418189c5c | 5 | |
altb | 0:d49418189c5c | 6 | hints: - the output delivers a new excitation signal with the values -1 or 1. |
altb | 0:d49418189c5c | 7 | - after 2^n-1 samples the sequenz repeats infinite |
altb | 0:d49418189c5c | 8 | |
altb | 0:d49418189c5c | 9 | n: create a sequence of length 2^n-1 |
altb | 0:d49418189c5c | 10 | n = 2...19 is supported |
altb | 0:d49418189c5c | 11 | |
altb | 0:d49418189c5c | 12 | autor: M.E. Peter |
altb | 0:d49418189c5c | 13 | */ |
altb | 0:d49418189c5c | 14 | |
altb | 0:d49418189c5c | 15 | #include "PRBS.h" |
altb | 0:d49418189c5c | 16 | #include "mbed.h" |
altb | 0:d49418189c5c | 17 | #include "math.h" |
altb | 0:d49418189c5c | 18 | |
altb | 0:d49418189c5c | 19 | using namespace std; |
altb | 0:d49418189c5c | 20 | |
altb | 0:d49418189c5c | 21 | PRBS::PRBS(int n) |
altb | 0:d49418189c5c | 22 | { |
altb | 0:d49418189c5c | 23 | this->n = n; |
altb | 0:d49418189c5c | 24 | Nprbs = (int)pow((float)2, (float)n) - 1; |
altb | 0:d49418189c5c | 25 | getPrbsIndex(n); |
altb | 0:d49418189c5c | 26 | reset(); |
altb | 0:d49418189c5c | 27 | } |
altb | 0:d49418189c5c | 28 | |
altb | 0:d49418189c5c | 29 | PRBS::~PRBS() {} |
altb | 0:d49418189c5c | 30 | |
altb | 0:d49418189c5c | 31 | void PRBS::reset() |
altb | 0:d49418189c5c | 32 | { |
altb | 0:d49418189c5c | 33 | ii = 1; |
altb | 0:d49418189c5c | 34 | //default register |
altb | 0:d49418189c5c | 35 | int initRegister[19] = {1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1}; |
altb | 0:d49418189c5c | 36 | Register = (int*)malloc(n*sizeof(int)); |
altb | 0:d49418189c5c | 37 | for(int i = 0; i < n; i++) { |
altb | 0:d49418189c5c | 38 | Register[i] = initRegister[i]; |
altb | 0:d49418189c5c | 39 | } |
altb | 0:d49418189c5c | 40 | } |
altb | 0:d49418189c5c | 41 | |
altb | 0:d49418189c5c | 42 | float PRBS::update() |
altb | 0:d49418189c5c | 43 | { |
altb | 0:d49418189c5c | 44 | int prbs = Register[n-1]; |
altb | 0:d49418189c5c | 45 | int x = (Register[ind[0]-1] + Register[ind[1]-1])%2; |
altb | 0:d49418189c5c | 46 | for(int i = 1; i < Nind-1; i++) { |
altb | 0:d49418189c5c | 47 | x = (x + Register[ind[i+1]-1])%2; |
altb | 0:d49418189c5c | 48 | } |
altb | 0:d49418189c5c | 49 | for(int i = n-1; i > 0; i--) { |
altb | 0:d49418189c5c | 50 | Register[i] = Register[i-1]; |
altb | 0:d49418189c5c | 51 | } |
altb | 0:d49418189c5c | 52 | Register[0] = x; |
altb | 0:d49418189c5c | 53 | // printf("%4i : %4i %4i %4i %4i %4i %4i %4i %4i , %4.4f \r\n", ii, Register[0], Register[1], Register[2], Register[3], Register[4], Register[5], Register[6], Register[7], 2.0f*((float)prbs - 0.5f)); |
altb | 0:d49418189c5c | 54 | if(ii++ == Nprbs) reset(); |
altb | 0:d49418189c5c | 55 | return 2.0f*((float)prbs - 0.5f); |
altb | 0:d49418189c5c | 56 | } |
altb | 0:d49418189c5c | 57 | |
altb | 0:d49418189c5c | 58 | void PRBS::getPrbsIndex(int n) |
altb | 0:d49418189c5c | 59 | { |
altb | 0:d49418189c5c | 60 | switch (n) { |
altb | 0:d49418189c5c | 61 | case 2: |
altb | 0:d49418189c5c | 62 | Nind = 2; |
altb | 0:d49418189c5c | 63 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 64 | ind[0] = 1; |
altb | 0:d49418189c5c | 65 | ind[1] = n; |
altb | 0:d49418189c5c | 66 | break; |
altb | 0:d49418189c5c | 67 | case 3: |
altb | 0:d49418189c5c | 68 | Nind = 2; |
altb | 0:d49418189c5c | 69 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 70 | ind[0] = 1; |
altb | 0:d49418189c5c | 71 | ind[1] = n; |
altb | 0:d49418189c5c | 72 | break; |
altb | 0:d49418189c5c | 73 | case 4: |
altb | 0:d49418189c5c | 74 | Nind = 2; |
altb | 0:d49418189c5c | 75 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 76 | ind[0] = 1; |
altb | 0:d49418189c5c | 77 | ind[1] = n; |
altb | 0:d49418189c5c | 78 | break; |
altb | 0:d49418189c5c | 79 | case 5: |
altb | 0:d49418189c5c | 80 | Nind = 2; |
altb | 0:d49418189c5c | 81 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 82 | ind[0] = 2; |
altb | 0:d49418189c5c | 83 | ind[1] = n; |
altb | 0:d49418189c5c | 84 | break; |
altb | 0:d49418189c5c | 85 | case 6: |
altb | 0:d49418189c5c | 86 | Nind = 2; |
altb | 0:d49418189c5c | 87 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 88 | ind[0] = 1; |
altb | 0:d49418189c5c | 89 | ind[1] = n; |
altb | 0:d49418189c5c | 90 | break; |
altb | 0:d49418189c5c | 91 | case 7: |
altb | 0:d49418189c5c | 92 | Nind = 2; |
altb | 0:d49418189c5c | 93 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 94 | ind[0] = 1; |
altb | 0:d49418189c5c | 95 | ind[1] = n; |
altb | 0:d49418189c5c | 96 | break; |
altb | 0:d49418189c5c | 97 | case 8: |
altb | 0:d49418189c5c | 98 | Nind = 4; |
altb | 0:d49418189c5c | 99 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 100 | ind[0] = 1; |
altb | 0:d49418189c5c | 101 | ind[1] = 2; |
altb | 0:d49418189c5c | 102 | ind[2] = 7; |
altb | 0:d49418189c5c | 103 | ind[3] = n; |
altb | 0:d49418189c5c | 104 | break; |
altb | 0:d49418189c5c | 105 | case 9: |
altb | 0:d49418189c5c | 106 | Nind = 2; |
altb | 0:d49418189c5c | 107 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 108 | ind[0] = 4; |
altb | 0:d49418189c5c | 109 | ind[1] = n; |
altb | 0:d49418189c5c | 110 | break; |
altb | 0:d49418189c5c | 111 | case 10: |
altb | 0:d49418189c5c | 112 | Nind = 2; |
altb | 0:d49418189c5c | 113 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 114 | ind[0] = 3; |
altb | 0:d49418189c5c | 115 | ind[1] = n; |
altb | 0:d49418189c5c | 116 | break; |
altb | 0:d49418189c5c | 117 | case 11: |
altb | 0:d49418189c5c | 118 | Nind = 2; |
altb | 0:d49418189c5c | 119 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 120 | ind[0] = 2; |
altb | 0:d49418189c5c | 121 | ind[1] = n; |
altb | 0:d49418189c5c | 122 | break; |
altb | 0:d49418189c5c | 123 | case 12: |
altb | 0:d49418189c5c | 124 | Nind = 4; |
altb | 0:d49418189c5c | 125 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 126 | ind[0] = 4; |
altb | 0:d49418189c5c | 127 | ind[1] = 10; |
altb | 0:d49418189c5c | 128 | ind[2] = 11; |
altb | 0:d49418189c5c | 129 | ind[3] = n; |
altb | 0:d49418189c5c | 130 | break; |
altb | 0:d49418189c5c | 131 | case 13: |
altb | 0:d49418189c5c | 132 | Nind = 4; |
altb | 0:d49418189c5c | 133 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 134 | ind[0] = 8; |
altb | 0:d49418189c5c | 135 | ind[1] = 11; |
altb | 0:d49418189c5c | 136 | ind[2] = 12; |
altb | 0:d49418189c5c | 137 | ind[3] = n; |
altb | 0:d49418189c5c | 138 | break; |
altb | 0:d49418189c5c | 139 | case 14: |
altb | 0:d49418189c5c | 140 | Nind = 4; |
altb | 0:d49418189c5c | 141 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 142 | ind[0] = 2; |
altb | 0:d49418189c5c | 143 | ind[1] = 12; |
altb | 0:d49418189c5c | 144 | ind[2] = 13; |
altb | 0:d49418189c5c | 145 | ind[3] = n; |
altb | 0:d49418189c5c | 146 | break; |
altb | 0:d49418189c5c | 147 | case 15: |
altb | 0:d49418189c5c | 148 | Nind = 2; |
altb | 0:d49418189c5c | 149 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 150 | ind[0] = 14; |
altb | 0:d49418189c5c | 151 | ind[1] = n; |
altb | 0:d49418189c5c | 152 | break; |
altb | 0:d49418189c5c | 153 | case 16: |
altb | 0:d49418189c5c | 154 | Nind = 4; |
altb | 0:d49418189c5c | 155 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 156 | ind[0] = 11; |
altb | 0:d49418189c5c | 157 | ind[1] = 13; |
altb | 0:d49418189c5c | 158 | ind[2] = 14; |
altb | 0:d49418189c5c | 159 | ind[3] = n; |
altb | 0:d49418189c5c | 160 | break; |
altb | 0:d49418189c5c | 161 | case 17: |
altb | 0:d49418189c5c | 162 | Nind = 2; |
altb | 0:d49418189c5c | 163 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 164 | ind[0] = 14; |
altb | 0:d49418189c5c | 165 | ind[1] = n; |
altb | 0:d49418189c5c | 166 | break; |
altb | 0:d49418189c5c | 167 | case 18: |
altb | 0:d49418189c5c | 168 | Nind = 2; |
altb | 0:d49418189c5c | 169 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 170 | ind[0] = 11; |
altb | 0:d49418189c5c | 171 | ind[1] = n; |
altb | 0:d49418189c5c | 172 | break; |
altb | 0:d49418189c5c | 173 | case 19: |
altb | 0:d49418189c5c | 174 | Nind = 4; |
altb | 0:d49418189c5c | 175 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 176 | ind[0] = 14; |
altb | 0:d49418189c5c | 177 | ind[1] = 17; |
altb | 0:d49418189c5c | 178 | ind[2] = 18; |
altb | 0:d49418189c5c | 179 | ind[3] = n; |
altb | 0:d49418189c5c | 180 | break; |
altb | 0:d49418189c5c | 181 | default: |
altb | 0:d49418189c5c | 182 | Nind = 2; |
altb | 0:d49418189c5c | 183 | ind = (int*)malloc(Nind*sizeof(int)); |
altb | 0:d49418189c5c | 184 | ind[0] = 0; |
altb | 0:d49418189c5c | 185 | ind[1] = 0; |
altb | 0:d49418189c5c | 186 | break; |
altb | 0:d49418189c5c | 187 | } |
altb | 0:d49418189c5c | 188 | } |
altb | 0:d49418189c5c | 189 | |
altb | 0:d49418189c5c | 190 | void PRBS::printLine() |
altb | 0:d49418189c5c | 191 | { |
altb | 0:d49418189c5c | 192 | printf("-----------------------------------------------------------------------------------------\r\n"); |
altb | 0:d49418189c5c | 193 | } |
altb | 0:d49418189c5c | 194 | |
altb | 0:d49418189c5c | 195 | void PRBS::printPRBSind() |
altb | 0:d49418189c5c | 196 | { |
altb | 0:d49418189c5c | 197 | printLine(); |
altb | 0:d49418189c5c | 198 | for(int i = 0; i < Nind; i++) { |
altb | 0:d49418189c5c | 199 | printf("%6i \r\n", ind[i]); |
altb | 0:d49418189c5c | 200 | } |
altb | 0:d49418189c5c | 201 | } |
altb | 0:d49418189c5c | 202 | |
altb | 0:d49418189c5c | 203 | void PRBS::printPRBSregister() |
altb | 0:d49418189c5c | 204 | { |
altb | 0:d49418189c5c | 205 | printLine(); |
altb | 0:d49418189c5c | 206 | for(int i = 0; i < n; i++) { |
altb | 0:d49418189c5c | 207 | printf("%6i \r\n", Register[i]); |
altb | 0:d49418189c5c | 208 | } |
altb | 0:d49418189c5c | 209 | } |