目录
-
- [1 接收概述](#1 接收概述)
- [2 相关块介绍](#2 相关块介绍)
- [2.1 相关性估计器(Correlation Estimator)](#2.1 相关性估计器(Correlation Estimator))
- [2.2 多相时钟同步(Polyphase Clock Sync)](#2.2 多相时钟同步(Polyphase Clock Sync))
- [2.3 线性均衡器(Linear Equalizer)](#2.3 线性均衡器(Linear Equalizer))
- [2.3.1 自适应均衡器的基本理论](#2.3.1 自适应均衡器的基本理论)
- [2.3.2 基于 LMS 算法自适应均衡原理](#2.3.2 基于 LMS 算法自适应均衡原理)
- [2.3.4 Gnu Radio 线性均衡块介绍](#2.3.4 Gnu Radio 线性均衡块介绍)
- [2.4 科斯塔斯环路(Costas Loop)](#2.4 科斯塔斯环路(Costas Loop))
- [2.4.1 直接体验](#2.4.1 直接体验)
- [2.4.2 原理](#2.4.2 原理)
- 参考链接
1 接收概述
接收器要比发送复杂得多。这里涉及的工作主要是接收帧的检测和同步。我们必须假设帧以潜在随机时间间隔的突发形式传入。
有一点非常重要:让一个简单的协议在所有场景下工作是非常困难的。我们必须假设一些数据包将由于开始时的漏检或突发处理期间同步统计数据不佳而丢失。
通用接收器示例可以在 packet_rx.grc 中找到。该层次块提供 PHY 帧的主要检测、同步、标头/有效负载管理、解调和解码。
2 相关块介绍
2.1 相关性估计器(Correlation Estimator)
https://wiki.gnuradio.org/index.php/Correlation_Estimator
相关估计器模块将输入信号与提供的样本向量相关联。该块设计用于通过相关搜索同步字,并使用相关结果来获得时间和相位偏移估计。这些估计作为流标签向下游传递,以供后续同步块使用。
下图是其工作原理:相关块将传入的样本流与已知模式进行比较,当存在匹配时达到峰值。最常见的相关码是巴克码。此处显示了 7 位巴克码。
下面是采用 BPSK 编码的 8 字节前导码,sps 为 4 的匹配效果图(test_corr_est.grc):
- bit 数为 884 = 256 个
- 采用 100Khz 采样显示的 QT GUI Time Sink 图,因此每一个数据占 0.01 ms
- 图中从开始有峰值到最高峰时间大约:521.29-518.72,再除以 0.01 能够得出这段时间大致的数据个数:256.9999
- 算上我们肉眼看起始时间的误差,基本上符合理论计算:前导码完全匹配时峰值最大
此外,标签输出分别为:
- phase_est:相位偏移的估计。 phase_est 标签可由下游模块用来调整其相位估计器/校正循环,目前由 Costas Loop 模块实现。
- time_est:符号定时偏移的估计。 time_est 标签可用于调整任何下游同步块(例如Symbol Sync )的采样定时估计。
- corr_est:估计的相关值(从图中还不知道为什么是那个值)
- amp_est:超过估计幅度 1。估计幅度是块处理的时间窗口中任何一个样本的最大幅度(至少包括整个同步字)
- corr_start:相关性的起始样本及其值(与 corr_est 相同的值)
2.2 多相时钟同步(Polyphase Clock Sync)
https://wiki.gnuradio.org/index.php/Polyphase_Clock_Sync
使用多相滤波器组的定时同步器。
该模块通过最小化滤波信号的导数来执行定时同步,从而最大化 SNR 并最小化 ISI(符号间干扰)。
多相时钟同步模块的详细信息
我们可以使用多种算法来恢复接收器的时钟,几乎所有算法都涉及某种反馈控制环路。那些没有使用反馈的通常使用前导码。多相时钟同步块为我们做了三件事:首先,它执行时钟恢复;其次,它使用接收器匹配滤波器来消除 ISI;第三,它对信号进行下采样。
该模块的工作原理是计算输入信号的第一个差分,该差分与其时钟偏移相关。如果我们首先非常简单地模拟这一点,我们就可以看到差分滤波器如何为我们工作。
如下:symbol_differential_filter.grc
1)原始数据为:49 个 0 + 1 + 50 个 0,总共 100 个数据。
2)经过 32K 节流阀限制速度
3)送入内插 FIR 滤波器:采用 4 倍内插,数据变为 1004 个,同时对数据实施 RRC 卷积(因此,看到的运行图中一个周期 400 个数据,大约 12.5ms)
4)然后送入多相任意重采样:这里没有实施滤波,仅仅进行 1.2 倍重采样,因此数据变为:400 1.2,周期变为 15ms
5)然后送入抽取 FIR 滤波器:这里的抽取率为 1 表示没有抽取,仅仅实施了 RRC 滤波(因此总样本没变,总周期没变)
6)然后分两路:一路送入 delay 1 的块,产生延时 1 sample/items 的效果,本质为 out[n] = in[n-1];一路送入抽取 FIR 滤波器,实施差分滤波(本质是 out[n] = in[n-2]-in[n],其实是微分过程)
因为我们采样最理想的点在第一路数据的峰值点,即微分为 0 的点(斜率),上面第 6 步骤比较巧妙的实现了:第二路接近 0 时,对应第一路的峰值点,也就是最佳采样点。运行效果如下:
实际上,我们不是使用单个滤波器,而是使用一组有不同相位的滤波器 symbol_differential_filter_phases.grc
:
1)原始数据没变,节流阀没变,4 倍内插没变,1.2 倍多相任意重采样没变,仅实施 RRC 的抽取滤波器没变
2)然后分 6 路:一路直出;5 路分别实施分数重采样,分数重采样可以轻松实现相移(0~1),可以将 5 路滤波器理解为将单位圆(0~2pi)分割为 5 等份。由于该滤波器除了进行相移之外,还会产生延时(实测发现:0 相位重采样时会丢弃 3 个样本,即:out'[n] = in[n+3]),因此后续我们用延时块进行矫正。
- 第 1 路直出:out'[n] = in[n]
- 第 2 路 0 相移,因此使用 [-1.0,1] 进行差分滤波,out[n] = in[n-2]-in[n],delay 1 会产生 out'[n] = out[n-1] = in[n-3]-in[n-1]
- 其他 4 路有非 0 相移,使用 [0,-1,0,1] 进行差分滤波,out[n] = in[n-3]-in[n-1],delay 1 会产生 out'[n] = in[n-4]-in[n-2]
- PS:由于 2~5 路实施了分数重采样,因此作用 3 个样本丢弃,最终公式为:
- out'[n] = in[n]-in[n+2]
- out'[n] = in[n-1]-in[n+1]
运行效果如下:
我们可以看到:d(sym0)/dt + phi3 的信号在 0 处有一个采样点。这告诉我们,我们的理想采样点发生在这个相位偏移。因此,如果我们取接收器的RRC滤波器,并通过 phi3 (which is 3*2pi/5) 调整其相位,则我们可以校正时序失配,并在该采样时间选择理想的采样点。
上面的方法是采用开环方式来做选择,不能做到自动选择,此时需要引入二阶控制回路:控制回路从其中一个滤波器开始,并计算输出作为误差信号。然后,它与误差信号成比例地在滤波器组中向上或向下移动,因此我们试图找到误差信号最接近0的位置。这是我们针对采样点的最佳滤波器。因为我们预计发射和接收时钟会相对彼此漂移,所以我们使用二阶控制环路来获取正确的滤波器相位以及两个时钟之间的速率差。
下面流程图 Qpsk_stage3.grc
展示了获取通道模型输出的 QPSK 信号,传递到 Polyphase Clock Sync 模块。该块设置有 32 个滤波器和 2pi/100 的环路带宽。
运行此流程图时,我们看到由于 32 个滤波器之后的 ISI,星座图仍然有一点噪声,但一旦我们将通道噪声电压设置调整为大于 0,它很快就会被噪声吸收。(图中绿色为未经过多相时钟同步的星座图,蓝色为经过多相时钟同步的星座图,当噪声为 0 时,调节 timing offset 观察时钟同步效果)
2.3 线性均衡器(Linear Equalizer)
2.3.1 自适应均衡器的基本理论
参考文献 [8] 对均衡器的概述很好,我直接抄过来:
对串扰(ISI)进行校正的电路称为均衡器,其实质是是信道的一个逆滤波器。信道均衡器是通信系统中一项重要的技术,它能够很好的补偿信道的非理想特征,从而减轻信号的畸变,降低误码率。在高速通信、无线通信领域,信道对信号的畸变将更加严重,因此信道均衡技术是不可或缺的。
理论和实践证明,在接收系统中插入一种滤波器,可以校正和补偿系统特性,减小码间干扰的影响。这种起补偿作用的滤波器称为均衡器,校正可以从频域和时域两个不同的角度考虑:在频域校正称为频域均衡,它是通过调整均衡器使信道和均衡器总的频谱特性符合理想低通特性或等效低通特性,从而实现无码间干扰传输;若从时域考虑问题,它是以奈氏第一准则为依据,通过调整滤波器抽头系数,在时域波形上把畸变了的信号校正为在取样点上无码间干扰的波形,我们把这种均衡称为时域均衡。随着数字信号处理理论和超大规模集成电路的发展,时域均衡已成为当今高速数字通信中所使用的主要方法。调整滤波器抽头系数的方法有手动调整和自动调整。如果接收端知道信道特性,例如信道冲激响应或频域响应,一般采用比较简单的手动调整方式。由于无限通信信道具有随机性和时变性,即信道特性是事先未知的,信道响应是时变的,这就要求均衡器必须能够实时地跟踪信道的时变特性,可以根据信道响应自动调整抽头系数,我们称这种可自动调整滤波器抽头系数的均衡器为自适应均衡器。均衡器通常是用滤波器来实现的,使用滤波器来补偿失真的脉冲,判决器得到的解调输出样本,是经过均衡器修整过的或者清除了码间干扰之后的样本。
由于数字滤波器按照单位脉冲响应特性可分为:有限脉冲响应(FIR)滤波器和无限脉冲响应(IIR)滤波器。有限脉冲响应滤波器在自适应滤波中使用最广泛。FIR 和 IIR 滤波器有多种实现结构,如横向型结构、格型结构、对称横向结构、级联结构、并联结构等。每种实现结构都有各自特点,在不同的场合有着不同广度的应用。下面对 FIR 滤波器实际中常用的横向型结构和格型结构做简要描述:
1)横向型结构
横向型结构是在自适应滤波器设计中应用最广泛的结构类型,对于 FIR 滤波器,其横向结构如下图:
该滤波器的输出 y(n) 为:
其中,x(n) 为输入信号,w(n) 为权系数,n 为时间序列,N 为滤波器的阶数。横向型滤波器适应于所有的 FIR 滤波器,形式简单,易于实现;可以用流水线形式提高性能。
2)格型结构
格型结构滤波器是具有有理系统函数数字滤波器的一种实现,这个结构广泛用于数字语音信号处理和实现自适应滤波器。格型滤波器分全零点格型滤波器和全极点格型滤波器。下图是全零点格型 FIR 滤波器的示意图:
其中第 m 级子图:
该滤波器可以用以下公式描述:
其中,fm(n) 称为前向预测误差,gm(n) 称为后向预测误差,km 称为反射系数, m 为结束序列值, P 为串联的总级数量。
格型子使用滤波器的优点是:
- 按阶递归,所以增加或减少级数不会影响存在的阶数设计,这使我们能在变化的环境下,动态选地选择最佳的阶数;
- 格式滤波器具有模块式结构,便于实现高速并行处理;
- 格型滤波器收敛速度快,稳定性好,对系数量化精度要求不高。
格型自适应滤波器的缺点是计算量大,只能部分实现流水线,很难达到实时计算的要求且不容易实现。
本节介绍的自适应线性均衡器是一种常用的、易于实现的均衡器:
2.3.2 基于 LMS 算法自适应均衡原理
自适应滤波器是在最佳滤波器的基础上发展起来的:自适应滤波器是通过利用随机信号内部的一些统计特征,从干扰中最佳地提取信号,使滤波器的输出性能最佳。因此,在设计滤波器时应该根据自适应准则,设计出最佳性能滤波器。最佳滤波准则和自适应滤波器关系密切,最佳滤波准则规定了与某种特性的信号对应的最佳参数,而这个最佳参数指出了自适应滤波器调整参数的方向。关于自适应系统性能测量方法有很多种,其中基本的方法包括均方误差(Mean Square Error, MSE)性能测度、最大信噪比(Max Signal-to-Noise Ratio, MSN)性能测度、最大似然(Maximum Likelihood, ML)性能测度、最小噪声方差(Minimum Noise Variance, MV)性能测度等 。根据自适应滤波算法优化准则的不同,自适应滤波算法可以分为两类最基本的算法:最小均方误差(Least Mean Square, LMS)算法和递推最小二乘(RLS)算法。LMS 算法是基于最小均方误差准则,使滤波器的输出信号与期望输出信号之间的均方误差最小。RLS 算法是基于最小二乘准则,使滤波器在一段时间内输出误差信号的平均功率(在时间上做平均)最小。由 Widrow 和 Hoff (1960) 引入的 LMS 算法,由于其具有计算量小、易于实现等优点而在实践中被广泛应用。该算法是基于最小均方误差(MMSE)准则和最陡峭下降法提出的。
推到过程省略,LMS 算法的重要特点是将其期望值近似为瞬时值。故在迭代收敛后,加权矢量不会等于最优的加权矢量,而是在最优加权矢量附近随机的波动,等效于在最优加权矢量上叠加了一个噪声,也就是说这种近似存在误差。所以,LMS 算法又被称为随机梯度法。此法可以视为最陡峭下降法的近似。
LMS 算法的收敛稳定性:是有条件的,步长 u 必须要满足一定的要求。
LMS 算法的收敛速度:由 u 和特征值分散决定,对于不同特征值分散,LMS 算法的收敛速度不同;u 越大 LMS 收敛速度越快,但是 u 过大时,过度过程出现震荡。
LMS 算法的性能达到最佳,要选择合适的步长因子 u、滤波器抽头数、输入信号能量及特征值分散。总而言之,对于平稳系统,算法的参数选择应保证较小的稳态误差和较快的收敛速度,这时均衡才能得到较理想的效果。
若 u 取常数,则称之为基本 LMS 算法,若取一个函数值(省略)则会变成归一化 LMS,即 NLMS。NLMS 可视为一种变步长 LMS 算法,归一化 LMS 算法是改善收敛速度最重要的技术,可根据步长的变化使收敛速度有所改变。NLMS 保留了算法简单,运算量小,易于实现等优点,但它最大的缺点仍是对冲击响应信道比较长的应用,收敛速度较慢,不惜对其进一步改进。
RLS 算法,它的实质是 Kalman 滤波算法的一个特例。其算法的关键是用二乘方的时间平均的最小化准则取代最小均方准则,并按照时间进行迭代计算,也就是,要对初始时刻到当前时刻所有误差的平方进行平均并使其最小化,再按照这一准则确定滤波器的权矢量。比起 LMS 算法,RLS 算法的运算量显著增大。但 RLS 算法的收敛特性比 LMS 算法好很多,因而获得了广泛的应用。更适合较严重失真信道均衡器抽头系数的收敛。
固定步长的 LMS 算法在稳态误差和收敛速度两方面不可能同时实现的。因此,人们为了克服上述中的缺点,对 LMS 自适应算法进行了改进。最小均方(LMS)类自适应均衡算法包括多种算法:有传统的最小均方算法(LMS)、解相关 LMS(DLMS) 算法、归一化 LMS(NLMS) 算法以及改进的步长解相关 LMSS 自适应算法。而归一化算法 NLMS 实质上是一种归一化的交步长算法,它比传统 LMS 算法收敛速度更快,并且它对信道的跟踪效果也相对较好。
为了得到较快的收敛,我们还可以采用更为复杂的 RLS 算法,直接对收敛数据进行处理。RLS 算法的收敛速度比 LMS 快得多,就收敛后的稳态误差以及对信道的跟踪能力而言,RLS 算法也要比 LMS 算法好的多。
2.3.4 Gnu Radio 线性均衡块介绍
基于复采样数据流实施线性均衡,该线性均衡块使用 FIR 滤波器均衡输入信。如果提供了训练序列和训练开始标签,数据将会被执行辅助均衡采用标记样本。如果基于训练的均衡是激活的并且训练序列结束,如果参数 adapt_after_training
设置为真,则会实施 DD 均衡(decision directed equalization,决策定向均衡);如果训练没被激活,直接使用 DD 均衡。均衡器根据 psp 参数抽取到符号率。流程图如下:
这里演示了基于 LMS 算法的线性均衡器的在使用训练数据和不使用时的均衡速度和稳态稳定性的差距。可以看出基于训练的收敛速度更快,稳态稳定性更好。当然,也可以换为 NLMS 和 CMA 算法(不过要调整下步长)进行体验。总之,该块能够帮我们减小甚至消除 ISI,方便后续数据解码。
2.4 科斯塔斯环路(Costas Loop)
2.4.1 直接体验
https://wiki.gnuradio.org/index.php/Costas_Loop
Costas环路载波恢复模块,非常适合同步到BPSK、QPSK和8PSK。Costas环路锁定到信号的中心频率,并将其下变频到基带。
note:
- 相关性估计:搜索同步字,并使用相关结果来获得时间和相位偏移估计,这些估计作为流标签向下游传递,以供后续同步块使用
- 多相时钟同步:减小 timing offset 影响
- 线性均衡器:减小一般噪声影响
- 科斯塔斯环路:减小频偏影响
先看这个流程图:Qpsk_stage5.grc
效果图如下:
从上图可以看出,假设我们已经均衡了信道,我们仍然面临相位和频率偏移的问题。均衡器往往不能快速适应,因此频率偏移很容易超出均衡器跟上的能力。此外,如果我们只是运行 CMA 均衡器,它所关心的只是收敛到单位圆。它不知道星座,所以当它锁定时,它会锁定在任何给定的相位。因此当我们使用 Costas 循环块(可以同步 BPSK、QPSK 和 8PSK)来校正任意相位偏移以及任意频率偏移。
2.4.2 原理
在维基百科中有对于克瑟塔斯环的详细介绍[[12](https://en.wikipedia.org/wiki/Costas_loop)]:
科斯塔斯环是一种基于锁相环(PLL) 的电路,用于从抑制载波调制信号(例如双边带抑制载波信号)和相位调制信号(例如BPSK、QPSK )中恢复载波频率。
它是由通用电气公司的John P. Costas于 20 世纪 50 年代发明的。它的发明被描述为 "对现代数字通信产生了深远的影响"。
科斯塔斯环的主要应用是无线接收器。与其他基于 PLL 的检测器相比,它的优势在于,在小偏差下,科斯塔斯环误差电压 sin(2(θi-θf)) 相比于 sin(θi-θf)。这意味着灵敏度加倍,也使科斯塔斯环特别适合跟踪多普勒频移载波,特别是在OFDM和GPS 接收器中。
经典实现:
在科斯塔斯环路的经典实现中,本地压控振荡器(VCO) 提供正交输出,两个相位检测器(例如乘积检测器)各一个。输入信号的相同相位也应用于两个相位检测器,并且每个相位检测器的输出都通过低通滤波器。这些低通滤波器的输出是另一个相位检测器的输入,该相位检测器的输出经过降噪滤波器后用于控制压控振荡器。整体环路响应由第三个相位检测器之前的两个独立的低通滤波器控制,而第三个低通滤波器在增益和相位裕度方面起着微不足道的作用。
上图为 Costas 环路在"锁定"状态下绘制的图,其中由于 Costas 环路过程,VCO 频率和输入载波频率已变为相同。该图并不代表"解锁"状态。
note:其推导过程推荐参考《深入浅出通信原理》中的 7.2 章数字调制的 QPSK 调制与解调推导,然后再看维基百科里的推导。
参考链接
[1]. GNU Radio ------ Packet Communications
[2]. GNU Radio ------ 符号同步
[3]. 百度百科 ------ 微分
[4]. GNU Radio ------ 分数重采样器(最小均方误差滤波)
[5]. 维基百科 ------ 最小均方误差
[6]. 论坛 ------ 分数重采样器丢失样本
[7]. GNU Radio ------ 线性均衡器
[8]. 百度文库 ------ 基于 LMS 算法的自适应线性均衡器设计(成都大学)
[9]. 豆丁文库 ------ 基于 LMS 算法的自适应线性均衡器设计(成都大学)
[10]. 西电 ------ 孙永军研究生数字通信课程课件-10 信道均衡
[11]. KEYSIGHT ------ Modulation Accuracy-EVM
[12]. 维基百科 ------ Costas loop
教程列表
基础教程:
- [1]. GNU Radio 系列教程(一) ------ 什么是 GNU Radio
- [2]. GNU Radio 系列教程(二) ------ 绘制第一个信号分析流程图
- [3]. GNU Radio 系列教程(三) ------ 变量的使用
- [4]. GNU Radio 系列教程(四) ------ 比特的打包与解包
- [5]. GNU Radio 系列教程(五) ------ 流和向量
- [6]. GNU Radio 系列教程(六) ------ 基于层创建自己的块
- [7]. GNU Radio 系列教程(七)------ 创建第一个块
- [8]. GNU Radio 系列教程(八)------ 创建能处理向量的 Python 块
- [9]. GNU Radio 系列教程(九)------ Python 块的消息传递
- [10]. GNU Radio 系列教程(十)------ Python 块的 Tags
- [11]. GNU Radio 系列教程(十一)------ 低通滤波器
- [12]. GNU Radio 系列教程(十二)------ 窄带 FM 收发系统(基于ZMQ模拟射频发送)
- [13]. GNU Radio 系列教程(十三)------ 用两个 HackRF 实现 FM 收发
- [14]. GNU Radio 系列教程(十四)------ GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解
- [15]. GNU Radio 系列教程(十五)------ GNU Radio GFSK 模块
- [16]. GNU Radio 系列教程(十六)------ GNU Radio 的调试利器 Message Strobe
- [17]. GNU Radio 系列教程(十七)------ GNU Radio PDU TX 利用三个块实现最小的数据包(帧头+数据+校验)
- [18]. GNU Radio 系列教程(十八)------ GNU Radio PDU TX 将帧头和 payload 消息合并为数据帧
- [19]. GNU Radio 系列教程(十九)------ GNU Radio PDU TX 将最小数据帧实施脉冲突发整形填充 --> 让帧更稳定
- [20]. GNU Radio 系列教程(二十)------ GNU Radio PDU TX 根升余弦深度介绍&发送数据帧的收尾之作
- [21]. GNU Radio 系列教程(二一)------ GNU Radio PDU RX 利用相关性估计器寻找数据帧的起始位置
- [22]. GNU Radio 系列教程(二二)------ GNU Radio PDU RX 利用多相时钟同步块实现消除时钟偏移
- [23]. GNU Radio 系列教程(二三)------ GNU Radio PDU RX 利用自适应线性均衡器消除 ISI
- [24]. GNU Radio 系列教程(二四)------ GNU Radio PDU RX 利用 Costas Loop 校正相位和频率偏移
- [25]. GNU Radio 系列教程(二五)------ 硬核,基于通信原理设计一个文件传输系统
- [26]. GNU Radio 系列教程(二六)------ 开胃菜,hackrf 发送 ble 广播包的简单 DEMO
综合教程:
- [1]. SDR 教程实战(一) ------ 利用 GNU Radio + HackRF 做 FM 收音机
- [2]. SDR 教程实战(二) ------ 利用 GNU Radio + HackRF 做蓝牙定频测试工具(超低成本)
- [3]. SDR 教程实战(三) ------ 利用 GNU Radio + HackRF + WireShark 做蓝牙抓包器(超低成本)
- [4]. SDR 教程实战(四) ------ 利用 GNU Radio + HackRF 手把手深入了解蓝牙协议栈(从电磁波 -> 01数据流 -> 蓝牙数据包)
- [5]. SDR 教程实战(五) ------ 利用 GNU Radio + LimeSDR+ WireShark 做蓝牙抓包器(上上个视频使用 HackRF)
- [6]. SDR 教程实战(五) ------ 利用两个 hackrf 实现大文件(视频)高速传输
SDR 小工具教程:
基础块教程:
视频和博客
: 如果觉得不错,帮忙点个支持哈~