aboutsummaryrefslogtreecommitdiff
path: root/src/gp_interleaver.c
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 /src/gp_interleaver.c
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 'src/gp_interleaver.c')
-rw-r--r--src/gp_interleaver.c43
1 files changed, 15 insertions, 28 deletions
diff --git a/src/gp_interleaver.c b/src/gp_interleaver.c
index 6710b0c..70b8ad0 100644
--- a/src/gp_interleaver.c
+++ b/src/gp_interleaver.c
@@ -31,45 +31,32 @@
#include "gp_interleaver.h"
#include <assert.h>
+#include <math.h>
#include <stdio.h>
/*
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.
-
- Implemented with a LUT in C for convenience, Octave version
- has a more complete implementation. If you find you need some more
- numbers head back to the Octave choose_interleaver_b() function.
*/
-static const int b_table[] = {
- 48, 31, /* datac14: HRA_56_56, 40 data bits used */
- 56, 37, /* 700E: HRA_56_56 */
- 106, 67, /* 2020B: (112,56) partial protection */
- 112, 71, /* 700D: HRA_112_112 */
- 128, 83, /* datac0: H_128_256_5 */
- 192, 127, /* datac13: H_256_512_4, 128 data bits used */
- 210, 131, /* 2020: HRAb_396_504 with 312 data bits used */
- 736, 457, /* datac4: H_1024_2048_4f, 448 data bits used */
- 1024, 641, /* datac3: H_1024_2048_4f */
- 1290, 797, /* datac2: H2064_516_sparse */
- 4096, 2531 /* datac1: H_4096_8192_3d */
-};
-
-int choose_interleaver_b(int Nbits) {
- int i;
- for (i = 0; i < sizeof(b_table) / sizeof(int); i += 2) {
- if (b_table[i] == Nbits) {
- return b_table[i + 1];
- }
+int is_prime(int x) {
+ for (int i = 2; i < x; i++) {
+ if ((x % i) == 0) return 0;
}
+ return 1;
+}
- /* if we get to here it means a Nbits we don't have in our table so choke */
+int next_prime(int x) {
+ x++;
+ while (is_prime(x) == 0) x++;
+ return x;
+}
- fprintf(stderr, "gp_interleaver: Nbits: %d, b not found!\n", Nbits);
- assert(0);
- return -1;
+int choose_interleaver_b(int Nbits) {
+ int b = floor(Nbits / 1.62);
+ b = next_prime(b);
+ return b;
}
void gp_interleave_comp(COMP interleaved_frame[], COMP frame[], int Nbits) {