|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include "system/task_rand.h"
- #include "system/hardware_task.h"
- #include "system/data_channel.h"
- #include "system/float_word.h"
-
- #include "stdio.h"
-
- #define POLYNOM ((1 << 31)|(1 << 21)|(1 << 1)|(1 << 0))
-
- int32_t shift_lsfr(int32_t *lsfr) {
- int feedback;
-
- feedback = *lsfr & 1;
-
- *lsfr >>= 1;
-
- if(feedback == 1)
- *lsfr ^= POLYNOM;
- return *lsfr;
-
- }
-
- int32_t pot(int32_t base, int exp) {
- int32_t res = 1;
- while(exp-- >= 0)
- res *= base;
-
- return res;
- }
-
- uint8_t clamp_value(uint8_t value) {
-
- if(value & 128) {
- value &= 0b10000001;
- //value &= ((1 << 7) | (1 << 0));
- } else {
- //value |= ~((1 << 1) | (1 << 0));
- value |= 0b01111100;
- }
- return value;
-
- }
-
- int task_rand_run( void * task ) {
-
- rand_config* config = ( rand_config* ) task;
- float_word seed = { .value = config->seed };
-
- uint32_t lfsr = seed.word;
-
- uint32_t data_channel_base = config->base.sink;
- data_channel_clear(data_channel_base);
-
- for(uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
- float_word res, value;
-
- //res.value = lfsr;
- //
-
-
- uint32_t E = (value.word >> 23) & 0xff;
- E = clamp_value(E);
-
- res.word = value.word;
- res.word &= ~(0xFF << 23);
- res.word |= (E << 23);
-
- value.word = shift_lsfr(&lfsr) ;
-
- data_channel_write( data_channel_base, res.word);
- }
-
- return 0;
- }
-
|