logo资料库

GNURADIO编程指南.pdf

第1页 / 共121页
第2页 / 共121页
第3页 / 共121页
第4页 / 共121页
第5页 / 共121页
第6页 / 共121页
第7页 / 共121页
第8页 / 共121页
资料共121页,剩余部分请下载后查看
目录
目录
指南1:在深入GNURadio之前,你应该…...........................
摘要
1.对GNURadio有一个清晰的轮廓…
2.GNURadio中的编程…
3.数字信号处理(DSP)
4.通信
5.准备好开始了?
参考
指南2:进入GNU软件无线电世界
摘要9
1.介绍GNU软件无线电
2.软件无线电系统的架构
3.软件
4.硬件
5.总结
指南3:USRP板
摘要
1.USRP板简介
2.USRP板的“数据表单”
指南4:通过逐行阅读FM接收代码来为GNURa
摘要
1.回顾
2.第一行
3.导入必要模块
4.wfm_rx_graph类的故事
5结论
附录:源代码
参考文献
指南5:图、块和连接
摘要
1.回顾
2.定义函数build_graph()
3.创建一个图
4.信源和信宿
5.连接
6.运行程序
7.结论
附录:源码
参考资料
指南6:探索FM接收器
摘要
1.回顾
2.从空中到计算机,从实信号到复信号
3.获得瞬时频率,从复信号到实信号
4.去加重
5.音频FIR抽取滤波器
6.结论
附录A:源码
参考文献
指南7:通过逐行阅读FM接收代码来为GNURa
摘要
1回顾
2GNURadio中的GUI工具
3处理命令行参数
4结论
参考资料
指南8:GNURadio块的字典
摘要
1介绍
2信号源
3信号接收端
4简单操作
5类型转换
6滤波器
7FFT
8其他有用的块
9结合起来
参考文献
指南9:为GNURadio写一个信号处理模块(
摘要
1.回顾
2.三万米高的视角
3.所有信号处理模块的基类:gr_block
4命名惯例
5我们的第一个模块:howto_square_f
6结论
附录A:gr_block.h的源代码
附录B:howto_square_ff.h的源代
附录C:howto_square_ff.cc的源
参考文献
脚注
指南10:为GNURadio写一个信号处理模块
摘要
1.回顾
2.SWIG文件:how.i
3.目录布局
4.改变配置和生成文件
5.Python测试脚本:qa_howto.py
6我们完成了!
7.结论
参考文献
脚注
指南1:在深入GNURadio之前,你应该…
摘要
对GNURadio有一个清晰的轮廓…
GNURadio中的编程…
数字信号处理(DSP)
通信
准备好开始了?
参考
指南2:进入GNU软件无线电世界
摘要
介绍GNU软件无线电
软件无线电系统的架构
2.1块图
2.2模数转换器(ADC)
2.3射频前端
软件
硬件
总结
指南3:USRP板
摘要
USRP板简介
USRP板的“数据表单”
2.1AD/DA转换器
2.2子板
2.3FPGA
指南4:通过逐行阅读FM接收代码来为GNURadio中的Python做准备—第一部分
摘要
回顾
第一行
#!/usr/bin/env python
$ chmod +x wfm_rcv_gui.py
$ python ./wfm_rcv_gui.py arguments
$ python
导入必要模块
from gnuradio import gr, eng_notation
from gnuradio import audio
from gnuradio import usrp
from gnuradio import blks
from gnuradio.eng_option import eng_option
from optparse import OptionParser
import sys
import math
from gnuradio.wxgui import stdgui, fftsink
import wx
/usr/local/lib/python2.4/site-packages
$export PATHONPATH=/usr/local/lib/python2.4/site-p
from gnuradio.eng_option import eng_option
from gnuradio.wxgui import stdgui, fftsink
wfm_rx_graph类的故事
类定义
class wfm_rx_graph (stdgui.gui_flow_graph):
'FLOWGRAPH'类的家族
初始化:__init__
def funcname(arg1 arg2 ...)
def __init__(self,frame,panel,vbox,argv):
stdgui.gui_flow_graph.__init__ (self,frame,panel,v
构建一个带有信源、信宿和信号处理块的图(graph)
定义的部分
IF_freq = parseargs(argv[1:])
adc_rate = 64e6
decim = 250
quad_rate = adc_rate / decim              # 256 kH
audio_decimation = 8
audio_rate = quad_rate / audio_decimation         
信号源
# usrp is data source
src = usrp.source_c (0, decim)
src.set_rx_freq (0, IF_freq)
src.set_pga(0,20)
/usr/local/lib/python2.4/site-packages/gnuradio/us
/usr/local/share/doc/usrp-x.xcvs/html
核心信号处理块’gut’
guts = blks.wfm_rcv (self, quad_rate, audio_decima
/usr/local/lib/python2.4/site-packages/gnuradio/bl
信号源
# sound card as final sink
audio_sink = audio.sink (int (audio_rate))
把它们粘在一起
# now wire it all together
self.connect (src, guts)
self.connect (guts, (audio_sink, 0))
5结论
附录:源代码
from gnuradio import gr, eng_notation
from gnuradio import audio
from gnuradio import usrp
from gnuradio import blks
from gnuradio.eng_option import eng_option
from optparse import OptionParser
import sys
import math
from gnuradio.wxgui import stdgui, fftsink
import wx
class wfm_rx_graph (stdgui.gui_flow_graph):
    def __init__(self,frame,panel,vbox,argv):
        stdgui.gui_flow_graph.__init__ (self,frame
        IF_freq = parseargs(argv[1:])
        adc_rate = 64e6
        decim = 250
        quad_rate = adc_rate / decim              
        audio_decimation = 8
        audio_rate = quad_rate / audio_decimation 
        # usrp is data source
        src = usrp.source_c (0, decim)
        src.set_rx_freq (0, IF_freq)
        src.set_pga(0,20)
        guts = blks.wfm_rcv (self, quad_rate, audi
        # sound card as final sink
        audio_sink = audio.sink (int (audio_rate))
        # now wire it all together
        self.connect (src, guts)
        self.connect (guts, (audio_sink, 0))
        if 1:
            pre_demod, fft_win1 = \
                       fftsink.make_fft_sink_c (se
                                                51
            self.connect (src, pre_demod)
            vbox.Add (fft_win1, 1, wx.EXPAND)
        if 1:
            post_deemph, fft_win3 = \
                         fftsink.make_fft_sink_f (
                                                  
            self.connect (guts.deemph, post_deemph
            vbox.Add (fft_win3, 1, wx.EXPAND)
        if 1:
            post_filt, fft_win4 = \
                       fftsink.make_fft_sink_f (se
                                                51
            self.connect (guts.audio_filter, post_
            vbox.Add (fft_win4, 1, wx.EXPAND)
def parseargs (args):
    nargs = len (args)
    if nargs == 1:
        freq1 = float (args[0]) * 1e6
    else:
        sys.stderr.write ('usage: wfm_rcv freq1\n'
        sys.exit (1)
    return freq1 - 128e6
if __name__ == '__main__':
    app = stdgui.stdapp (wfm_rx_graph, "WFM RX")
    app.MainLoop ()
PythonTut
Eric1
参考文献
指南5:图、块和连接
摘要
回顾
定义函数build_graph()
def build_graph ():
sampling_freq = 32000
ampl = 0.1
创建一个图
fg = gr.flow_graph ()
from gnuradio_swig_python import *
from basic_flow_graph import *
from flow_graph import *
from exceptions import *
from hier_block import *
/usr/local/python2.4/site-packages/gnuradio/gr/bas
class endpoint (object):
    __slots__ = ['block', 'port']
    def __init__ (self, block, port):
        self.block = block
        self.port = port
    __slots__ = ['src', 'dst']
    def __init__ (self, src_endpoint, dst_endpoint
        self.src = src_endpoint
        self.dst = dst_endpoint
class basic_flow_graph (object):
    '''basic_flow_graph - describe connections bet
    __slots__ = ['edge_list']
    def __init__ (self):
        self.edge_list = []
/usr/local/python2.4/site-packages/gnuradio/gr/flo
class flow_graph (basic_flow_graph):
    """
    __slots__ = ['blocks', 'scheduler']
    def __init__ (self):
        basic_flow_graph.__init__ (self);
        self.blocks = None
        self.scheduler = None
def _setup_connections (self):
    """given the basic flow graph, setup all the p
    self.validate ()
    self.blocks = self.all_blocks ()
    self._assign_details ()
    self._assign_buffers ()
    self._connect_inputs ()
def _assign_details (self):
    ...
def _assign_buffers (self):
    """determine the buffer sizes to use, allocate
    ...
def _connect_inputs (self):
    """connect all block inputs to appropriate ups
    ...
信源和信宿
4.1信源
src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_W
src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_W
/usr/local/share/doc/gnuradio-core-2.5cvs/html/ind
4.2信宿
dst = audio.sink (sampling_freq)
/usr/local/lib/python2.4/site-packages/gnuradio/au
连接
fg.connect (src0, (dst, 0))
fg.connect (src1, (dst, 1))
def connect (self, *points):
    '''connect requires two or more arguments that
    endpoints. If more than two arguments are prov
    connected together successively.
    '''
    if len (points) < 2:
        raise ValueError, ("connect requires at le
        %d provided." % (len (points),))
    for i in range (1, len (points)):
        self._connect (points[i-1], points[i])
def coerce_endpoint (x):
    if isinstance (x, endpoint):
        return x
    elif isinstance (x, types.TupleType) and len (
        return endpoint (x[0], x[1])
    elif hasattr (x, 'block'):          # assume i
        return endpoint (x, 0)
    elif isinstance(x, hier_block.hier_block_base)
        return endpoint (x, 0)
    else:
        raise ValueError, "Not coercible to endpoi
运行程序
if __name__ == '__main__':
    fg = build_graph ()
    fg.start ()
    raw_input ('Press Enter to quit: ')
    fg.stop ()
if __name__ == '__main__':
    The testing code
    ...
def start (self):
    '''start graph, forking thread(s), return imme
    if self.scheduler:
        raise RuntimeError, "Scheduler already run
    self._setup_connections ()
    # cast down to gr_module_sptr
    # t = [x.block () for x in self.topological_so
    self.scheduler = scheduler (self)
    self.scheduler.start ()
def stop (self):
    if self.scheduler:
        self.scheduler.stop ()
        self.scheduler = None
结论
附录:源码
fromgnuradioimportgr
fromgnuradioimportaudio
defbuild_graph():
sampling_freq=32000
ampl=0.1
fg=gr.flow_graph()
src0=gr.sig_source_f(sampling_freq,gr.GR_S
src1=gr.sig_source_f(sampling_freq,gr.GR_S
dst=audio.sink(sampling_freq)
fg.connect(src0,(dst,0))
fg.connect(src1,(dst,1))
returnfg
if__name__=='__main__':
fg=build_graph()
fg.start()
raw_input('PressEntertoquit:')
fg.stop()
参考资料
指南6:探索FM接收器
摘要
回顾
从空中到计算机,从实信号到复信号
src = usrp.source_c (0, decim)    # decim = 250, s
src.set_rx_freq (0, IF_freq)      # IF_freq = our 
src.set_pga(0,20)
return freq1 - 128e6
    [0, 32M]    normal
    [32M, 64M]  inverted
    [64M, 96M]  normal
    [96M, 128M] inverted
获得瞬时频率,从复信号到实信号
guts = blks.wfm_rcv (self, quad_rate, audio_decima
self.connect (src, guts)
self.connect (guts, (audio_sink, 0))
f(t) = k * m(t) + fc
Part of gr_quadrature_demod_cf.cc
...
int
gr_quadrature_demod_cf::sync_work (
    int noutput_items,
    gr_vector_const_void_star &input_items,
    gr_vector_void_star &output_items)
{
  gr_complex *in = (gr_complex *) input_items[0];
  float *out = (float *) output_items[0];
  in++;         // ensure that in[-1] is valid
  for (int i = 0; i < noutput_items; i++){
    gr_complex product = in[i] * conj (in[i-1]);
    out[i] = d_gain * arg (product);
  }
  return noutput_items;
}
fm_demod_gain = quad_rate/(2*math.pi*max_dev)
去加重
Part of fm_emph.py
...
#           1
# H(s) = -------
#         1 + s
#
# tau is the RC time constant.
# critical frequency: w_p = 1/tau
#
# We prewarp and use the bilinear z-transform to g
# See "Digital Signal Processing: A Practical Appr
#
class fm_deemph(gr.hier_block):
    """
    FM Deemphasis IIR filter.
    """
    def __init__(self, fg, fs, tau=75e-6):
        """
        @type fs: float
        @param tau: Time constant in seconds (75us
        @type tau: float
        """
        w_p = 1/tau
        w_pp = math.tan (w_p / (fs * 2)) # prewarp
        a1 = (w_pp - 1)/(w_pp + 1)
        b0 = w_pp/(1 + w_pp)
        b1 = b0
        btaps = [b0, b1]
        ataps = [1, a1]
        deemph = gr.iir_filter_ffd(btaps, ataps)
        gr.hier_block.__init__(self, fg, deemph, d
音频FIR抽取滤波器
self.audio_filter = gr.fir_filter_fff (audio_decim
vector< float > gr_firdes::low_pass ( double      
                                      double      
                                      double      
                                      double      
                                      win_type    
                                      double      
                                     )   [static]
width_of_transition_band = audio_rate / 32
audio_coeffs = gr.firdes.low_pass (volume,        
                                   quad_rate,     
                                   audio_rate/2 - 
                                   width_of_transi
                                   gr.firdes.WIN_H
fg.connect (self.fm_demod, self.deemph, self.audio
gr.hier_block.__init__(self,
                       fg,
                       self.fm_demod,       # head
                       self.audio_filter)   # tail
结论
附录A:源码
from gnuradio import gr
from gnuradio.blksimpl.fm_emph import fm_deemph
import math
classwfm_rcv(gr.hier_block):
def__init__(self,fg,quad_rate,audio_decim
"""
Hierarchicalblockfordemodulatingabroa
Theinputisthedownconvertedcomplexbas
Theoutputisthedemodulatedaudio(float
@paramfg:flowgraph.
@typefg:flowgraph
@paramquad_rate:inputsamplerateofcom
@typequad_rate:float
@paramaudio_decimation:howmuchtodecim
@typeaudio_decimation:integer
"""
volume=20.
max_dev=75e3
fm_demod_gain=quad_rate/(2*math.pi*max_d
audio_rate=quad_rate/audio_decimation
#Weassigntoselfsothatoutsiderscan
#iftheyneedto.E.g.,toplotitsoutp
#
#input:complex;output:float
self.fm_demod=gr.quadrature_demod_cf(fm
#input:float;output:float
self.deemph=fm_deemph(fg,quad_rate)
#computeFIRfiltertapsforaudiofilter
width_of_transition_band=audio_rate/32
audio_coeffs=gr.firdes.low_pass(volume,
quad_ra
audio_r
Eric2
width_o
gr.fird
#input:float;output:float
self.audio_filter=gr.fir_filter_fff(aud
fg.connect(self.fm_demod,self.deemph,se
gr.hier_block.__init__(self,
fg,
self.fm_demod,
self.audio_filter)
参考文献
指南7:通过逐行阅读FM接收代码来为GNURadio中的Python做准备—第二部分
摘要
1回顾
2GNURadio中的GUI工具
2.1频谱分析器—ffi_sink
    if 1:
        pre_demod, fft_win1 = \
                    fftsink.make_fft_sink_c (self,
                                                51
        self.connect (src, pre_demod)
        vbox.Add (fft_win1, 1, wx.EXPAND)
/site-packages/gnuradio/wxgui/fftsink.py
...
def make_fft_sink_c(fg, parent, title, fft_size, i
    block = fft_sink_c(fg, parent, title=title, ff
                sample_rate=input_rate, y_per_div=
    return (block, block.win)
self.connect (src, pre_demod)
2.2wxPython是怎么扮演它的角色的
if __name__ == '__main__':
    app = stdgui.stdapp (wfm_rx_graph, "WFM RX")
    app.MainLoop ()
from gnuradio.wxgui import stdgui, fftsink
class stdapp (wx.App):
    def __init__ (self, flow_graph_maker, title="G
        self.flow_graph_maker = flow_graph_maker
        self.title = title
        # All our initialization must come before 
        # OnInit is called from somewhere in the g
        wx.App.__init__ (self)
    def OnInit (self):
        frame = stdframe (self.flow_graph_maker, s
        frame.Show (True)
        self.SetTopWindow (frame)
        return True
class stdframe (wx.Frame):
    def __init__ (self, flow_graph_maker, title="G
        # print "stdframe.__init__"
        wx.Frame.__init__(self, None, -1, title)
        self.CreateStatusBar (2)
        mainmenu = wx.MenuBar ()
        menu = wx.Menu ()
        item = menu.Append (200, 'E&xit', 'Exit')
        self.Bind (wx.EVT_MENU, self.OnCloseWindow
        mainmenu.Append (menu, "&File")
        self.SetMenuBar (mainmenu)
        self.Bind (wx.EVT_CLOSE, self.OnCloseWindo
        self.panel = stdpanel (self, self, flow_gr
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.panel, 1, wx.EXPAND)
        self.SetSizer(vbox)
        self.SetAutoLayout(True)
        vbox.Fit(self)
    def OnCloseWindow (self, event):
        self.flow_graph().stop()
        self.Destroy ()
    def flow_graph (self):
        return self.panel.fg
wx.Frame(Parent, Id, "title")
self.panel = stdpanel (self, self, flow_graph_make
class stdpanel (wx.Panel):
    def __init__ (self, parent, frame, flow_graph_
        wx.Panel.__init__ (self, parent, -1)
        self.frame = frame
        vbox = wx.BoxSizer (wx.VERTICAL)
        self.fg = flow_graph_maker (frame, self, v
        self.SetSizer (vbox)
        self.SetAutoLayout (True)
        vbox.Fit (self)
        self.fg.start ()
Add(self, item, proportion=0, flag=0)
class stdpanel (wx.Panel):
    def __init__ (self, parent, frame, flow_graph_
        ......
        vbox = wx.BoxSizer (wx.VERTICAL)
        self.fg = flow_graph_maker (frame, self, v
        self.SetSizer (vbox)
        self.SetAutoLayout (True)
        vbox.Fit (self)
        self.fg.start ()
if 1:
        pre_demod, fft_win1 = \
                    fftsink.make_fft_sink_c (self,
                                                51
        self.connect (src, pre_demod)
        vbox.Add (fft_win1, 1, wx.EXPAND)
/site-packages/gnuradio/wxgui/fftsink.py
...
def make_fft_sink_c(fg, parent, title, fft_size, i
    block = fft_sink_c(fg, parent, title=title, ff
                sample_rate=input_rate, y_per_div=
    return (block, block.win)
2.3“示波器”—scope-sink
if 1:
    scope_input, scope_win1 = \
                 scopesink.make_scope_sink_f (self
    self.connect (signal, scope_input)
    vbox.Add (scope_win1, 1, wx.EXPAND)
PLRO
3处理命令行参数
self.fg = flow_graph_maker (frame, self, vbox, sys
4结论
参考资料
WX1
WX2
指南8:GNURadio块的字典
摘要
1介绍
/usr/local/share/doc/gnuradio-core-x.xcvs/html/ind
/usr/local/share/doc/usrp-x.xcvs/html/index.html
2信号源
2.1正弦和余弦源
gr.sig_source_c [f, i, s]   ( double sampling_freq
                              gr_waveform_t wavefo
                              double frequency,
                              double amplitude,
                              gr_complex [float, i
    gr.GR_CONST_WAVE
    gr.GR_COS_WAVE
    gr.GR_SIN_WAVE
2.2噪声源
gr.noise_source_c [f, i, s] ( gr_noise_type_t type
                              float amplitude,
                              long seed )
    GR_UNIFORM
    GR_GAUSSIAN
    GR_LAPLACIAN
    GR_IMPULSE
2.3Null源
gr.null_source(size_tsizeof_stream_item)
2.4向量源
gr.vector_source_c [f, i, s, b] ( const std::vecto
                     bool    repeat = false )
(gr_complex can be replaced by float, integer, sho
src_data = (-3, 4, -5.5, 2, 3)
src = gr.vector_source_f (src_data)
2.5文件源
gr.file_source ( size_t         itemsize,
                 const char *   filename,
                 bool           repeat )
src = gr.file_source (gr.sizeof_char, "/home/dshen
2.6音频源
gr.audio_source (int sampling_rate)
2.7USRP源
usrp.source_c (s) (int              which_board,
                   unsigned int     decim_rate,
                   int              nchan = 1,
                   int              mux = -1,
                   int              mode = 0 )
usrp_decim = 250
src = usrp.source_c (0, usrp_decim)
3信号接收端
3.1Null接收端
gr.null_sink ( size_t  sizeof_stream_item )
3.2向量接收端
gr.vector_sink_c [f, i, s, b] ()
dst = gr.vector_sink_f ()
3.3文件接收端
gr.file_sink ( size_t         itemsize,
               const char *   filename )
src = gr.file_source (gr.sizeof_char, "/home/dshen
3.4音频接收端
gr.audio_source (int sampling_rate)
3.5USRP接收端
usrp.sink_c (s) ( int              which_board,
                  unsigned int     interp_rate,
                  int              nchan = 1,
                  int              mux = -1 )
usrp_interp = 256
src = usrp.sink_c (0, usrp_interp)
4简单操作
4.1添加一个常量
gr.add_const_cc [ff, ii, ss, sf] ( gr_complex [flo
4.2加法器
gr.add_cc [ff, ii, ss] ( )
adder = gr.add_cc ()
fg.connect (stream1, (adder, 0))
fg.connect (stream2, (adder, 1))
fg.connect (stream3, (adder, 2))
fg.connect (adder, outputstream)
4.3减法器
gr.sub_cc [ff, ii, ss] ( )
subtractor = gr.sub_cc ()
fg.connect (stream1, (subtractor, 0))
fg.connect (stream2, (subtractor, 1))
fg.connect (stream3, (subtractor, 2))
fg.connect (subtractor, outputstream)
4.4乘以一个常量
gr.add_const_cc [ff, ii, ss] ( gr_complex [float, 
4.5乘法器
gr.multiply_cc [ff, ii, ss] ( )
multiplier = gr.multiply_cc ()
fg.connect (stream1, (multiplier, 0))
fg.connect (stream2, (multiplier, 1))
fg.connect (stream3, (multiplier, 2))
fg.connect (multiplier, outputstream)
4.6除法器
gr.divide_cc [ff, ii, ss] ( )
divider = gr.divide_cc ()
fg.connect (stream1, (divider, 0))
fg.connect (stream2, (divider, 1))
fg.connect (stream3, (divider, 2))
fg.connect (divider, outputstream)
4.7Log函数
gr.nlog10_ff ( float n,
               unsigned vlen )
5类型转换
5.1复数转换
gr.complex_to_float
gr.complex_to_real
gr.complex_to_imag
gr.complex_to_mag
gr.complex_to_arg
gr.complex_to_float( unsigned int vlen )
gr.complex_to_real( unsigned int vlen )
gr.complex_to_imag( unsigned int vlen )
gr.complex_to_mag( unsigned int vlen )
gr.complex_to_arg( unsigned int vlen )
5.2浮点型转换
gr.float_to_complex
 gr.float_to_short
gr.short_to_float
gr.float_to_complex ( )
gr.float_to_short ( )
gr.short_to_float ( )
6滤波器
6.1滤波器设计
6.1.1低通滤波器
vector< float > gr.firdes::low_pass ( double      
                                      double      
                                      double      
                                      double      
                                      win_type    
                                      double      
    WIN_HAMMING
    WIN_HANN
    WIN_BLACKMAN
    WIN_RECTANGULAR
6.1.2高通滤波器
vector< float > gr.firdes::high_pass ( double     
                                       double     
                                       double     
                                       double     
                                       win_type   
                                       double     
6.1.3带通滤波器
vector< float > gr.firdes::band_pass ( double     
                                       double     
                                       double     
                                       double     
                                       double     
                                       win_type   
                                       double     
6.1.4带阻滤波器
vector< float > gr.firdes::band_reject ( double   
                                         double   
                                         double   
                                         double   
                                         double   
                                         win_type 
                                         double   
6.1.5希尔伯特滤波器
vector< float > gr.firdes::hilbert ( unsigned int 
                                     win_type    w
                                     double      b
6.1.6升余弦滤波器
vector< float > gr.firdes::root_raised_cosine ( do
                                                do
                                                do
                                                do
                                                in
6.1.7高斯滤波器
vector< float > gr.firdes::gaussian ( double      
                                      double      
                                      double      
                                      double      
                                      int         
6.2FIR抽取滤波器
gr.fir_filter_ccc
 gr.fir_filter_ccf
gr.fir_filter_fcc
gr.fir_filter_fff
gr.fir_filter_fsf
gr.fir_filter_scc
gr.fir_filter_cc (int decimation,
                       const std::vector< gr_compl
gr.fir_filter_ccf (int decimation,
                       const std::vector< float > 
gr.fir_filter_fcc (int decimation,
                       const std::vector< gr_compl
gr.fir_filter_fff (int decimation,
                       const std::vector< float > 
gr.fir_filter_fsf (int decimation,
                       const std::vector< float > 
gr.fir_filter_scc (int decimation,
                       const std::vector< gr_compl
6.3FIR插值滤波器
gr.interp_fir_filter_ccc
gr.interp_fir_filter_ccf
gr.interp_fir_filter_fcc
gr.interp_fir_filter_fff
gr.interp_fir_filter_fsf
gr.interp_fir_filter_scc
gr.interp_fir_filter_ccc (unsigned interpolation,
                              const std::vector< g
gr.interp_fir_filter_ccf (unsigned interpolation,
                              const std::vector< f
gr.interp_fir_filter_fcc (unsigned interpolation,
                              const std::vector< g
gr.interp_fir_filter_fff (unsigned interpolation,
                              const std::vector< f
gr.interp_fir_filter_fsf (unsigned interpolation,
                              const std::vector< f
gr.interp_fir_filter_scc (unsigned interpolation,
                              const std::vector< g
6.4带有FIR抽取滤波器的数字下变频转换器
gr.freq_xlating_fir_filter_ccc
gr.freq_xlating_fir_filter_ccf
gr.freq_xlating_fir_filter_fcc
gr.freq_xlating_fir_filter_fcf
gr.freq_xlating_fir_filter_scc
gr.freq_xlating_fir_filter_scf
gr.freq_xlating_fir_filter_ccc [ccf, fcc, fcf, scc
                               ( int      decimati
                                 const std::vector
                                 double      cente
                                 double      sampl
6.5希尔伯特变换滤波器
gr.hilbert_fc( unsigned int ntaps )
6.6滤波延迟组合滤波器
gr.filter_delay_fc( const std::vector< float > &  
6.7IIR滤波器
gr.iir_filter_ffd ( const std::vector< double > & 
                    const std::vector< double > & 
6.8单级IIR滤波器
用法:
gr.single_pole_iir_filter_ff ( double alpha,
                    unsigned int    v
7FFT
gr.fft_vcc
gr.fft_vfc
gr.fft_vcc ( int     fft_size,
                 bool    forward,
                 bool    window )
gr.fft_vfc ( int     fft_size,
                 bool    forward,
                 bool    window )
8其他有用的块
8.1FM调制和解调
gr.frequency_modulator_fc ( double sensitivity )
gr.quadrature_demod_cf ( float gain )
8.2数控振荡器
void    set_phase (float angle)
void    adjust_phase (float delta_phase)
void    set_freq (float angle_rate)
void    adjust_freq (float delta_angle_rate)
void    step ()
void    step (int n)
float   get_phase () const
float   get_freq () const
void    sincos (float *sinx, float *cosx) const
float   cos () const
float   sin () const
8.3数字传输块
gr.bytes_to_syms
gr.simple_framer
gr.simple_correlator
gr.bytes_to_syms ( )
gr.simple_framer ( int payload_bytesize )
gr.simple_correlator ( int payload_bytesize )
9结合起来
onl
参考文献
指南9:为GNURadio写一个信号处理模块(第一部分)
摘要
1.回顾
2.三万米高的视角
3.所有信号处理模块的基类:gr_block
3.1用于输入输出的类:gr_io_signature
3.2灵活的指针:Boost
3.2.1什么是Boost?
3.2.2什么是灵活的指针
3.2.3怎样应用GNURadio中的灵活指针
3.3GNURadio中的数据类型
3.4一个模块的核心:general_work()方法
3.5简单介绍其它方法和成员变量
3.5.1forecast()方法
3.5.2d_output_multiple和set_output_multiple()方法
3.5.3d_relative_rate和set_relative_rate()方法
4命名惯例
4.1包前缀
4.2类数据成员(实例变量)
4.3文件命名
4.4后缀
5我们的第一个模块:howto_square_ff
5.1构造函数
5.2突出核心的方法:general_work()
6结论
附录A:gr_block.h的源代码
附录B:howto_square_ff.h的源代码
附录C:howto_square_ff.cc的源代码
参考文献
脚注
指南10:为GNURadio写一个信号处理模块(第二部分)
摘要
1.回顾
2.SWIG文件:how.i
layout
3.目录布局
3.1构建需要的自动工具
3.1.1Automake
3.1.2Autoconf
3.1.3Libtool
3.2构建树和安装树
3.3检查
4.改变配置和生成文件
4.1/src/lib/Makefile.am
4.2topdir/configure.ac
4.3/src/python/Makefile.am
5.Python测试脚本:qa_howto.py
6我们完成了!
7.结论
参考文献
脚注
目录 目录................................................................................................................................................... 1 指南 1:在深入 GNU Radio 之前,你应该…................................................6 摘要.................................................................................................................................. 6 1. 对 GNU Radio 有一个清晰的轮廓…...................................................................... 6 2. GNU Radio 中的编程….......................................................................................... 6 3. 数字信号处理(DSP)............................................................................................ 7 4. 通信............................................................................................................................ 8 5. 准备好开始了?........................................................................................................ 8 参考.................................................................................................................................. 8 指南 2:进入 GNU 软件无线电世界.................................................................................... 9 摘要.................................................................................................................................. 9 1. 介绍 GNU 软件无线电..............................................................................................9 2. 软件无线电系统的架构............................................................................................ 9 3. 软件............................................................................................................................11 4. 硬件...........................................................................................................................13 5. 总结...........................................................................................................................14 指南 3:USRP 板................................................................................................................. 15 摘要.................................................................................................................................15 1. USRP 板简介............................................................................................................15 1
2. USRP 板的“数据表单”.......................................................................................16 指南 4:通过逐行阅读 FM 接收代码来为 GNU Radio 中的 Python 做准备—第一部分21 摘要.................................................................................................................................21 1. 回顾............................................................................................................................21 2. 第一行......................................................................................................................22 3. 导入必要模块..........................................................................................................23 4. wfm_rx_graph 类的故事....................................................................................... 25 5 结论............................................................................................................................ 31 附录:源代码.................................................................................................................31 参考文献........................................................................................................................34 指南 5:图、块和连接........................................................................................................ 35 摘要................................................................................................................................35 1. 回顾...........................................................................................................................35 2. 定义函数 build_graph()........................................................................................35 3. 创建一个图..............................................................................................................36 4. 信源和信宿..............................................................................................................39 5. 连接...........................................................................................................................41 6. 运行程序..................................................................................................................42 7. 结论..........................................................................................................................44 附录:源码....................................................................................................................44 参考资料........................................................................................................................45 指南 6:探索 FM 接收器.................................................................................................... 46 2
摘要................................................................................................................................46 1. 回顾...........................................................................................................................46 2. 从空中到计算机,从实信号到复信号..................................................................46 3. 获得瞬时频率,从复信号到实信号...................................................................... 47 4. 去加重..................................................................................................................... 49 5. 音频 FIR 抽取滤波器............................................................................................. 50 6. 结论..........................................................................................................................52 附录 A:源码............................................................................................................... 52 参考文献........................................................................................................................54 指南 7:通过逐行阅读 FM 接收代码来为 GNU Radio 中的 Python 做准备—第二部分55 摘要................................................................................................................................55 1 回顾............................................................................................................................ 55 2 GNU Radio 中的 GUI 工具....................................................................................55 3 处理命令行参数....................................................................................................... 62 4 结论...........................................................................................................................62 参考资料........................................................................................................................62 指南 8:GNU Radio 块的字典..........................................................................................64 摘要................................................................................................................................64 1 介绍............................................................................................................................64 2 信号源.......................................................................................................................64 3 信号接收端............................................................................................................... 67 4 简单操作................................................................................................................... 69 3
5 类型转换................................................................................................................... 72 6 滤波器....................................................................................................................... 73 7 FFT............................................................................................................................ 79 8 其他有用的块........................................................................................................... 80 9 结合起来.................................................................................................................... 81 参考文献........................................................................................................................82 指南 9:为 GNU Radio 写一个信号处理模块(第一部分)............................................. 82 摘要................................................................................................................................82 1.回顾............................................................................................................................82 2.三万米高的视角........................................................................................................83 3.所有信号处理模块的基类:gr_block.....................................................................83 4 命名惯例.....................................................................................................................91 5 我们的第一个模块:howto_square_ff..................................................................93 6 结论........................................................................................................................... 97 附录 A:gr_block.h 的源代码.................................................................................... 98 附录 B:howto_square_ff.h 的源代码..................................................................... 101 附录 C:howto_square_ff.cc 的源代码.................................................................. 104 参考文献......................................................................................................................106 脚注..............................................................................................................................106 指南 10:为 GNU Radio 写一个信号处理模块(第二部分)...................................... 107 摘要.............................................................................................................................. 107 1.回顾........................................................................................................................... 107 4
2.SWIG 文件:how.i.................................................................................................107 3.目录布局................................................................................................................... 110 4.改变配置和生成文件............................................................................................... 113 5.Python 测试脚本:qa_howto.py...........................................................................118 6 我们完成了!...........................................................................................................119 7.结论.......................................................................................................................... 120 参考文献......................................................................................................................120 脚注............................................................................................................................... 121 5
RadioRadio 指南 1111:在深入 GNUGNUGNUGNU Radio Radio 之前,你应该… 摘要 GNU Radio 不但需要很强的计算机能力,而且也需要渊博的通信与数字信号处理知识。 本文列举了一些有用的资源,包括书本、网页链接、在线指南。本文的目的是帮助 GNU Radio 爱好者们准备好这些有用工具。 我干脆认为你已经对 GNU Radio 产生了浓厚的兴趣,而且渴望去玩转它。不幸的是除 了兴趣以外,这个过程中还包含许多其它的挑战。你需要很多领域的知识,包括通信(无线) 系统,数字信号处理,基本硬件和电路设计,面向对象编程等。但是,你的兴趣与激情可以 是这些变得更加容易。在本文中,我列举了一些有用的文章和资源。这些文章和资源在你深 入 GNU Radio 之前是非常重要的。本文中也包含了非常好的 GNU Radio 社区建议阅读的 资源,这些都是非常有用的信息。 1.1.1.1. 对 GNUGNUGNUGNU RadioRadioRadioRadio 有一个清晰的轮廓… 如果你对 GNU Radio 还没有一个清晰的轮廓的话,请首先阅读 Eric Blossom 的在线 文章《开发 GNU Radio》。这本书对软件无线电做了非常简洁而准确的介绍,Eric 是整个 GNU Radio 项目的发起者。你确定已经理解了数模转换器是怎样工作的和为什么需要射频 前端,回忆一下《信号与系统》课上学的抽样定理,然后再仔细看《泛在软件无线电外围设 备(USRP)》和《FPGA 中做了些什么》这两部分。本文也提供了两个例子:一个简单拨号 音输出和调频接收机,你至少应该理解第一个例子。不能理解“调频接收机”这个例子?没 关系,读 Eric Blossom 的第二篇文章《一步一步实现用软件收听调频无线电台》。你不需要 一行一行去理解代码,但是你应该了解信号流是怎样从空中到达声卡的。然后,你最好尽可 能多的了解 USRP 所进行的处理工作,“USRP 维基”和“USRP 用户向导”这两页将会非 常有用。假设你已经阅读了上面的所有文章,你还可以去“GNU Radio 维基”网页上寻找 更多的信息。 2.2.2.2.GNUGNUGNUGNU RadioRadioRadioRadio 中的编程… 为了真正地“玩转”GNU Radio,你应该有能力自己写代码。从《开发 GNU Radio》 这篇文章中,你应该已经了解到 GNU Radio 的软件架构包含两层,所有的信号处理模块是 用 C++写的,Python 用来创建一个网络或图和将这些模块粘合在一起。所以,在这种特殊 的场景中,Python 是一种高层语言。GNU Radio 项目提供了许多有用的和经常使用的模块, 所以,在许多情形下,你不需要接触 C++,仅仅用 Python 就可以完成你的任务。但是,为 了做更复杂的工作,你不得不用 C++去创建你自己的模块。在这种情况下,Eric Blossom 的一篇在线文章《怎样去写一个模块》就是你所需的。你可能想知道哪些模块已经提供给我 6
们了?不幸的是,不像其它开发工具,如 TinyOS,GNU Radio 在这点上的记录文档很糟 糕,但是你还是有两个非常有用的文章,这两个文档是在安装完“gnuradio-core”和”usrp” 模块后用 Doxygen 生成的,你可以找到两个 html 包,这两个包位于 /usr/local/share/doc/gnuradio-core-x.xcvs/html/index.html /usr/local/share/doc/usrp-x.xcvs/html/index.html 我把它们放在了我的浏览器的收藏夹中。尽管这些不是足够的清晰,但是它们可以告诉 我们很多信息。第一个文档可以在这里在线获得。 如果你以前没有机会去使用的 Python 的话,请阅读 Python 在线指南。最重要的部分 是: � 第二部分:使用 Python 解释器 � 第三部分:对 Python 的非正式简介 � 第六部分:模块 � 第七部分:输入和输出 � 第九部分:类 这些将在 GNU Radio 的编程中经常使用。如果面向对象编程(OOP)听起来不熟悉的 话,你应该更加仔细的读第九部分。下面这些链接也可以帮助教你领会面向对象的本质。 � 课程:面向对象编程的概念 � C++面向对象编程简介 � 面向对象编程网页 不管怎样,在这阶段 Python 看起来是非常重要的,所以必须确保你能很好的掌握它。 3.3.3.3.数字信号处理(DSPDSPDSPDSP) 我想我们中的大部分人都已经上过《信号与系统》这门课,我们在那门课中学到的东西 在这儿非常有用。但是,仅仅这些是不够的。如果我们将信号变到模拟域或数字域、变到时 域或频域,你必须确保不会迷失。底线是你应该知道什么是抽样定律、什么是 Z 变化、怎 样获得信号的频谱和有限冲击响应滤波器(FIR)与无限冲击响应滤波器的概念。我在这儿 推荐几本经典的书。 � 《信号与系统(第二版)》——Alan V. Oppenheim, Alan S. Willsky � 《离散时间信号处理(第二版)》——Alan V. Oppenheim, Ronald W. Schafer, John R. � 《数字信号处理:原理、算法和应用(第三版)》——John G. Proakis, Dimitris M. 读关于离散时间傅立叶变化和有限冲击响应滤波器(FIR)、无线冲击响应滤波器(IIR) 的章节。我知道这些书都非常贵而且乏味,这儿有一些有用的在线资源: � 数字信号处理指南 7
� 科技人员的数字信号处理向导 4.4.4.4.通信 我们知道我们发送或接受的真实信号不处于基带,它们需要调制和解调。我认为你已经 在一些课程上学习了调幅和跳频无线电的概念,这两个概念都属于模拟世界。为了开发更好 和更有吸引力的方法,我们需要数字通信。在这点上,特别重要且有趣的是数字调制与解调、 同步,这些知识在你的高年级课程“通信系统”中会讲述。更重要的是,我推荐你读: � 第四章和第五章,《数字通信(第四版)》——John G. Proakis 这些知识在这两章中介绍得非常准确。这儿还有一本经典的书: � 《通信系统中的数字信号处理》——Marvin E. Frerking 这本书是实际工程关注的,它包含大量例子。Frerking 对一个给定的发射机或接收机设计问 题常常给出多种解决方法,在这本书中实际算法的提出多于纯理论讨论。可以把它当作一本 通信系统设计的字典。 5.5.5.5.准备好开始了? 以上我列举了四个主题,这并不意味着在你可以用 GNU Radio 做些事情之前,你必须 的把这四个主题一个接一个的学习完。你诚然可以通过修课来学习它们,但是至少你应该读 在上面第一部分和第二部分提到的第一篇文章。然后,你可以试着去做这些练习: 在’gnuradio-example’模块中,你可以在’gnuradio-example/python/usrp/这个文件夹中找 到许多示例代码。你可以一行一行地读懂并理解下面两个程序中的代码吗? � gnuradio-examples/python/usrp/am_rcv.py � gnuradio-examples/python/usrp/wfm_rcv_gui.py 如果是这样的话,我可以说你已经前进了一大步。 参考 所有本文中提到的书、在线资源。 8
分享到:
收藏