diff --git a/impl/src/layer1/interleaver.c b/impl/src/layer1/interleaver.c new file mode 100644 index 0000000..eeb7242 --- /dev/null +++ b/impl/src/layer1/interleaver.c @@ -0,0 +1,39 @@ +#include "interleaver.h" + +#include "config.h" + +void interleaver_interleave(const float complex *in, float complex *out, size_t n) +{ + size_t interleaved_base = 0; + size_t interleaved_index = 0; + + /* example for this algorithm with INTERLEAVE_DISTANCE = 5: + * original: abcdefghijklmn + * output: adgjmbehkncfil + */ + for(size_t orig_index = 0; orig_index < n; orig_index++) { + out[interleaved_index] = in[orig_index]; + + interleaved_index += INTERLEAVE_DISTANCE; + if(interleaved_index >= n) { + interleaved_base++; + interleaved_index = interleaved_base; + } + } +} + +void interleaver_deinterleave(const float complex *in, float complex *out, size_t n) +{ + size_t interleaved_base = 0; + size_t interleaved_index = 0; + + for(size_t orig_index = 0; orig_index < n; orig_index++) { + out[orig_index] = in[interleaved_index]; + + interleaved_index += INTERLEAVE_DISTANCE; + if(interleaved_index >= n) { + interleaved_base++; + interleaved_index = interleaved_base; + } + } +} diff --git a/impl/src/layer1/interleaver.h b/impl/src/layer1/interleaver.h new file mode 100644 index 0000000..5bdfa71 --- /dev/null +++ b/impl/src/layer1/interleaver.h @@ -0,0 +1,11 @@ +#ifndef INTERLEAVER_H +#define INTERLEAVER_H + +#include +#include + +void interleaver_interleave(const float complex *in, float complex *out, size_t n); + +void interleaver_deinterleave(const float complex *in, float complex *out, size_t n); + +#endif // INTERLEAVER_H diff --git a/impl/test/CMakeLists.txt b/impl/test/CMakeLists.txt index 0c93622..9ac3f9e 100644 --- a/impl/test/CMakeLists.txt +++ b/impl/test/CMakeLists.txt @@ -201,3 +201,17 @@ add_executable( target_link_libraries( test_packet_queue ) + +#------------------------------------ + +add_executable( + test_interleaver + ../src/layer1/interleaver.c + ../src/layer1/interleaver.h + ../src/config.h + test_interleaver.c +) + +target_link_libraries( + test_interleaver +) diff --git a/impl/test/test_interleaver.c b/impl/test/test_interleaver.c new file mode 100644 index 0000000..2f702a7 --- /dev/null +++ b/impl/test/test_interleaver.c @@ -0,0 +1,26 @@ +#include +#include +#include + +#include + + +int main(void) +{ + const size_t N = 100; + float complex orig[N]; + float complex interleaved[N]; + float complex deinterleaved[N]; + + for(size_t i = 0; i < N; i++) { + orig[i] = (float complex)i; + } + + interleaver_interleave(orig, interleaved, N); + interleaver_deinterleave(interleaved, deinterleaved, N); + + for(size_t i = 0; i < N; i++) { + printf("%5zu %5.1f %5.1f %5.1f\n", i, crealf(orig[i]), crealf(interleaved[i]), crealf(deinterleaved[i])); + assert(orig[i] == deinterleaved[i]); + } +}