1 //
2 // interleaver_example.c
3 //
4 // This example demonstrates the functionality of the liquid
5 // interleaver object. Interleavers serve to distribute
6 // grouped bit errors evenly throughout a block of data. This
7 // aids certain forward error-correction codes in correcting
8 // bit errors. In this example, data bits are interleaved and
9 // de-interleaved; the resulting sequence is validated to
10 // match the original.
11 // SEE ALSO: packetizer_example.c
12 //
13
14 #include <stdio.h>
15 #include <stdlib.h> // for rand()
16
17 #include "liquid.h"
18
main()19 int main() {
20 // options
21 unsigned int n=9; // message length
22
23 // create the interleaver
24 interleaver q = interleaver_create(n);
25 interleaver_set_depth(q, 4);
26 interleaver_print(q);
27
28 // create arrays
29 unsigned char x[n]; // original message data
30 unsigned char y[n]; // interleaved data
31 unsigned char z[n]; // de-interleaved data
32
33 // generate random data sequence
34 unsigned int i;
35 for (i=0; i<n; i++)
36 x[i] = rand()%256;
37
38 // interleave/de-interleave the data
39 interleaver_encode(q,x,y);
40 interleaver_decode(q,y,z);
41 //interleaver_print(q);
42
43 // print, compute errors
44 unsigned int num_errors=0;
45 printf("%6s %6s %6s\n", "x", "y", "z");
46 for (i=0; i<n; i++) {
47 printf("%6u %6u %6u\n", x[i], y[i], z[i]);
48 //printf("y[%u] = %u\n", i, (unsigned int) (y[i]));
49 //printf("y[%u] = %#0x\n", i, (unsigned int) (y[i]));
50 num_errors += (x[i]==z[i]) ? 0 : 1;
51 }
52 printf("errors: %u / %u\n", num_errors, n);
53
54 // destroy the interleaver object
55 interleaver_destroy(q);
56
57 printf("done.\n");
58 return 0;
59 }
60
61