随着我司业务的发展及研发工作的深入,我们接触到了越来越多的关于软件无线电产品的需求,尤其是关于FPGA + AD9361等芯片的板卡需求。在开展相应的研发工作之前,我们做了大量的准备工作,首先就是重新认识数字基带信号。我们知道,AD9361是一款具有里程碑意义的产品,其内部集成了ADC DAC及多个射频组件,大大降低了软件无线电产品设计的复杂度。想要让AD9361输出预期的波形,则需要按照一定的格式将数据送至AD9361的DAC,并通过IQ调制到射频频段。看起来简单的过程,实际上却是一个超级复杂的过程,涉及到太多的知识,例如微积分、线性代数、概率论、信号与系统、数字信号处理、数字通信等。研究越是深入,越是领略到无线通信技术的博大精深。
我们都知道几种基本的调制方式:幅度调制、频率调制、相位调制,其中,相位调制具备很强的抗干扰能力,考虑到我司即将推出的第一款软件无线电产品要具备高可靠性,我们就把相位调制也就是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
差分编码后的频谱与原始信号频谱没有差别。至于频谱为什么是长成这个样子的,《通信原理》(樊昌信,曹丽娜,国防工业出版社)给出了很好的阐述。