[Top][All Lists]

 From: Kunal Kandekar Subject: Re: [Discuss-gnuradio] A question about general_work() function Date: Tue, 10 Oct 2006 15:44:12 -0400

```Hi,
I dont know how the Viterbi algorithm works, but do you want to (a)
initialize the first 7 samples for only the first chunk of samples you
get, or (b) for every chunk of samples you get? What you have
implemented is option (b), and it seems only natural that the
initialization code would be called multiple times.

If you're looking for option (a) you would need a flag that you set
the first time general_work is called. This flag state must persist
across multiple calls to general_work, so it would be a member
variable of your signal processing block.

class my_block : public gr_block
{
private:
long    d_init;
...
};

//ctor
my_block::my_block (....) : gr_block ("my_block", ....)
{
d_init = 0;
...
}

my_block::general_work(...)
{
if( !d_init )
{
for (int i = 0; i < 7; i++) {
use in[i] to intialize the Viterbi algorithm;
}
for (int i = 7; i < ninput_terms; i++) {
use each in[i] to do Viterbi algorithm tracking;
out[n] = something
}
d_init = 1;
}
else
{
for (int i = 0; i < ninput_terms; i++) {
use each in[i] to do Viterbi algorithm tracking;
out[n] = something
}
}
}

```
```From what I have read about the Viterbi algorithm, I am assuming this
```
```algorithm is to be initialized only once, or at least once per
transmission, which means you are looking for option (a) (or a more
complex variation thereof.)

Kunal

On 10/10/06, Dawei Shen <address@hidden> wrote:
```
```It varies from time to time, but I am pretty sure it's larger than 7. It's
at least 100. Dawei

On 10/10/06, Thomas Schmid < address@hidden> wrote:
> Are you sure you get enough input items for the general_work? try to
> print ninput_items and see what the result is. It might be that you
> get always less than the 7 items you need to initialize the algorithm.
>
> Thomas
>
> On 10/10/06, Dawei Shen < address@hidden> wrote:
> > Hello Everyone
> >
> > I have got a problem which arised from my project. Here is what I want
to
> > do: I am trying to implement a Viterbi algorithm. Suppose  "in" is the
input
> > stream, I want to use in[0], in[1]....in[6], seven elements to
initialize
> > the Viterbi algorithm. Then from in[7], I start to use Viterbi algorithm
to
> > do tracking. Now the problem comes, in the "general_work()" function, I
did
> > something like this:
> >
> > int general_work(arg1, arg2, arg3, arg4) {
> >     for (int i = 0; i < 7; i++) {
> >         use in[i] to intialize the Viterbi algorithm;
> >     }
> >     for (int i = 8; i < ninput_terms; i++) {
> >         use each in[i] to do Viterbi algorithm tracking;
> >         out[n] = something
> >     }
> > }
> >
> > However, the results told me this is a wrong way. Because the
initialization
> > part (the for i=0, i<7, i++ part) would be executed for many many times.
It
> > appeared to me that the scheduler would try to call the general_work
> > function for many times and each time it calls it, everything in the
> > function would be executed from the beginning to the end. For example,
if I
> > write a line
> >
> > printf("can you see me?\n");
> >
> > and put it in front of the first 'for' iteration, I can see the printed
> > output many times. This thing totally disturbed what I wish to do. Am I
> > understood?
> >
> > Could anyone provide any help or insights? Thanks in advance.
> >
> > Best Regards
> > Dawei
```
```

```