diff options
| author | Author Name <[email protected]> | 2023-07-07 12:20:59 +0930 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2023-07-07 12:29:06 +0930 |
| commit | ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch) | |
| tree | a2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /octave/gp_interleaver.m | |
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'octave/gp_interleaver.m')
| -rw-r--r-- | octave/gp_interleaver.m | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/octave/gp_interleaver.m b/octave/gp_interleaver.m new file mode 100644 index 0000000..1ee0ee3 --- /dev/null +++ b/octave/gp_interleaver.m @@ -0,0 +1,46 @@ +% 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; + +% 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) + + p = primes(Nbits); + i = 1; + while(p(i) < Nbits/1.62) + i++; + end + b = p(i); + 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 + |
