discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] 4-to-32 bit symbol mapper block


From: Christopher Friedt
Subject: [Discuss-gnuradio] 4-to-32 bit symbol mapper block
Date: Sat, 3 Jan 2015 12:40:28 -0500

Hi list,

I'd like to write a custom block that takes 1, 4-bit symbol and remaps
it to 1, 32-bit symbol. Some code for a general_work() method is below
[1], but it doesn't quite work yet.

It isn't convolutional - i.e. the 4-bits of symbol k, do not overlap
with the 4-bits of symbol k-1 - so it doesn't really fall into the
concept of a filter. It also must operate on multiples of 4-bits in
one operation (at least 4).

In a sense, it's an interpolating block that operates on 4 bits at a time.

I originally thought that I should be operating on vectors, but
haven't really found many examples of the stream_to_vector_ii block or
the vector_to_stream_ii block.

Does anyone on the list have any thoughts or suggestions?

Thanks,

C

[1]

#define N 4
#define M 32
#define K (M/N)

forecast():

// input items requires for nout < 4 = 0
ninput_items_required[0] = ( noutput_items / N ) * N * K;


general_work():

// input is a binary stream encoded as integers
// output is a binary stream encoded as integers

int *in = (int *) input_items[ 0 ];
int *out = (int *) output_items[ 0 ];

int j, nchips = 0;

for( j=0; j < noutput_items; j += M, nchips++, in += j/K, out += j ) {
    // FIXME: throw some sort of exception if j / K >= ninput_items
    // Do symbol-to-chip mapping
    // pack the first four input items and form a nibble
    unsigned symbol = 0;
    for( int i=0; i < N; i++ ) {
        int bit = !! in[ i ];
        symbol |= bit << i;
    }
    // form a word via the LUT
    unsigned chip = LUT[ symbol ];
    // unpack the word into output items
    for( int i=0; i < M; i++ ) {
        int bit = ( chip >> i ) & 0x1;
        out[ i ] = bit;
    }
}
// Tell runtime system how many input items we consumed on each input stream.
consume_each ( nchips * N );
// Tell runtime system how many output items we produced.
return nchips * M;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]