今年已经是我创业第7年了,本来挺有技术含量的工作变成了体力活,我还很年轻,很想在技术领域有所突破。软件无线电是我一直想要进入的领域,苦于自己被公司已有业务占用了太多时间,自己也不是通信专业出身,迟迟没能开始软件无线电类产品的开发。近期公司业务受到了疫情影响,出现了一段时间空档,刚好可以把之前的学习资料整理一下,分享给各位读者。可以肯定的是,文中会有很多错误,也会有很多不严谨的地方,读者可以通过邮件反馈给我,我也很期待自己能在数字通信方向更加深入地学习。本文记录了我学习使用ADI AD9361的过程,最终在开发板上使AD9361输出了预期的波形,如下,可以看到,AD9361的输出信号可以通过仪器进行解调。
我们知道,AD9361是一款具有里程碑意义的产品,其内部集成了ADC DAC及多个射频组件,大大降低了软件无线电产品设计的复杂度。想要让AD9361输出想要的波形,则需要按照一定的格式将数据送至AD9361的DA,并通过IQ调制到射频频段。看起来简单的过程,实际上却是一个超级复杂的过程,涉及到太多的数学知识。为此,我首先复习了《工科数学分析》、《线性代数与空间解析几何》、《信号与系统》这几门课程,这些课程都是我在大学阶段学过的,同时我自学了通信专业的一些课程包括《数字信号处理》和《通信原理》,学习越是深入,越是领略到数字通信的博大精深,我平时工作中用到的知识连皮毛都算不上。回想起第一份工作时研发老大说过的工程师成长路线:skill level,marketing level,standard level,能搞标准的这些人真是厉害!
相信阅读本文的读者都能知道几种基本的调制方式:幅度调制,频率调制,相位调制,其中,相位调制具备很强的抗干扰能力,考虑到后期会开发的第一款软件无线电产品要具备高可靠性,我就把相位调制也就是PSK作为首个研究对象。本文的目标是用AD9361产生BPSK调制波形,其信道带宽可以根据需要任意设定。
目标已经设定好了,我们知道BPSK是载波相位随着0,1序列做改变,那么这个过程如何实现呢?有一个非常简单的数学运算,我们假定1对应的相位为0,0对应的相位是180度,载波信号是cos(wt)(这里不必关心载波的幅度与初始相位),则有以下的对应关系
基带信号 | 载波相位 | 载波信号 |
1 | 0 | cos(wt) |
0 | pi | cos(wt+pi)=-cos(wt) |
假定数字序列中出现0 1是等概率的,则这些0 1序列加起来的平均值是0.5,这就意味着这个数字序列是有直流偏移的,想象一下,其频谱必定在0频处有一根线(傅里叶变换),这显然不是我们想要的,因为这种方式既浪费能量又不能传递任何信息。因此,在实际的通信系统中,用-1 1(即NRZ,不归零)代表0 1,仍假定-1 1是等概率出现的,则这些-1 1序列加起来的平均值就是0,这样就可以消去直流分量了,还可以提升抗干扰能力。两种数字序列的频谱如下图所示。
对应的Matlab代码如下
clear;clc;
N=200;
Tb=4;
rb=randi([0 1],N,1);
gt = ones(1, Tb);
Sinput=[] ;
for n=1:length(rb)
if rb(n)==0
Sinput=[Sinput gt];
else
Sinput=[Sinput -1*gt]; %-1 1序列
%Sinput=[Sinput zeros(1, Tb)]; %0 1 序列
end
end
plot(20*log10(abs(fft(Sinput))));
ylim([0 inf]);
于是,大家普遍采用如下的对应关系
基带信号 | 载波相位 | 载波信号 |
1 | 0 | cos(wt) |
-1 | pi | cos(wt+pi)=-cos(wt) |
显而易见,用数字序列-1 1与载波cos(wt)相乘,直接就可以得到调制后的信号。这样一来,把AD9361当作简单的DAC,让它输出-1 1,再与载波相乘,不就得到调制后的信号了吗?的确如此。
进一步,教科书上都会写BPSK方式解调时存在相位翻转,造成误判,在实际通信系统中采用的都是差分PSK即DPSK,也就是当前比特与前一个比特做异或运算(相同为0,不同为1)。因此,基带信号在与载波相乘前,需要做一个差分变换,对应的matlab代码如下。
%并将绝对码变换为相对码
ds=ones(1,N);
for i=2:N
if s(i)==1
ds(i)=-ds(i-1);
else
ds(i)=ds(i-1);
end
end
差分编码后的频谱与原始信号频谱没有差别。至于频谱为什么是长成这个样子的,《通信原理》(樊昌信,曹丽娜,国防工业出版社)给出了很好的阐述。