[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnuradio-discuss
Subject:    Re: [Discuss-gnuradio] Cross Correlation Function
From:       Martin Dvh <gnuradiomail () olifantasia ! com>
Date:       2006-03-26 23:55:09
Message-ID: 442729DD.4070709 () olifantasia ! com
[Download RAW message or body]

sunflower wrote:
> Hi,
> Did anybody know how to implement cross correlation function? Thanks.
> It is not gr_simple_correlator, is it?
> Thanks
> 
> 
> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
> 
If you want a generic correlation function then you can do correlation in the \
frequency domain quite efficiently.

See the code below on how to do this:

This code is very well suited if you want the whole correlation function over a \
reletively large time-frame. This code is maybe not the best way when you only want \
to know where the  correlation peak is and already know where it approximately should \
be.

You can also find this code on:
http://www.olifantasia.com/pub/projects/gnuradio/mdvh/passive_radar

(Look for the file named correlator.py)
I extracted it from my passive radar experiments code which you also can find there.
(But which are not very readable)


class correlator_c(gr.hier_block):
    def __init__(self, fg,  fft_size=512,output_type='COMPLEX'):
        #This Hier_block expects an input block with two interleaved gr_complex \
                signals
        #It outputs fft_size blocks with time zero at the middle of the block
        #Output type can be chosen between 'COMPLEX', 'REAL', 'MAG' or 'ARG'
        #
        #You can use it in the following way:
        # interleaver= gr.interleave(gr.sizeof_gr_complex)
        # fg.connect(src0,(interleaver,0))
        # fg.connect(src1,(interleaver,1))
        # corr=correlator.correlator_c(fg=fg,fft_size=512,output_type='COMPLEX')
        # fg.connect(interleaver,corr)
        #


        di = gr.deinterleave(gr.sizeof_gr_complex)
        s2p_a = gr.serial_to_parallel(gr.sizeof_gr_complex, fft_size)
        s2p_b = gr.serial_to_parallel(gr.sizeof_gr_complex, fft_size)
        s2p3 = gr.serial_to_parallel(gr.sizeof_gr_complex, fft_size)
        p2s_a = gr.parallel_to_serial(gr.sizeof_gr_complex, fft_size)
        p2s_b = gr.parallel_to_serial(gr.sizeof_gr_complex, fft_size)

        mywindow = fftsink.window.blackmanharris(fft_size)

        fft_a = gr.fft_vcc(fft_size, True, mywindow)
        fft_b = gr.fft_vcc(fft_size, True, mywindow)
        ifft=gr.fft_vcc(fft_size, False, mywindow)


        conj=gr.conjugate_cc()
        mult=gr.multiply_cc()


        #get the ffts of the input signals (go from time to frequency domain)
        fg.connect((di,0),s2p_a,fft_a,p2s_a)
        fg.connect((di,1),s2p_b,fft_b,p2s_b)

        #do the correlation in the frequency domain
        fg.connect(p2s_a,conj)
        fg.connect(p2s_b,(mult,0))
        fg.connect(conj,(mult,1))

        #transform back to the time domain
        fg.connect(mult,s2p3,ifft)

        if output_type=='REAL':
          c2real = gr.complex_to_real(fft_size)
        elif output_type=='MAG':
          c2real=gr.complex_to_mag(fft_size)
        elif output_type=='ARG':
          c2real=gr.complex_to_arg(fft_size)
        if output_type=='COMPLEX':
          sink=ifft
        else:
          fg.connect(ifft,c2real)
          sink=c2real

        gr.hier_block.__init__(self, fg, di, sink)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic