File: interleaver_scatterplot_example.c

package info (click to toggle)
liquid-dsp 1.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,216 kB
  • sloc: ansic: 115,859; sh: 3,513; makefile: 1,350; python: 274; asm: 11
file content (144 lines) | stat: -rw-r--r-- 3,873 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//
// interleaver_scatterplot_example.c
// 
// generate interleaver scatterplot figure
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <assert.h>

#include "liquid.h"

#define OUTPUT_FILENAME "interleaver_scatterplot_example.m"

// print usage/help message
void usage()
{
    printf("interleaver_scatterplot_example [options]\n");
    printf("  u/h   : print usage\n");
    printf("  n     : number of bytes, default: 8\n");
    printf("  d     : interleaver depth, default: 4\n");
}

// find most significant bit in array (starting from left)
unsigned int interleaver_find_bit(unsigned char * _x,
                                  unsigned int _n);

int main(int argc, char*argv[]) {
    // options
    unsigned int n=8; // message length
    unsigned int depth = 4;

    int dopt;
    while ((dopt = getopt(argc,argv,"uhn:d:")) != EOF) {
        switch (dopt) {
        case 'u':
        case 'h': usage();              return 0;
        case 'n': n = atoi(optarg);     break;
        case 'd': depth = atoi(optarg); break;
        default:
            exit(1);
        }
    }

    // create the interleaver
    interleaver q = interleaver_create(n);
    interleaver_set_depth(q, depth);

    // create arrays
    unsigned char x[n]; // original message data
    unsigned char y[n]; // interleaved data

    unsigned int index[8*n];

    unsigned int i;
    unsigned int j;
    unsigned int k=0;

    // initialize data
    memset(x, 0, n*sizeof(unsigned char));
    for (i=0; i<n; i++) {
        for (j=0; j<8; j++) {
            x[i] = 1 << (8-j-1);

            // run interleaver and find most significant
            // bit in resulting array
            interleaver_encode(q,x,y);
            index[k] = interleaver_find_bit(y,n);

            // increment index counter
            k++;
        }
        // reset input message sequence
        x[i] = 0;
    }

    assert(k==8*n);

    // destroy the interleaver object
    interleaver_destroy(q);

    // write output file
    FILE * fid = fopen(OUTPUT_FILENAME,"w");
    if (fid == NULL) {
        fprintf(stderr,"error: %s, could not open file '%s' for writing.\n", argv[0],OUTPUT_FILENAME);
        exit(1);
    }
    // print header
    fprintf(fid,"%% %s : auto-generated file (do not edit)\n", OUTPUT_FILENAME);
    fprintf(fid,"%% invoked as :");
    for (i=0; i<argc; i++)
        fprintf(fid," %s",argv[i]);
    fprintf(fid,"\n");
    fprintf(fid,"clear all\n");
    fprintf(fid,"close all\n");
    fprintf(fid,"n = %u;\n", 8*n);

    // export data to file
    for (i=0; i<8*n; i++)
        fprintf(fid,"index(%6u) = %6u;\n", i+1, index[i]);
    fprintf(fid,"figure;\n");
    fprintf(fid,"i = [0:(n-1)];\n");
    fprintf(fid,"plot(i/n,index/n,'x');\n");
    fprintf(fid,"axis square\n");
    fprintf(fid,"axis([0 1 0 1]);\n");

    // close it up
    fclose(fid);

    printf("results written to '%s'\n", OUTPUT_FILENAME);

    printf("done.\n");
    return 0;
}

// find most significant bit in array (starting from left)
unsigned int interleaver_find_bit(unsigned char * _x,
                                  unsigned int _n)
{
    unsigned int i;
    for (i=0; i<_n; i++) {
        if (_x[i] != 0)
            break;
    }

    unsigned char byte = _x[i];
    // find most significant bit in byte
    switch (byte) {
    case (1<<7):    return 8*i + 0;     // 1000 0000
    case (1<<6):    return 8*i + 1;     // 0100 0000
    case (1<<5):    return 8*i + 2;     // 0010 0000
    case (1<<4):    return 8*i + 3;     // 0001 0000
    case (1<<3):    return 8*i + 4;     // 0000 1000
    case (1<<2):    return 8*i + 5;     // 0000 0100
    case (1<<1):    return 8*i + 6;     // 0000 0010
    case (1<<0):    return 8*i + 7;     // 0000 0001
    default:
        fprintf(stderr,"error: interleaver_find_bid(), invalid array\n");
        exit(1);
    }
}