Sample rate 采样率
奈奎斯特原理揭示了一个最小的采样率(信号频率的两倍)。香农版本的表述如下:
如果一个函数 $x(t)$ 包含的频率不超过 $BHz$, 使用间距在 $1/(2B)$ 秒的纵坐标就可以确定这个函数
按照下图构建流图
Sample_rate 设置为$32khz$.
双击QT GUI Range,这是一个用图形化界面改变变量值的控件,可以看到Id是freq,而Signal Source模块里的Frequency设置的值正是freq,这样就可以在图形中拖动滑块改变Signal Source的频率值。
运行效果如下:
当频率设置为2k,可以看到下面图里的FFT分析出信号的频率是2k。
当频率设置为14k,可以看到下面图里的FFT分析出信号的频率是14k。
当频率设置为16k,可以看到下面图里的FFT分析出信号的频率是16k。
但是当频率设置为17k时,可以看到下面图里的FFT分析出信号的频率却是15k。这说明出现了信号频率的错误识别。根据奈奎斯特原理,我们设置的32k采样率只能识别16k以下的信号频率。
Source硬件的例子
There are several factors which determine the rate at which data flows from one block to the next. However, many beginners assume that if, for example, a waveform source is set to a certain frequency, and a sample rate is set, then that output signal will be at that rate. But, as opposed to a hardware circuit, ** the signal is just data in a buffer. **
教程中是使用了一个RadioTeleTYpe (RTTY) 的例子来讲解,github上的GRC源码, 由于github时而不好用,我把gr-RTTY-basics对应的repository下载下来了,可以在压缩包里找到 gr-RTTY-basics/RTTY_rcv/RTTY_receive.grc,用GRC导入即可。
这是一个业余的电传打字机的实现,有兴趣的可以进一步了解。在这里只需要知道,这个系统通过高低频率来表示一个符号1/0,然后在接收端每五个符号进行解码,从而知道发送的是什么字母/数字。
频移键控(FSK)[1]音调被输入(需要发射端输入,这个rev流图里并没有)到采样率为48khz的计算机麦克风插口。这些数据被输入到一个频率压缩FIR滤波器,它会使音调在中心频率上下移动。它还将采样率除以50(降采样),输出采样率为960。正交调制产生的信号是正的或负的取决于音调是高于或低于中心频率。根据定义,RTTY符号时间正好是22毫秒。为了得到每个符号的整数个样本数,选择了500的采样率,每个符号时间产生11($0.022 \time 500$)个样本。
以上各个模块的作用:
- Audio Source 读取音频设备信号作为输入
- Frequency Xlating FIR Filter 这个模块做了一系列操作,包括频率平移->FIR滤波->下采样,可以作为一个频段选择器[2]。(几个需要解释的参数:Decimation下采样倍数, ) FIR数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带外信号的目的
-
Simple squelch 基于平均信号功率按照一定阈值进行滤波。如果平均输入为>=阈值,则输出等于输入,否则为零。平均信号是通过IIR滤波器实现的。(IIR滤波器可以读这篇文章理解[3])
-
Rational Resampler 有理重采样多相FIR滤波器
-
Quadrature Demod 用来解调FM, FSK, GMSK等。输入是复基带,输出是信号频率与采样率的关系,乘以增益。
-
Multiply Const 将输入流乘以标量或向量常数(如果是向量按照元素相乘) output = input * constant
-
Binary Slicer 切片一个浮点值产生1位输出。正输入产生二进制1,负输入产生二进制0。
-
Terminal Display Sink 是一个嵌入式Python块,它读取1和0的输入流,在开始位上同步,从5个数据位创建一个Baudot字符,将Baudot转换为UTF-8,并输出字符到ZMQ PUSH消息接收器。
-
ZMQ PUSH Message Sink 从消息端口接收pmt消息,并通过ZMQ PUSH套接字发送它们。它在指定的端口上执行一个“绑定”。它将与来自GNU Radio流图或外部进程的ZMQ PULL套接字互操作。
Sink硬件的例子
由硬件接收器控制的时序必须通过从输出开始并通过流程图反向工作来进行分析。
这个例子在github上也可以找到相应代码,只不过版本已经变化,所致只需要看教程里的图即可。'莫尔斯码矢量源’是一个嵌入式Python块,它从’QT GUI消息编辑框’获取字符,并将它们转换为矢量,其中每个1是一个点位时间,每个0是一个位时间的空间。
对于本例,输出Audio Sink的采样率为48khz。这是由一个Rational Resampler提供的,它将采样率插值(乘以)4,因此输入采样率必须是12000 (12khz)。乘、IIR Filter和Uchar to Float块不会改变采样率。Repeat块获取输入的每个数据项并将其重复1200次。(这是插值的一种形式。)这迫使输入采样率为10,这是所需的波特率。为了提供不同的代码速度,Variable块定义了以下内容:
- speed (每分钟字数)可以由用户设置为以下任意值:2、3、4、6、8、12、16或24(所有都是48的因数)。
- baud 波特率变量= speed / 1.2
- repeat 变量固定为1200。
- samp_rate 采样率= baud * repeat
When there is no hardware block
一些流程图,如测试或模拟,不涉及任何硬件设备来设置采样率。在这些情况下,可以使用节流块(Throttle block)代替。
这个流程图显示了与、或和异或逻辑块的使用。由于不涉及硬件设备,Throttle block确保处理器不会锁定试图在其最大可能的速度处理数据。
注意,Throttle block甚至不需要在“主”数据路径中工作。
这是学习Gnuradio Wiki [4] 的笔记。这一节对应教程4 Sample Rate。
What is frequency-shift keying (FSK)? https://www.techtarget.com/searchnetworking/definition/frequency-shift-keying [Web backup] ↩︎
Frequency Xlating FIR Filter https://wiki.gnuradio.org/index.php/Frequency_Xlating_FIR_Filter ↩︎
手把手教系列之IIR数字滤波器设计实现 https://zhuanlan.zhihu.com/p/118748334 ↩︎
InstallGR. Gnuradio Wiki. https://wiki.gnuradio.org/index.php/Tutorials ↩︎