(做了近20年的SDR开发工作,在此稍微小结一下~)
首先提出问题,怎么进行一个系统的SDR实现。总结下来,主要从两个维度思考和实现,一个是信号处理算法的维度,一个是物理层过程控制的维度。
基础算法维度包括接收链路处理和发射链路处理。
发射链路从编码,符号构成,扩频(如果需要扩频),调制,成型滤波,载波预矫正等过程。
l 编码是将原始二层来的数据码流按照预定规则,进行CRC校验编码,卷积编码,或者Turbo编码等的过程。这个过程增加了原始码流的冗余性,从而增加了接收方正确接收的可靠性。
l 扩频是将原始输入码流,一个比特扩展成若干个比特的过程。这个过程使得最终发射的信号的带宽加宽若干倍,整体的功率谱变宽,使得信号抵抗窄带干扰的能力增加。
l 调制是不同与前面几个步骤的符号映射环节。前面几个步骤都是在比特处理环节,不论是编码还是扩频,处理前后看到的都是比特流。调制环节,输入是比特流,输出却是符号流了。所谓符号流,就是对应在复数域上,用一个IQ对的复数代表了输入的若干个比特。例如QPSK,则是一对IQ复数代表输入的2个比特。而16QAM,则是一对IQ复数代表输入的4个比特,而128QAM对应的输入7比特。某些系统,在这个环节后基带信号完全成型,就可以直接输出给射频电路进行频率搬移后的发射了。而OFDM系统,一般还需要进行频域时域的转换,然后才是完成了基带信号成型。
l 成型滤波在其他文章单独讨论。它一般是放在发射链的基带处理环节的最后一个步骤。不是所有的系统都有这个环节。它最主要的作用在于构成有限带宽的信号,防止信号在发射通道中变形,以及产生带外的杂散。
l 载波预矫正步骤,我开发过的几个系统中,只在CDMA终端软件中有加上这个环节。这个跟接收方测量得到了终端跟基站的频差相关。当终端已知跟基站之间存在这个频差后,在终端发射的信号是必须加上这个预矫正的步骤,使得在基站端接收到的信号是几乎没有频差的信号。为什么CDMA需要这样的处理呢?因为CDMA系统的特征就是所有终端的信号到达基站的时候,在时频上都是叠加在一起的,基站没有办法测量准确每一个终端信号跟基站之间存在的频差。而残留较大的频差对于解扩的结果会造成较大的伤害。这个频差对解扩过程的伤害的讨论可以参考讨论GPS的信号处理方法。
一般通信系统设计的时候都会很清楚的定义其发射链的各个步骤的信号构成特征,公式等。所以,工程实现只需要保证准确的编程即可,没有特别多的技巧可以发挥。这里我只讨论了终端侧的信号发射处理。如果在基站侧,因为存在MIMO和智能天线的赋型等处理,会更加复杂。
接收链路一般是包括从搜索网络信号,信道估计,信号均衡,解调,解扩(如果扩频通信),解码等。
l 搜索网络信号的算法,根据网络本身的信号特征进行设计,一般采用时域或者频域的相关运算(如前面第一章所述)。例如前面章节提到的GSM的FCB的搜索。例如LTE里面的主同步信号搜索到辅同步信号搜索到MIB的完整接收处理。
l 信道估计则根据不同的系统里的导频信号进行。例如前面讨论过的GSM系统里面的对于每一个slot中间的training信号的处理获得信道H的几个Tap。例如LTE系统中的对于每个小区的参考信号RS的测量与估计得到所有子载波对应的信道H的幅度与相位。
l 信道均衡是利用已经得到信道H向量,对接收的信号进行均衡判断。同样,在前面的章节已经讨论过GSM里面的viterbi均衡算法。而在LTE系统中,均衡主要是利用已经得到的每个子载波H的幅度和相位,修订接收原始的每个子载波的信号幅度和相位。
l 解调则根据信号本身的特征进行,例如bpsk则判断两个相位区间得到接收的符号所对应的信息比特是1还是0。如果是高阶调制,则需要对应整个map得到应该的比特串,或者是软信息。一般软信息更好一点,更精确的判断留给后面的比特级的解码处理来做。
l 解扩是直接的卷积运算。将对应同一个原始比特的扩频之后的符号矢量跟对应的PN序列进行卷积从而得到解扩的结果。如果直序扩频的系统,所有发射链信号是发生在时域,而收发双方存在频差,则需要注意解扩之前一定要去除残留的频差。否则频差会导致卷积的结果非常差。这个跟GPS接收机要去除频差那个小节讨论的内容一致。
l 解码是编码的逆过程。如果编码是卷积编码,则用viterbi解码。如果编码是Turbo,则用Turbo解码。如果只是CRC,则用CRC解码校验。这个在前面CRC和Viterbi章节也有果相应的讨论。
过程控制层面包括下行链路同步,增益控制,上行链路同步,功率控制。
l 下行链路同步又分成两个方面,一个是初始同步捕获,一个是持续同步跟踪。这个内容在前面“相关运算”,“FFT”,“同步”,“GPS”等几个篇文章有比较多的讨论。
l 增益控制是接收机下行链路控制比较重要的环节。在初始搜索信号的时候,不仅仅是不知道基站信号的频率,时间同步点,而且也不知道功率。因为终端并不知道自己跟基站之间的距离,也不知道基站的发射功率。而在增益控制不合适的时候,即使终端已经接收到了基站的信号,也可能因为接收的信号太大或者太小而无法进行初始同步。所以,增益控制在初始同步的环节一定是跟时频搜索一起的一个迭代的过程。一旦初始同步建立之后,下行链路控制需要持续的测量接收的信号,进行接收增益的控制。这个是因为移动终端因为本身的移动,或者环境的变化,接收到的信号总是在变化的,而接收机的下行信号采样量化的动态范围总是有限的。不做动态的增益调制,不能快速跟随信号大小变化而调制接收机的增益,那么接收机的性能很难稳定。增益控制不仅仅体现在对射频电路的增益的控制上,在基带信号处理过程中同样存在增益控制。例如LTE系统,如下图所示是其RS所处的位置。
在信道估计根据接收到的RS计算得到了RS所在OFDM符号的所有子载波信道特征后,对于没有RS的OFDM符号需要采用时域内插的方法获得。如果在这几个相邻时域符号之间,由于FFT变换的计算环节引入不同的移位,而对应不同的增益的情况,那么可能会引入比较大的畸变。为什么FFT变换过程会引入不同的移位呢?这是用定点的DSP处理FFT算法会引入的问题。因为FFT需要多级迭代运算才能得到最终的结果。每一级迭代运算后,矢量的最大值可能已经接近该DSP有效位的最大可表示范围,为了下一次运算过程不出现数值的溢出,会对整个矢量数据进行相应的移位。而整个迭代运算全部完成后,不同的输入信号可能会在迭代过程中产生不同的移位位数,这个跟输入信号的特征相位。举个例子,同样都是2048点的FFT运算,如果一个单频率的时域信号经过FFT得到频域信号,由于能量都集中在同一个频率上,迭代过程的移位会比较多。如果一半的2048点对应的频域都有能量的时域信号输入FFT运算,由于能量分散在大多数频率上,迭代过程的移位会相对较少。这就是OFDM系统的基带处理过程经常会面临的不同的OFDM符号经过FFT运算后实际移位不一样的原因。
l 上行链路同步是在下行同步建立之后,通过基站与终端之间的闭环控制实现。这个问题在“同步啊,同步”章节进行了比较深入的讨论。
l 发射功率控制,分为初始开环功率控制和持续闭环功率控制两个部分。需要再补充的时,同步的概念需要扩展到时域频域以及功率。所以结合“同步啊,同步”和“功率控制”章节,可以更好的理解上行链路同步这个概念和相关的工程处理。
到此,基本关于SDR软件工程实现中涉及的概念,原理,需要关注的环节,步骤,基本讨论了一个大概。而SDR工程实现还有很重要的环节是硬件环节,例如芯片的架构如何定义,处理器的指令如何设计,内部存储空间如何设计,不同的处理器之间如何高效通信等等内容,暂不做深入探讨。