aboutsummaryrefslogtreecommitdiff
path: root/octave/gp_interleaver.m
diff options
context:
space:
mode:
Diffstat (limited to 'octave/gp_interleaver.m')
-rw-r--r--octave/gp_interleaver.m59
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
+