aboutsummaryrefslogtreecommitdiff
path: root/octave/gp_interleaver.m
diff options
context:
space:
mode:
authorAuthor Name <[email protected]>2023-07-07 12:20:59 +0930
committerDavid Rowe <[email protected]>2023-07-07 12:29:06 +0930
commitac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch)
treea2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /octave/gp_interleaver.m
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'octave/gp_interleaver.m')
-rw-r--r--octave/gp_interleaver.m46
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
+