目录
目录
指南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.结论
参考文献
脚注