2017-10-04 8 views
0

좋은 하루 :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() 

답변

0

나는 내 자신의 질문에 대한 답을 발견했다 생각합니다. 위의 코드 샘플에서 'userInput()'정의에서 'toneGen.freq'변수를 직접 설정하여 톤 제너레이터 블록의 빈도를 변경하려고했습니다. 이것은 작동하지 않았다.

toneGen.set_freq (INT (주파수))이 함수 호출 정확하게 오디오 주파수를 설정한다

: 정확히 주파수를 설정하기 위해서 toneGen 객체의 메소드 'set_freq'는이 구문 사용해야 생성기 및 UI 슬라이더를 업데이트하십시오.