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