初级教程(4)DSP 模块2-设计滤波器抽头(Taps)
2.设计滤波器抽头(Taps)
本教程演示如何创建滤波器抽头列表或阵列并将它们应用到低通滤波器块中。
本教程使用了之前教程低通滤波器示例中开发的流程图,因此请在继续之前完成它。下一个教程Sample Rate Change描述了如何在 GNU Radio 中执行采样率更改。
设计滤波器抽头 (Taps)
从低通滤波器示例的流程图开始,但将低通滤波器替换为Frequency Xlating FIR 滤波器并拖入低通滤波器抽头块:

Low -Pass Filter Taps模块设计了一组可应用于滤波模块的滤波器抽头。滤波器抽头也可称为权重或系数。滤波器的响应和性能取决于用户输入的参数。双击Low-Pass Filter Taps块以打开属性。编辑属性:
- Id: lowPassFilterTaps
- Cutoff Freq (Hz): samp_rate/4
- Transition Width (Hz): samp_rate/8

Low-Pass Filter Taps模块将滤波器抽头保存在lowPassFilterTaps变量内的列表中。
双击Frequency Xlating FIR Filter块以编辑属性。为Taps输入lowPassFilterTaps,并保持所有其他参数不变。将鼠标悬停在lowPassFilterTaps变量上会显示有关滤波器抽头的信息:

前几个过滤器抽头显示在列表中。GNU Radio 中的块参数接受元组、数组和列表等数据对象。在某些情况下,块要求其参数为特定数据类型。保存属性并运行流程图:

滚动滚轮并单击并选择Max Hold,然后将频率滑块缓慢拖动到所有值上。然后可以通过轮廓看到频率响应的幅度:

手动输入滤波器抽头 (Taps)
可以使用替代方法来设计滤波器抽头,然后将它们作为 Python 变量手动输入。例如,Frequency Xlating FIR 滤波器块接受作为 NumPy 数组的滤波器抽头。为了能够访问 NumPy 的函数和数据类型,需要先导入它。将Import块添加到 GRC 工作区:

双击块并添加导入语句:
将 numpy 导入为 np

可以通过将所有滤波器抽头设置为相同来设计 一个简单的移动平均滤波器或boxcar 。这可以通过使用 NumPy ones()函数来完成,该函数返回具有指定长度的所有 1 的 NumPy 数组。创建一个名为boxcarFilter的变量,其值为:
np.ones(8)/8

右键单击低通滤波器抽头,然后禁用:

然后编辑Frequency Xlating FIR Filter 的属性并将lowPassTaps替换为boxcarFilter。流程图如下所示:

运行流程图,选择Max Hold,然后扫描频率滑块。现在可以看到不同的频率响应幅度,因为使用了不同的滤波器抽头:

实数到复数滤波器
许多过滤块都有选项可以为输入和输出选择实数或复数数据类型的组合,以及实数或复数过滤器权重。此示例演示了一种如何使用复数滤波器权重将实数信号转换为复数信号的方法。通过删除boxcarFilter变量并再次启用Low-pass Filter Taps块来重新创建以下流程图:

lowPassTaps用作复杂带通滤波器的基础。用Value创建一个变量n
np.arange(0,len(lowPassTaps))
它产生一个整数数组:0、1、2、3,…直到lowPassTaps的长度:

使用Value创建frequencyShift变量:
np.exp(2j*np.pi*0.25*n)

这是一个复杂的正弦波,频率为采样率的 1/4。frequencyShift变量将lowPassTaps的中心频率从 0 更改为采样率的1/4。创建一个具有值的变量bandPassTaps:
lowPassTaps*frequencyShift

双击Frequency Xlating FIR Filter块以编辑属性。单击Type的下拉菜单并选择Real->Complex(Complex Taps):

在Frequency Xlating Filter中用bandPassTaps 替换lowPassTaps。
编辑信号源的属性并将其转换为真实信号。

流程图如下所示:

运行流程图,打开Max Hold并扫描频率变量:

频率响应的幅度显示低通滤波器的中心频率已移动到采样率的 1/4,现在是带通滤波器。现在,正频率和负频率之间的频率响应不同,这可能是复杂滤波器(但不是真正的滤波器)的特性。
下一个教程Sample Rate Change描述了如何在 GNU Radio 中执行采样率更改。