继续学习《Practical SDR: Getting Started with Software-Defined Radio》,上篇文章通过 GNU Radio 搭建了一个解调 AM 信号并播放的流程图,这一篇文章来深入了解一下信号处理的基础概念
频率
首先需要对频率这个东西有个比较直观的认识,对于我们来说最直观能够感受到的频率就是声音的频率了,声音的频率表示的是空气振动的次数,一般人类能够听到的声音频率在 20Hz 到 20kHz
我们可以在 GNU Radio 中通过 Signal Source 生成一个简单的频率,然后通过 Audio Sink 来播放,Signal Source 设置输出类型为浮点数,频率为 500Hz,振幅为 0.1,然后把它连接到 Audio Sink 模块来播放一下声音
但是发出这个声音的波形长啥样呢,可以添加一个 QT GUI Time Sink 将类型改为 float,把 Signal Source 的输出连接到 QT GUI Time Sink 的输入,另外在再添加一个 QT GUI Range 这样就可以在播放的时候通过拖拽滑块调整频率了

再次执行除了播放声音也可以看到波形图啦,修改频率除了声音会变化,也可以直观地看出来波形的变化

然而上述我们一直是在时域中绘制信号波形图,x 轴是时间,可以观察信号随着时间变化的情况,也可以在频域中绘制信号图,除了纯音之外,大部分声音都是由同时存在的不同频率组成的(无线电信号也是这样)
想要在频域中分析声音(或者无线电信号),需要一个叫做傅里叶变换的数学工具,下面我们将介绍比较常见的快速傅里叶变化(FFT),在原来的流程图中加入 QT GUI Frequency Sink,这样就可以查看频域了,执行后除了原来的波形外还可以看到一个频率图,在 0.5kHz 有一个尖峰

FFT 就像一个“频率分析仪”,把原本随时间变化的波形,转换成“各个频率的强度”,但是我们的频率是 0.5kHz,实际上放大后会发现涵盖了 400Hz 到 600Hz 这一片频率,这并不是因为这个音调存在多个频率,而是因为生成频率图的 FFT 算法在数学上不算完美,它是一种近似

修改 QT GUI Frequency Sink 的 FFT Size 参数,重新运行会发现频率现在更窄了,基本在 0.47 到 5.30 之间,FFT Size 越大意味着对相同采样率下的频谱划分越细,因此频率轴分辨率更高、波形看着更“精确”也可以尝试更高的 FFT Size 获得更精确的频率

接下来添加两个 Signal Source 模块,生成一个具有多个频率的声音,将 Signal Source 的频率分别改为:523.25、1318.5、1568,Amplitude 改为 0.1,通过 Add 模块将他们加起来(注意修改 IO Type 为 float,Num Inputs 为 3),运行可以看到在频域图上现在有三个尖峰,在时域图上波形也变得更复杂了,三个独立的信号源通过一个加法器模块

但这其实还是比较简单的,真实世界的声音要复杂得多,使用 Wav File Source 模块打开找到已经录制好的音频信号:ch_05/HumanEvents_s32k.wav,可以看到这个音频非常杂乱

增益和滤波
接下来就看一下信号处理的基础方法:增益和滤波
增益(Gain) 在信号处理中,指的是将一个信号乘以一个常数(增益系数),从而线性放大或缩小信号的振幅,这在音频信号上应用增益就表现为声音的变大或者变小
创建一个单独的 Signal Source 在其后跟一个 Multiply Const 模块设置 Constant 为 3,然后创建两个 QT GUI Time Sink。一个接收 Multiply Const 模块的输出,一个接收 Signal Source 的输出,可以看到下面的信号振幅是上面的 3 倍

滤波器是一种可以选择性的去除信号中某些部分保留其他部分的处理技术。就像净水器,将不纯净的水倒进去,过滤器滤除掉大部分杂质,同时允许水通过,最终就得到了想要的纯净水
现实世界中通过天线接收到的信号除了你真实想要的信号外,还会收到大量噪声和干扰,就需要借助滤波器把他们滤除掉,大多数滤波器是基于频率的(之前用傅里叶变换将信号分解为了其组成频率)从这种角度来看任何一个信号都是由多个频率组层的,只要通过滤波器滤除掉不想要的频率同时保留想要的频率
另一种解释是:滤波器对信号应用增益,希望保留的频率称为通带,增益为 1;希望消除的频率称为阻带,增益为 0
基于频率的滤波器主要有四种类型:低通滤波器、高通滤波器、带通滤波器、带阻滤波器
低通滤波器
低通滤波器允许信号中低频的部分通过,阻止高频的部分通过,但是这其中的高频低频是基于我们想要过滤或保留的信号自己下的定义,没有什么物理学或数学上的高频低频划分
打开之前 ch_05/solutions/cmajor.grc 这里面使用 add 模块把三种不同的频率混在了一起,让我们来尝试通过低通滤波器对他进行滤波操作,只留下特定频率的信号(比如:523.25Hz),在 add 模块和几个 Sink 模块中间加上 Low Pass Filter

调整 FIR type 为 Float -> Float(Decimating);添加两个 QT GUI Entry 模块,分别用来调整 Cutoff Freq 和 Transition Width

调整完流程图执行时应该会发现压根没变化,但是随着调整截止频率 Cutoff Freq 在 523Hz 到 1318Hz 之间比如 700,应该会观察到时域中的波形变得规律起来了,频域中另外两个比较高的峰值也会变得小了,但是并没有完全滤除

也可以修改截止频率 Cutoff Freq 在 1318.5Hz 和 1568Hz 之间,来保留两个较低的音调,同时消除最高的音调,但是因为这两个频率挨得比较近,所以 Transition Width 需要改的小一点,比如 100

Transition Width 可以这么理解:滤波器对于保留的部分增益为 1,消除的部分增益为 0,在这两者之间,增益从 1 逐渐变到 0 的部分就是过渡区域(Transition Width),这个区域虽然会有一些滤波效果,但是效果比较差,而且越接近截止频率,滤波效果就越差、越远离截止频率,滤波效果越好
高通滤波器
高通滤波器会让高于截止频率的频率通过,低于截止频率的频率滤除,可以简单地把 Low Pass Filter 换成 High Pass Filter,设置截止频率为 1500Hz,带宽为 100Hz,可以看到 1568Hz 的尖峰还正常,另外两个较低频率的尖峰已经变小了

带通滤波器
带通滤波器会有一对截止频率,通带(希望保留的频率)位于截止频率之间,低于下限截止频率和高于上限截止频率的部分都会被滤除,下面来仅保留中间的频率(1318.5Hz)
添加一个 Band Pass Filter,可以看到它需要两个截止频率,因此把原本的 cutoff_freq 复制一份,修改为 cutoff_freq_low 和 cutoff_freq_high
有个小问题,如果带通滤波器的一对截止频率初始值设置的比较随意(10kHz),导致起初频域图和时域图没有波形,但是我调整之后时域图有波形了,频域图还是没有。但是如果一开始就把参数设置好,就都可以显示


带阻滤波器
带阻滤波器会有一对截止频率,与带通滤波器相反,带阻滤波器会抑制或衰减低截止频率和高截止频率之间的频率,同时保留低于低截止频率和高于高截止频率的频率
尝试通过带阻滤波器过滤掉中间的频率(1318.5Hz),创建一个 Band Reject Filter,跟前文一样修改类型和参数变量,设置地截止频率为 1000Hz,高截止频率为 1400Hz,过渡带宽设置为 100Hz,效果不错


创建均衡器
均衡器是一种能够在不同的频率范围内独立的调整信号增益系统,比如说有几个控制不同频率的按钮,修改哪个按钮的值,哪个频率就增加,可以创建多个带通滤波器,然后通过 QT GUI Range 动态修改即可。例如修改 gain2 为 0 中间的频率就看不到了

通过创建这个均衡器,综合了滤波和增益相关的知识,通过带通滤波器对某一频率的信号应用增益使其变大或变小,有了这些基本的功能,就可以进行接下来的学习啦:AM 接收器的原理