Seite 1 von 1

Gnuradio

Verfasst: Dienstag 9. August 2016, 13:41
von raspberrygps
Hallo zusammen,

ich beschäftige mich gerade mit der SDR Programm GNURadio.
Welches mir durch zusammensetzen von Funktionsblöcken ein Fertiges Python Programm ausgibt.
Nun suche ich in diesem Python Programm die Ausgaben der Variablen über die Signalstärke.
Bild
so sieht die grafische Ausgabe meines Zusammengesetzen Programm aus (TOP_BLOCK).
Wo finde ich jetzt in dem Code die Variablen damit ich diese in einem anderen Python Programm einbinden und weiter verarbeiten kann.

Code: Alles auswählen

if __name__ == '__main__':
    import ctypes
    import sys
    if sys.platform.startswith('linux'):
        try:
            x11 = ctypes.cdll.LoadLibrary('libX11.so')
            x11.XInitThreads()
        except:
            print "Warning: failed to XInitThreads()"

from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import wxgui
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from gnuradio.wxgui import numbersink2
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import osmosdr
import time
import wx


class top_block(grc_wxgui.top_block_gui):

    def __init__(self):
        grc_wxgui.top_block_gui.__init__(self, title="Top Block")
        _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png"
        self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY))

        ##################################################
        # Variables
        ##################################################
        self.samp_rate = samp_rate = 2000000

        ##################################################
        # Blocks
        ##################################################
        self.wxgui_numbersink2_0 = numbersink2.number_sink_c(
        	self.GetWin(),
        	unit="Units",
        	minval=-100,
        	maxval=100,
        	factor=1.0,
        	decimal_places=10,
        	ref_level=0,
        	sample_rate=samp_rate,
        	number_rate=15,
        	average=False,
        	avg_alpha=None,
        	label="Number Plot",
        	peak_hold=False,
        	show_gauge=True,
        )
        self.Add(self.wxgui_numbersink2_0.win)
        self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" )
        self.rtlsdr_source_0.set_sample_rate(samp_rate)
        self.rtlsdr_source_0.set_center_freq(1067e5, 0)
        self.rtlsdr_source_0.set_freq_corr(0, 0)
        self.rtlsdr_source_0.set_dc_offset_mode(0, 0)
        self.rtlsdr_source_0.set_iq_balance_mode(0, 0)
        self.rtlsdr_source_0.set_gain_mode(True, 0)
        self.rtlsdr_source_0.set_gain(10, 0)
        self.rtlsdr_source_0.set_if_gain(20, 0)
        self.rtlsdr_source_0.set_bb_gain(20, 0)
        self.rtlsdr_source_0.set_antenna("", 0)
        self.rtlsdr_source_0.set_bandwidth(0, 0)
          

        ##################################################
        # Connections
        ##################################################
        self.connect((self.rtlsdr_source_0, 0), (self.wxgui_numbersink2_0, 0))    

    def get_samp_rate(self):
        return self.samp_rate

    def set_samp_rate(self, samp_rate):
        self.samp_rate = samp_rate
        self.rtlsdr_source_0.set_sample_rate(self.samp_rate)


def main(top_block_cls=top_block, options=None):

    tb = top_block_cls()
    tb.Start(True)
    tb.Wait()


if __name__ == '__main__':
    main()
Das Hauptprogramm

Code: Alles auswählen

##################################################
import number_window
import common
from gnuradio import gr, filter
from gnuradio import analog
from gnuradio import blocks
from pubsub import pubsub
from constants import *

##################################################
# Number sink block (wrapper for old wxgui)
##################################################
class _number_sink_base(gr.hier_block2, common.wxgui_hb):
	"""
	An decimator block with a number window display
	"""

	def __init__(
		self,
		parent,
		unit='units',
		minval=0,
		maxval=1,
		factor=1,
		decimal_places=3,
		ref_level=0,
		sample_rate=1,
		number_rate=number_window.DEFAULT_NUMBER_RATE,
		average=False,
		avg_alpha=None,
		label='Number Plot',
		size=number_window.DEFAULT_WIN_SIZE,
		peak_hold=False,
		show_gauge=True,
		**kwargs #catchall for backwards compatibility
	):
		#ensure avg alpha
		if avg_alpha is None: avg_alpha = 2.0/number_rate
		#init
		gr.hier_block2.__init__(
			self,
			"number_sink",
			gr.io_signature(1, 1, self._item_size),
			gr.io_signature(0, 0, 0),
		)
		#blocks
		sd = blocks.stream_to_vector_decimator(
			item_size=self._item_size,
			sample_rate=sample_rate,
			vec_rate=number_rate,
			vec_len=1,
		)
		if self._real:
			mult = blocks.multiply_const_ff(factor)
			add = blocks.add_const_ff(ref_level)
			avg = filter.single_pole_iir_filter_ff(1.0)
		else:
			mult = blocks.multiply_const_cc(factor)
			add = blocks.add_const_cc(ref_level)
			avg = filter.single_pole_iir_filter_cc(1.0)
		msgq = gr.msg_queue(2)
		sink = blocks.message_sink(self._item_size, msgq, True)
		#controller
		self.controller = pubsub()
		self.controller.subscribe(SAMPLE_RATE_KEY, sd.set_sample_rate)
		self.controller.publish(SAMPLE_RATE_KEY, sd.sample_rate)
		self.controller[AVERAGE_KEY] = average
		self.controller[AVG_ALPHA_KEY] = avg_alpha
		def update_avg(*args):
			if self.controller[AVERAGE_KEY]: avg.set_taps(self.controller[AVG_ALPHA_KEY])
			else: avg.set_taps(1.0)
		update_avg()
		self.controller.subscribe(AVERAGE_KEY, update_avg)
		self.controller.subscribe(AVG_ALPHA_KEY, update_avg)
		#start input watcher
		common.input_watcher(msgq, self.controller, MSG_KEY)
		#create window
		self.win = number_window.number_window(
			parent=parent,
			controller=self.controller,
			size=size,
			title=label,
			units=unit,
			real=self._real,
			minval=minval,
			maxval=maxval,
			decimal_places=decimal_places,
			show_gauge=show_gauge,
			average_key=AVERAGE_KEY,
			avg_alpha_key=AVG_ALPHA_KEY,
			peak_hold=peak_hold,
			msg_key=MSG_KEY,
			sample_rate_key=SAMPLE_RATE_KEY,
		)
		common.register_access_methods(self, self.controller)
		#backwards compadibility
		self.set_show_gauge = self.win.show_gauges
		#connect
		self.wxgui_connect(self, sd, mult, add, avg, sink)

class number_sink_f(_number_sink_base):
	_item_size = gr.sizeof_float
	_real = True

class number_sink_c(_number_sink_base):
	_item_size = gr.sizeof_gr_complex
	_real = False

# ----------------------------------------------------------------
# Standalone test app
# ----------------------------------------------------------------

import wx
from gnuradio.wxgui import stdgui2

class test_app_flow_graph(stdgui2.std_top_block):
    def __init__(self, frame, panel, vbox, argv):
        stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv)

        # build our flow graph
        input_rate = 20.48e3

        # Generate a real and complex sinusoids
        src1 = analog.sig_source_f(input_rate, analog.GR_SIN_WAVE, 2.21e3, 1)
        src2 = analog.sig_source_c(input_rate, analog.GR_SIN_WAVE, 2.21e3, 1)

        # We add these throttle blocks so that this demo doesn't
        # suck down all the CPU available.  Normally you wouldn't use these.
        thr1 = blocks.throttle(gr.sizeof_float, input_rate)
        thr2 = blocks.throttle(gr.sizeof_gr_complex, input_rate)

        sink1 = number_sink_f(panel, unit='V',label="Real Data", avg_alpha=0.001,
			      sample_rate=input_rate, minval=-1, maxval=1,
			      ref_level=0, decimal_places=3)
        vbox.Add(sink1.win, 1, wx.EXPAND)
        sink2 = number_sink_c(panel, unit='V',label="Complex Data", avg_alpha=0.001,
			      sample_rate=input_rate, minval=-1, maxval=1,
			      ref_level=0, decimal_places=3)
        vbox.Add(sink2.win, 1, wx.EXPAND)

        self.connect(src1, thr1, sink1)
        self.connect(src2, thr2, sink2)

def main ():
    app = stdgui2.stdapp(test_app_flow_graph, "Number Sink Test App")
    app.MainLoop()

if __name__ == '__main__':
    main()

Das Nebenprogramm

ich würde mich echt sehr freuen wenn jmd das Analysieren kann und mir sagen kann weclhes die Variable sein könnte die ich dann in einem anderen Programm einbinden kann.

MFG raspberrygps

Re: Gnuradio

Verfasst: Dienstag 16. August 2016, 08:42
von BlackJack
@raspberrygps: Das ist wohl weniger eine allgemeine Python-Frage, sondern mehr eine Frage der API von Gnuradio. Scheint eine Architektur mit Quellen und Senken zu sein, die jeweils eine bestimmte API implementieren. Und es sieht so aus, als wenn hier solche Bausteine die bereits fertig vorhanden sind, ”einfach zusammen gesteckt” werden. Die Werte werden also von der Quelle „RTL-SDR Source“ direkt an die Senke „WX GUI Number Sink“ weitergegeben, ohne zwischendurch an irgendwelche Namen gebunden zu werden, über die man darauf zugreifen könnte.

Wahrscheinlich müsste man sich eine eigene Senke programmieren um an die Werte zu kommen.