discuss-gnuradio
[Top][All Lists]
Advanced

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

Re: [Discuss-gnuradio] Need Manchester Decode block to be verified to wo


From: George Barrinuevo
Subject: Re: [Discuss-gnuradio] Need Manchester Decode block to be verified to work.
Date: Wed, 11 Apr 2007 00:09:23 -0700 (PDT)

I solved the problem.  I was using gr_sync_block when
I should have been using gr_block.  When I converted
to using gr_block, all worked fine.  Also, gr_block
uses general_work() and not work().

Thanks,

--- George Barrinuevo <address@hidden> wrote:

> Hello,
> 
> I wrote my own Manchester Decode block which
> converts
> 01->1 and 10->0 bits.  Can someone verify if this is
> the correct method to do manchester decoding?  When
> I
> compared my octave m-file version results with my
> GNURadio block, the results are different.  I have
> also included the octave m-file equivalent.
> 
> #ifdef HAVE_CONFIG_H
> #include "config.h"
> #endif
> 
> #include <tdma_manchester_decode_bb.h>
> #include <gr_io_signature.h>
> 
> tdma_manchester_decode_bb_sptr
> tdma_make_manchester_decode_bb(void)
> {
>     return tdma_manchester_decode_bb_sptr(new
> tdma_manchester_decode_bb());
> }
> 
> 
> // forecast() estimates the number of input items
> (per
> stream) given a request for the number of output
> items
> (per stream).
> void tdma_manchester_decode_bb::forecast(int
> noutput_items, gr_vector_int &inputs_required)
> {
>     // samples per bit X number of outputs needed
>     int items = noutput_items*2;
>     for (unsigned int i = 0; i <
> inputs_required.size(); i++)
>         inputs_required[i] = items;
> }
> 
> 
> 
>
tdma_manchester_decode_bb::tdma_manchester_decode_bb(void)
> :
>     gr_sync_block ("manchester_decode_bb",
>                    gr_make_io_signature (1, 1,
> sizeof(unsigned char)),
>                    gr_make_io_signature (1, 1,
> sizeof(unsigned char)))
> {
>         signed char d_last_bit = -1;
>         signed char d_get_symbol_now = -1;
>         signed char d_out_bit = -1;
> 
> }
> 
> // Return Values:
> //      0  - Send this bit to the stream output.
> //      1  - Send this bit to the stream output.
> //      -1 - Do not send this bit to the stream
> output.
> signed char
> tdma_manchester_decode_bb::decode(unsigned
> char sample)
> {
> 
>     signed char output;
> 
>     output = -1;
> 
>     // Find start of transitions
>     if (sample == d_last_bit) {
>         d_get_symbol_now = 0;
>     }
> 
>     // Get Symbol
>     if (d_get_symbol_now == 1) {
>         if (sample == 1)
>             d_out_bit = 1;
>         else
>             d_out_bit = 0;
> 
>         output = d_out_bit;
>     }
> 
>     // Update private variables
>     d_last_bit = sample;
>     if (d_get_symbol_now != -1) {
>         d_get_symbol_now = !d_get_symbol_now;
>     }
> 
>     return(output);
> }
> 
> 
> // The return value is the actual number written to
> the output_items, or -1 if EOF.
> // Call consume_each() and pass it the number of
> input
> values consumed or processed.
> //   This tells indicates how many input items were
> used up.
> int tdma_manchester_decode_bb::work(int
> noutput_items,
>                           gr_vector_const_void_star
> &input_items,
>                                  
> gr_vector_void_star
> &output_items)
> {
>     unsigned char *iptr = (unsigned char *)
> input_items[0];
>     unsigned char *optr = (unsigned char *)
> output_items[0];
> 
>     int size = noutput_items;
>     int num_output_items;
>     signed char result;
> 
>     num_output_items = 0;
> 
>     for (int i = 0; i < size; i++) {
>          result = decode(*iptr++);
>          if (result != -1) {
>              *optr++ = result;
>              ++num_output_items;
>          }
>     }
> 
>     consume_each(noutput_items);
> 
>     return num_output_items;
> }
> 
> 
> =============================================
> % Octave/Matlab m-file
> %
> % Typical procedure to use:
> %       v=read_float_binary "in_file_float.txt";
> %       length(v)
> %      
> a=manchester_decode_file("out_bits_float.txt",
> v);
> %       save -ascii out_bits_ascii.txt v
> %
> function output = manchester_decode_file (filename,
> invar)
> 
>   last_bit = -1;
>   get_symbol_now = -1;
>   out_bit = -1;
> 
>   len = length(invar);
>   output = 0;
> 
>   f = fopen(filename, "wb");
> 
>   for i=1:len
>     sample = invar(i);
> 
>     % Find start of transitions
>     if sample == last_bit
>        get_symbol_now = 0;
>     end
> 
>     % Get symbol
>     if get_symbol_now == 1
>         if sample == 1
>             out_bit = 1;
>         else
>             out_bit = 0;
>         end
> 
>         # output = [output out_bit];
>         fwrite(f, out_bit, "float");
>     end
> 
>     % Update variables
>     last_bit = sample;
>     if get_symbol_now != -1
>         get_symbol_now = !get_symbol_now;
>     end
> 
>   end
> 
>   fclose(f);
> 
> 
> 
> George Barrinuevo
> address@hidden
> 
> 
> 
> _______________________________________________
> Discuss-gnuradio mailing list
> address@hidden
>
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
> 


George Barrinuevo
address@hidden





reply via email to

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