奥本海姆的《信号与系统》感觉很多地方都讲得很细,但是每次拿起来沉浸在数学中都会陷进去,不如和 gnuradio 结合食用。
虽然 gnuradio 也很复杂,但是只从用的角度是没有难度的,细节慢慢以后慢慢再看。
书中第二章的例 2.3,正好用来实战:主要分为两个部分,也就对应下面的两个公式:
- 一个是对阶跃信号指数衰减
- 一个是用阶跃响应做卷积
这次先做信号的衰减。
参考官方,的 Creating Your First Block - GNU Radio 教程:
可以模模糊糊的知道,大概是这个自己的block块会有一个线程在跑,然后gnuradio 的调度器会根据python块前面的输入buffer 和后面的输出 buffer 的 size 决定一个大小,然后把输入和输出作为参数传给 work 函数, 具体自己在实现的时候就要用 c 的引用的写法,在python 中就是 [:] 这种切片的形式。
框图如下:
python block 代码如下:
class blk(gr.sync_block):
def __init__(self, alpha=0.2):
gr.sync_block.__init__(
self,
name='alpha ** n block', # will show up in GRC
in_sig=[np.float32],
out_sig=[np.float32]
)
self.cnt = 0 # 用来统计全局计数
self.alpha = alpha
def work(self, input_items, output_items):
"""
y[n] = alpha ** n * x[n]
"""
tmp_len = len(input_items[0]) # 数据块长度
tmp_ls = self.cnt + np.arange(tmp_len) # 计算当前的 n
output_items[0][:] = np.multiply(self.alpha ** tmp_ls, input_items[0][:]) # 乘法运算
self.cnt += tmp_len # cnt 累加
return len(output_items[0]) # 返回长度
结果如下: