2017-10-04 5 views
0

グッドデイGNUradioフローグラフオブジェクトをコントロールしようとすると:

私はgnuradioブロックを制御するために、いくつかのPythonコードを記述しようとしています。私が遭遇した問題を説明するために、サウンドカードに接続されたオーディオソースからなる簡単なフローグラフを作成しました。オーディオ周波数を制御するための単一のgnuradioコンパニオンWX GUI要素(可変スライダー)があります。私はgnuradioコンパニオンによって作成されたPythonコードを取り出し、Python内でオブジェクトを作成してから、2つのスレッドを作成しようとしました。 1つのスレッドはGNUradioオブジェクトを開始し、2番目のスレッドはユーザに周波数の入力を問い合わせ、オブジェクトの頻度を問い合わせて確認のために端末に出力します。

コードが実行されると、オーディオジェネレータが起動し、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() 

答えて

0

私は自分の質問への答えを発見したと信じています。上記のコードサンプルでは、​​ 'userInput()'定義で、変数 'toneGen.freq'を直接設定して音源ブロックの周波数を変更しようとしていました。これはうまくいかなかった。

toneGen.set_freq(int型(FREQ))この関数呼び出しが正しくオーディオ周波数のを設定します

:正しく周波数を設定するためにはtoneGenオブジェクトのメソッド「set_freq」は、この構文で使用する必要がありますジェネレータとUIスライダを更新します。