diff options
| author | Marin Ivanov <[email protected]> | 2025-07-25 10:17:14 +0300 |
|---|---|---|
| committer | Marin Ivanov <[email protected]> | 2026-01-18 20:09:26 +0200 |
| commit | 0168586485e6310c598713c911b1dec5618d61a1 (patch) | |
| tree | 6aabc2a12ef8fef70683f5389bea00f948015f77 /octave/gp_interleaver.m | |
* codec2 cut-down version 1.2.0
* Remove codebook and generation of sources
* remove c2dec c2enc binaries
* prepare for emscripten
Diffstat (limited to 'octave/gp_interleaver.m')
| -rw-r--r-- | octave/gp_interleaver.m | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/octave/gp_interleaver.m b/octave/gp_interleaver.m new file mode 100644 index 0000000..c97af0f --- /dev/null +++ b/octave/gp_interleaver.m @@ -0,0 +1,59 @@ +% gp_interleaver.m +% +% David Rowe May 2017 +% +% Golden Prime Interleaver. My interprestation of "On the Analysis and +% Design of Good Algebraic Interleavers", Xie et al,eq (5). + +1; + +% return 1 if prime +function ret = is_prime(x) + for i=2:x-1 + if mod(x,i) == 0 + ret = 0; + return; + end + end + ret = 1; +end + +function x = next_prime(x) + x++; + while is_prime(x) == 0 + x++; + end +end + +% Choose b for Golden Prime Interleaver. b is chosen to be the +% closest integer, which is relatively prime to N, to the Golden +% section of N. + +function b = choose_interleaver_b(Nbits) + b = floor(Nbits/1.62); + b = next_prime(b); + assert(gcd(b,Nbits) == 1, "b and Nbits must be co-prime"); +end + + +function interleaved_frame = gp_interleave(frame) + Nbits = length(frame); + b = choose_interleaver_b(Nbits); + interleaved_frame = zeros(1,Nbits); + for i=1:Nbits + j = mod((b*(i-1)), Nbits); + interleaved_frame(j+1) = frame(i); + end +endfunction + + +function frame = gp_deinterleave(interleaved_frame) + Nbits = length(interleaved_frame); + b = choose_interleaver_b(Nbits); + frame = zeros(1,Nbits); + for i=1:Nbits + j = mod((b*(i-1)), Nbits); + frame(i) = interleaved_frame(j+1); + end +endfunction + |
