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