初学实例
以前我在熟悉python 的过程中,写过几个简单的程序,和初学者一起分享一下在gnuradio里面对于各个模块都有规范的命名规则,理解了以后对阅读程序很有帮助 如 信源关键字 source 例如 usrp_source_c, gr.vector_source_f 等等 信宿 sink 例如 usrp_sink_c , fft_sink_c 信号的数据格式 c 复数信号,f 实数信号
例1 模拟调幅信号的生成,及显示
这里用到了gr里面的信号生成器sig_source_f,实数乘法模块,和scopesink2里的scope_sink_f模块,fftsink2 中的 fft_sink_f 模块
1)首先产生载波信号和基带信号
sinwav=gr.sig_source_f (Fs, gr.GR_SIN_WAVE, Fc, 100)
base=gr.sig_source_f (Fs, gr.GR_SIN_WAVE, Fb, 100)# TRI,SAW, sig_source_f应该都比较熟悉了,一共有4个参数 sig_source_f(fs,wav_style,fc,am)
fs 信号的采样率,wav_style 产生周期信号的样式,如gr.GR_SIN_WAVE 正弦波 gr.GR_TRI_WAVE,三角波
fc 周期信号的频率,am 周期信号的幅度
在程序里面这个参数定义为 Fs=2e5 Fc=2e4 Fb=1e3
Fs设的足够大,以便能够看到连续的波形,而不会因为采样导致观测的信号不平滑 载波为20K的正弦信号,基带为1K的正弦信号 2)混频
这个过程就是一个乘法运算 用到了模块mul=gr.multiply_ff () 乘法的输入应该是两路信号,连接关系为 self.connect(sinwav,(mul,0)) self.connect(base,(mul,1))
3) 将结果显示
第一种方式是直接显示波形
用到了模块
scop = scopesink2.scope_sink_f(frame, sample_rate=Fs)
sample_rate=Fs 给定输入信号的速率,这个是为了定义时间尺度 vbox.Add(scop.win,1,wx.EXPAND) 将scop 添加到窗口里面
注意里面的窗口框架frame,视窗 vbox, 都是stdgui2.std_top_block 的属性
这样经过乘法以后的数据流就直接输入到了scop中用于显示 self.connect(mul,thr1,scop)
thr1 = gr.throttle(4, Fs)的目的是减缓一下数据流的速率,没有throttle 会让计算机完
全忙于处理这些流信息,从而导致死机
第二种显示方式是频谱图
fft = \\
fftsink2.fft_sink_f(frame, fft_size=1024,sample_rate=Fs,y_divs = 10,ref_scale=1000)
这里面的参数同样很直观
需要解释的是y_divs 纵坐标的分辨间隔,功率ref_scale 归一化参考值
运行的结果为
源程序数:508
example1.rar (46 K) 下载次