1.2. GNURadio的几个例子¶
这些例子安装在$prefix/share/doc/gnuradio-$version/。
1.2.1. Dial Tone¶
使用两种模块
- gr::analog::sig_source_f,生成 \(350Hz,440Hz\)。
- gr::audio::sink,将输出连接到语音系统,以采样率生成输出信号。audio sink可以设置两个输出。
sig_source_f (freq = 350) -->
audio.sink
sig_source_f (freq = 440) -->
dial_tone.py文件:
from gnuradio import gr
from gnuradio import audio
from gnuradio.eng_option import eng_option
from optparse import OptionParser
try:
from gnuradio import analog
except ImportError:
sys.stderr.write("Error: Program requires gr-analog.\n")
sys.exit(1)
class my_top_block(gr.top_block):
def __init__(self):
gr.top_block.__init__(self)
parser = OptionParser(option_class=eng_option)
parser.add_option("-O", "--audio-output", type="string", default="",
help="pcm output device name. E.g., hw:0,0 or /dev/dsp")
parser.add_option("-r", "--sample-rate", type="eng_float", default=48000,
help="set sample rate to RATE (48000)")
(options, args) = parser.parse_args()
if len(args) != 0:
parser.print_help()
raise SystemExit, 1
sample_rate = int(options.sample_rate)
ampl = 0.1
src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 350, ampl)
src1 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl)
dst = audio.sink(sample_rate, options.audio_output)
self.connect(src0, (dst, 0))
self.connect(src1, (dst, 1))
if __name__ == '__main__':
try:
my_top_block().run()
except KeyboardInterrupt:
pass
1.2.2. FM Modulator¶
这个例子用GRC或者GRC和Python完成。我们用GRC生成一个FM信号,然后用GRC程序或者Python程序解码。
Modulator¶
首先用控制台命令 "gnuradio-companion"运行GRC。用图形接口创建我们的流程图。这里先不详细介绍GRC接口,仅仅利用GRC程序生成数据。 GRC运行之后,打开“fm_tx.grc”。流程图中,生成了电话音频率,求和,重采样,以便我们可以通过整数倍的上采样得到宽带FM信号,然后输出。
实际例子只是为了生成FM电话音信号,保存到文件中。不需要文件太大,只要能说明问题即可。
- gr::blocks::head,模块限制进入文件的采样数量。一旦有了N个采样点,流程图就被终止了。
- gr::blocks::skiphead忽略最初的M个采样点,避免滤波器的跳变和群延时。
运行程序,可以使用"Build->Execute",或者点击工具栏上的齿轮。程序运行一会儿,一旦控制台显示了"nitems"参数设置的item数量。 在一个"dummy.dat"文件中有FM的复数采样点。
Demodulator¶
GRC程序"fm_rx.grc",对应着python脚本,"fm_demod.py"。
- gr::blocks::file_source,读取文件
- gr::analog::quadrature_demod_cf,把文件复数的FM信号转换成浮点信号。
我们把200bps输入信号重采样到44.1kbps(语音速率)。因为这个重采样不能使用整数倍的抽取速率,所以我们使用了任意速率重采样器, gr::filter::pfb_arb_resampler_fff。将输出的信号以 \(44.1Khz\) 的采样率滤波到 \(15Khz\) 的带宽,然后利用 gr::audio::sink 输出。