三个基本概念:
flow graph
很大一部分GNURADIO程序就是一个流图。流图包括若干信号处理模块(BLock),以及一些用表示数据流的边。
BLock
所有信号处理过程在block中进行。在最好情况下,每个block只包含一项功能,这回使得GNURADIO程序更加灵活。
Block由c++书写,据说不是很难。
Data
在block间传递的数据可以是c++中的任何数据,在实际上,大多数数据类型都是复数,短实数,长整型,浮点数等。传递的数据可以是比特,也可以是样本。
流图的总结:
gnuradio 中所有的信号处理是通过流图的
一个流图由若干模块组成,每个模块会执行一个操作,例如:过滤,信号叠加,变化,解码,连接到硬件等。
信号在模块之间以多种方式传递,复数或者实整型,浮点数,或者其他我们定义的数据类型。
python
每一个流图需要至少一个信宿和信号源。
python 中一个流图的例子。
代码的位置在 : gr-audio/examples/python/dial_tone.py.
1 #!/usr/bin/env python 2 3 from gnuradio import gr 4 from gnuradio import audio, analog 5 6 class my_top_block(gr.top_block): 7 def __init__(self): 8 gr.top_block.__init__(self) 9 10 sample_rate = 32000 11 ampl = 0.1 12 13 src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 350, ampl) 14 src1 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl) 15 dst = audio.sink(sample_rate, "") 16 self.connect(src0, (dst, 0)) 17 self.connect(src1, (dst, 1)) 18 19 if __name__ == '__main__': 20 try: 21 my_top_block().run() 22 except [[KeyboardInterrupt]]: 23 pass
line 1: 告诉操作系统这是一个python文件,需要使用python解释器来运行。如果想要直接在命令行中运行该程序,则需要这一行。
line 3,lin4: 导入需要的模块,来运行gnuradio. 其作用和c语言中的 #include很想。
gr 模块,是最基本的gnuradio 模块。每一个运行gnuradio程序时都需要导入这一个模块。audio 模块, 音频设备模块
analog, 和模拟信号有关的功能和模块。
line 6-17 定义了一个类,继承于gr.top_block, 这个类可以认为是该流图的一个容器。继承于 gr.top_block的方法可以使我们方便的添加和链接模块。
我们注意到,该类中只包含一个初始化函数,用来创建这个类。 在初始化函数的第一行line8,父类
的初始化函数被调用。在python中很多类似的操作都需要显示的调用。
接下来Line10-11 定义了两个变量,用来控制采样频率和信号幅度。
Line 13-15 定义了3个block, 信号源src0,src1 和信宿 dst.
创建信号源时调用了 analog.sig_source_f(
的浮点数,在编写程序时,我们要注意其取值范围。如果输入信号是整形,gnuradio会报错,但是如果输入幅度大于1确不会报错,但是我们会得到一个错误的结果。 sample_rate, analog.GR_SIN_WAVE, frequency,ampl
)函数,而创建信宿则调用了 audio.sink中的模块。 值得主要的是audio.sink 只接受幅度为-1到+1
Line 16-17 负责连接各个模块,。
最后5行,就负责启动这个模块。
python构建流图总结:
1. 在最开始,需要导入Import 一些gnuradio模块,其中gr通常是必须的。
2. 流图保存在一个 以gr.top_block 为父类的类里面。
3. 在创建模块是,一般会调用一个函数
4. block 通过在流图类里面调用self.connect()来进行连接