aboutsummaryrefslogtreecommitdiff
path: root/octave/gp_interleaver.m
diff options
context:
space:
mode:
authordrowe67 <[email protected]>2024-05-11 08:13:44 +0930
committerGitHub <[email protected]>2024-05-11 08:13:44 +0930
commit3d69c8d0639059851e60c0ddf882f86bf2fba380 (patch)
tree56372a673925be032aaaa8670b684a678c1ac22a /octave/gp_interleaver.m
parent6930e3c26a9d8f4f2baf5f2b8145a7216ab71d02 (diff)
parentf004b51451fe78b8f289c8a553acad06f2768d9e (diff)
Merge pull request #46 from drowe67/dr-freedata-001
FreeDATA Feature Request 001 - FreeDV API support for custom OFDM raw data modes
Diffstat (limited to 'octave/gp_interleaver.m')
-rw-r--r--octave/gp_interleaver.m29
1 files changed, 21 insertions, 8 deletions
diff --git a/octave/gp_interleaver.m b/octave/gp_interleaver.m
index 1ee0ee3..c97af0f 100644
--- a/octave/gp_interleaver.m
+++ b/octave/gp_interleaver.m
@@ -7,18 +7,31 @@
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)
-
- p = primes(Nbits);
- i = 1;
- while(p(i) < Nbits/1.62)
- i++;
- end
- b = p(i);
+ b = floor(Nbits/1.62);
+ b = next_prime(b);
assert(gcd(b,Nbits) == 1, "b and Nbits must be co-prime");
end
@@ -36,7 +49,7 @@ endfunction
function frame = gp_deinterleave(interleaved_frame)
Nbits = length(interleaved_frame);
- b = choose_interleaver_b(Nbits);
+ b = choose_interleaver_b(Nbits);
frame = zeros(1,Nbits);
for i=1:Nbits
j = mod((b*(i-1)), Nbits);