From 08dabeda61ac1063d7aba1f80334bed41b95a47f Mon Sep 17 00:00:00 2001 From: altjo87133 Date: Tue, 13 Jan 2026 10:15:31 +0100 Subject: [PATCH] 2. Test --- software/signal_processing/rand.c | 48 +++++++++++++++++++++++++++++-- software/signal_processing/sine.c | 23 ++++++++++++++- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/software/signal_processing/rand.c b/software/signal_processing/rand.c index d4fc0fd..d4b534a 100644 --- a/software/signal_processing/rand.c +++ b/software/signal_processing/rand.c @@ -2,11 +2,55 @@ #include "system/hardware_task.h" #include "system/data_channel.h" #include "system/float_word.h" +#include +#include + +int data_channel_read(uint32_t base, uint32_t * value); +int data_channel_write(uint32_t base, uint32_t value); + + +float generate_value(uint32_t lfsr) +{ + union { + uint32_t u; + float f; + } v; + + uint32_t S = (lfsr >> 31) & 0x01u; // Sign + uint32_t M = lfsr & 0x007FFFFFu; // Mantisse + uint32_t E; + uint32_t E_ = (lfsr >> 23) & 0xFFu; + + if (E_ & 0x80u) { + // 128 or 129 + E = (0x80u) | (E_ & 0x01u); + } else { + // 124..127 + E = (0x7Cu) | (E_ & 0x03u); + } + + // Zusammensetzen + v.u = (S << 31) | (E << 23) | M; + + return v.f; +} int task_rand_run( void * task ) { - // TODO - + rand_config * config = (rand_config *) task; + uint32_t data_channel_base = config->base.sink; + data_channel_clear(data_channel_base); + //srand(time(NULL)); + float_word seed = { .value = config->seed}; + uint32_t lfsr = seed.word; + for (uint32_t i = 0; i< DATA_CHANNEL_DEPTH; ++i){ + float_word res; + res.value = generate_value(lfsr); + data_channel_write(data_channel_base, res.word); + uint32_t fb = ((lfsr >> 31) ^ (lfsr >> 21) ^ (lfsr >> 1) ^ (lfsr >> 0)) & 0x1u; + lfsr = (lfsr << 1) | fb; + } + return 0; } diff --git a/software/signal_processing/sine.c b/software/signal_processing/sine.c index 3eb3ce5..d57d943 100644 --- a/software/signal_processing/sine.c +++ b/software/signal_processing/sine.c @@ -1,10 +1,31 @@ #include "system/task_sine.h" +#include "system/sine_config.h" #include "system/data_channel.h" #include "system/float_word.h" +#include +#include +#include + + +//int data_channel_write(uint32_t base, uint32_t value); + + int task_sine_run( void * data ) { - // TODO + sine_config * task = (sine_config *) data; + uint32_t data_channel_base = task->base.sink; + data_channel_clear(data_channel_base); + + for(uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i){ + float_word res; + res.value = (task->amplitude) * sin((2*M_PI*i)/(task->samples_per_periode)+task->phase); + data_channel_write(data_channel_base, res.word); +} + return 0; } + + +