좋은 하루 :GNUradio 흐름 그래프 객체를 제어하려고 시도합니다.
나는 gnuradio 블록을 제어하기 위해 파이썬 코드를 작성하려고합니다. 내가 직면 한 문제를 설명하기 위해 사운드 카드에 연결된 오디오 소스로 구성된 간단한 플로우 그래프를 만들었습니다. 오디오 주파수를 제어하는 하나의 gnuradio 동반자 WX GUI 요소 (가변 슬라이더)가 있습니다. 나는 gnuradio companion으로 만든 파이썬 코드를 가져 와서 파이썬 안에서 객체를 생성하고 두 개의 스레드를 만들려고했다. 한 스레드는 GNUradio 객체를 시작하고 두 번째 스레드는 사용자에게 빈도를 입력하도록 쿼리 한 다음 객체의 빈도를 쿼리하고이를 확인하기 위해 터미널에 인쇄합니다.
코드가 실행되면 오디오 생성기가 시작되고 WX GUI 슬라이더가 표시되고 터미널에서 사용자에게 주파수를 입력하라는 메시지가 표시됩니다. 주파수가 터미널 쿼리를 통해 입력 될 때, 그 번호는 예상대로 되돌아 오지만 GNUradio 블록은 주파수를 변경하지 않습니다. WX GUI 슬라이더를 통해 주파수를 변경하면 예상대로 작동합니다.
분명히 변수를 GNUradio 블록에 올바르게 연결하지 않을 것입니다. 코드가 아래에 복사됩니다, 어떤 도움을 주시면 감사하겠습니다. 고맙습니다.
-Ed
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
##################################################
# GNU Radio Python Flow Graph
# Title: Top Block
# Generated: Wed Oct 4 06:04:54 2017
##################################################
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 analog
from gnuradio import audio
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from gnuradio.wxgui import forms
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx
import threading
from threading import Thread
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 = 32000
self.freq = freq = 1000
##################################################
# Blocks
##################################################
_freq_sizer = wx.BoxSizer(wx.VERTICAL)
self._freq_text_box = forms.text_box(
parent=self.GetWin(),
sizer=_freq_sizer,
value=self.freq,
callback=self.set_freq,
label="frequency",
converter=forms.float_converter(),
proportion=0,
)
self._freq_slider = forms.slider(
parent=self.GetWin(),
sizer=_freq_sizer,
value=self.freq,
callback=self.set_freq,
minimum=300,
maximum=5000,
num_steps=100,
style=wx.SL_HORIZONTAL,
cast=float,
proportion=1,
)
self.Add(_freq_sizer)
self.audio_sink_0 = audio.sink(samp_rate, "", True)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, freq, .25, 0)
##################################################
# Connections
##################################################
self.connect((self.analog_sig_source_x_0, 0), (self.audio_sink_0, 0))
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate)
def get_freq(self):
return self.freq
def set_freq(self, freq):
self.freq = freq
self.analog_sig_source_x_0.set_frequency(self.freq)
self._freq_slider.set_value(self.freq)
self._freq_text_box.set_value(self.freq)
toneGen = top_block()
def runToneGen():
toneGen.Start(True)
toneGen.Wait()
def userInput():
while True:
freq = raw_input("Enter frequency: ")
toneGen.freq = freq
print "tone generator freq set to: ",toneGen.freq," Hz"
#initiate thread to query user for freq
uiThread = Thread(target=userInput, args=())
uiThread.start()
#initiate thread to run gnuradio block
gnuThread = Thread(target=runToneGen, args=())
gnuThread.start()