discuss-gnuradio
[Top][All Lists]
Advanced

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

[Discuss-gnuradio] moving_average_ff


From: Wolfgang Buesser
Subject: [Discuss-gnuradio] moving_average_ff
Date: Sat, 29 Dec 2018 21:50:18 +0100

o.k,

I find compiling gnuradio and uhd from source not that easy: I keep getting 
compiler-error-messages 
and messages about missing dependencies in the process.
I will try to upgrage my Ubuntu.
In the meantime I ran across and OOT-module named vave, which does what I want. 
I tried to modify 
it to take complex vectors, but upon execution in grc I get the error message:

ValueError: itemsize mismatch: multiply_conjugate_cc0:0 using 8192, vave_cc0:0 
using 16384

The original code with float64 in place of complex works fine.

Something is wrong with the size of the interface, but I can't figure out what 
it might be 1024xcomplex
should be 1024*2*32/8=8192 and not 16384 ???

Many thanks for your hints,

Wolfgang


Here is what the top-python looks like

self.connect((self.blocks_multiply_conjugate_cc_0, 0), 
(self.test_blocks_vave_cc_0, 0))
...
self.blocks_multiply_conjugate_cc_0 = blocks.multiply_conjugate_cc(1024)
...
self.connect((self.blocks_multiply_conjugate_cc_0, 
0)(self.test_blocks_vave_cc_0, 0))

This is vave_cc.py:

#!/usr/bin/env python                                                           
                                                                                
                                                                            
# -*- coding: utf-8 -*-                                                         
                                                                                
                                                                            
#                                                                               
                                                                                
                                                                            
# Copyright 2018 <+YOU OR YOUR COMPANY+>.                                       
                                                                                
                                                                            
#                                                                               
                                                                                
                                                                            
# This is free software; you can redistribute it and/or modify                  
                                                                                
                                                                            
# it under the terms of the GNU General Public License as published by          
                                                                                
                                                                            
# the Free Software Foundation; either version 3, or (at your option)           
                                                                                
                                                                            
# any later version.                                                            
                                                                                
                                                                            
#                                                                               
                                                                                
                                                                            
# This software is distributed in the hope that it will be useful,              
                                                                                
                                                                            
# but WITHOUT ANY WARRANTY; without even the implied warranty of                
                                                                                
                                                                            
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                 
                                                                                
                                                                            
# GNU General Public License for more details.                                  
                                                                                
                                                                            
#                                                                               
                                                                                
                                                                            
# You should have received a copy of the GNU General Public License             
                                                                                
                                                                            
# along with this software; see the file COPYING.  If not, write to             
                                                                                
                                                                            
# the Free Software Foundation, Inc., 51 Franklin Street,                       
                                                                                
                                                                            
# Boston, MA 02110-1301, USA.                                                   
                                                                                
                                                                            
#                                                                               
                                              
import copy
from gnuradio import gr

class vave_cc(gr.decim_block):
    """                                                                         
                                                                                
                                                                            
    Vector Average with Decimation.   Only one vector is returned for N input.  
                                                                                
                                                                            
    This block is intended to reduce the downstream CPU load.                   
                                                                                
                                                                            
    """
    def __init__(self, vlen, vdecimate):
        gr.decim_block.__init__(self,
            name="vave_cc",
            in_sig=[(numpy.complex, int(vlen))],
            out_sig=[(numpy.complex, int(vlen))],
            decim=int(vdecimate))
        self.vlen = int(vlen)
        self.vdecimate = int(vdecimate)
        self.sum = numpy.zeros(self.vlen)
        self.count = 0
        self.oneovern = 1./complex(self.vdecimate)

    def forecast( self, noutput_items, ninput_items):
        if noutput_items == None:
            return self.vdecimate
#        print 'Forecast: ', noutput_items                                      
                                                                                
                                                                            
        for i in range(len(nout_items)):
            ninput_items[i] = noutput_items[i]*self.vdecimate
#        print 'Forecast: ', ninput_items                                       
                                                                                
                                                                            
        return ninput_items
#        return self.vdecimate                                                  
                                                                                
                                                                            

    def work(self, input_items, output_items):
        """                                                                     
                                                                                
                                                                            
        Work averages all input vectors and outputs one vector for all inputs   
                                                                                
                                                                            
        """
        inn = input_items[0]

        # get the number of input vectors                                       
                                                                                
                                                                            
        n = len( input_items)  # number of input PORTS (only 1)                 
                                                                                
                                                                            
        nv = len(inn)          # number of vectors in this port                 
                                                                                
                                                                            

        nout = len( output_items) #number of putput ports                       
                                                                                
                                                                            
        ini = inn[0]           # first input vector                             
                                                                                
                                                                            
        li = len(ini)          # length of first input vector                   
                                                                                
                                                                            
#        print 'Number work vectors: ', nv, ' Length: ',li                      
                                                                                
                                                                            
        ncp = min( li, self.vlen)

        noutports = len( output_items)
        if noutports != 1:
            print '!!!!!!! Unexpected number of output ports: ', noutports
        out = output_items[0]  # vectors in PORT 0                              
                                                                                
                                                                            
        nout = len(out)        # number of output vectors                       
                                                                                
                                                                            
        out0 = out[0]          # get the first output vector                    
                                                                                
                                                                            
        lo = len(out0)         # length of 1st output vector                    
                                                                                
                                                                            
#        print 'Number work outputs: ', nout,' Length: ',lo                     
                                                                                
                                                                            

        iout = 0 # count the number of output vectors                           
                                                                                
                                                                            
        for i in range(nv):
            # get the lenght of one input                                       
                                                                                
                                                                            
            ini = inn[i]
            ncp = min( li, self.vlen)

            # now save this vector until all are received                       
                                                                                
                                                                            
            self.sum[0:ncp] = self.sum[0:ncp] + ini[0:ncp] 
            self.count = self.count + 1
            # indicate consumption of a vector from input                       
                                                                                
                                                                            
            if self.count >= self.vdecimate:                # normalize output 
average                                                                         
                                                                                
                                                         self.sum = 
self.oneovern * self.sum#                out0[:] = copy.deepcopy(self.sum)      
                                                                                
                                                                                
                                    outi = out[iout]                outi = 
self.sum                out[iout] = outi                iout = iout+1           
     # now reset the count and restart the sum                                  
                                                                                
                                                                                
 self.count = 0                self.sum = numpy.zeros( self.vlen)#              
  self.produce(0,len(output_items[0]))                                          
                                                                                
                                                             #                
self.consume_each(nv)                                                           
                                                                                
                                                           #                
return no                                                                       
                                                                                
                                                                   # end for 
all input vectors                                                               
                                                                                
                                                                  # if here, 
then not enough vectors input to produce an output                              
                                                                                
                                                         #        
self.consume(0,nv)                                                              
                                                                                
                                                                           
output_items[0] = out#        print 'N outputs: ', len(output_items[0]), iout   
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
  
                self.sum = self.oneovern * self.sum
#                out0[:] = copy.deepcopy(self.sum)                              
                                                                                
                                                                            
                outi = out[iout]
                outi = self.sum
                out[iout] = outi
                iout = iout+1
                # now reset the count and restart the sum                       
                                                                                
                                                                            
                self.count = 0
                self.sum = numpy.zeros( self.vlen)
#                self.produce(0,len(output_items[0]))                           
                                                                                
                                                                            
#                self.consume_each(nv)                                          
                                                                                
                                                                            
#                return no                                                      
                                                                                
                                                                            
        # end for all input vectors                                             
                                                                                
                                                                            
        # if here, then not enough vectors input to produce an output           
                                                                                
                                                                            
#        self.consume(0,nv)                                                     
                                                                                
                                                                            
        output_items[0] = out
#        print 'N outputs: ', len(output_items[0]), iout                        
                                                                                
                                                                            
        return len(output_items[0])
    # end vave_cc()    





reply via email to

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