|
From: | intermilan |
Subject: | Re: [Discuss-gnuradio] help with add a new block to GNURadio |
Date: | Wed, 1 Jun 2011 09:38:51 +0800 |
hi Tom: Thank you for your reply. At the beginning, I want to tell you about the function of my block.I want to use this block to correlate the received signal(spread signal) and local PN code,after I have a the max value of the correlate value,I should use the local PN code to despread the received demodulated signal and get the original data. So my input number and output number may not be strictly 1:1. And the value of d_len is the length of PN code,it may be 7,31,etc. So it can be too large. And in the block,it firstly test the in[0]...in[d_len-1],then in[d_len]...in[2*d_len-1] in while loop, and after I get the max correlate value(which means the value of sum is lager than the threshold), then go to the for loop to despread the spread signal.and in that loop,the in pointer should be incremented until the program end. The input of the block is 0 means the inputs themselves are 0,and after several bytes it will back to the correct value as the output value of the last block.And as you suggested,I use gr_sync_block instead of the gr_block,but it work worse than before.The input still will become to 0 and will never back the correct value. In my opinion,it may be the problem of the in pointer,after the block work for a while ,the value in this pointer become to 0,and then it back the value of the output of the last block. I hope I make myself clearly.So what do you think about this problem and how to fix it. Thank you again. Inter From: address@hidden Date: Tue, 31 May 2011 13:54:44 -0400 To: address@hidden Subject: Re: [Discuss-gnuradio] help with add a new block to GNURadio 2011/5/31 intermilan <address@hidden>
I haven't looked over the code too closely, but a few comments. First, because you are consuming and returning the same number of items, you can just make this a gr_sync_block instead of a gr_block, which means you don't have to worry about the forecast function and it simplifies the interface.
On the other hand, since you need at least d_len to make a decision, you'll have to either deal with it by holding state or by forcing the scheduler to give you the correct number of samples, minimum (set_output_multiple can be useful for things like this if d_len is not too large).
Also, you are not initializing sum to anything in the work function, so the initial test in the while loop might trigger incorrectly. You are also incrementing the in pointer during the for loop, but it looks like you want to remain there until the sum is greater than your threshold. I would think that you would want to test in[0] to in[d_len-1] in one loop, then in[1] to in[d_len], and so on. Here, you are going to skip an entire d_len of inputs.
I'm not sure what you mean by the input of your block is 0. Does this mean the number of input items is 0 or that the inputs themselves are 0? Hope this helps some. Tom _______________________________________________ Discuss-gnuradio mailing list address@hidden https://lists.gnu.org/mailman/listinfo/discuss-gnuradio |
[Prev in Thread] | Current Thread | [Next in Thread] |