通信系统的一般框架如下图所示。实际通信系统不一定包含图中的所有环节,本设计是数字基带传输系统,故没有上变频、下变频部分,同样也不需要低通滤波。另外,在上采样后,对信号添加了AWGN和窄带干扰,下采样后陷波陷掉窄带干扰,然后进行解调译码等,在不同的参数下,测试系统的抗干扰性能。当系统有频率偏移时,采用PLL锁相环对频偏进行矫正,测试不同频偏下的误码率,锁相会引入相位模糊,通过导频解决。
如图所示为本设计的系统结构。随机产生的二进制序列经过QPSK、成型滤波、上采样后,直接下采样得到的信号clean_signals为CGAN的标签。上采样后的信号经过加性高斯白噪声、窄带噪声,加频偏后通过匹配滤波、下采样,后陷波、载波同步、消除相位模糊。如果不经过锁相,那么陷波后的信号即为CGAN网络的输入,如果经过锁相,那么经过载波同步、消除相位模糊的信号为CGAN网络的输入。输入信号学习标签,生成的信号再送入MATLAB计算误码率。
参数 | 内容 |
---|---|
调制方式 | QPSK |
符号速率 | 2e8 |
成型滤波器点数 | 8 |
匹配滤波器点数 | 8 |
带宽 | 100M |
窄带范围 | [4e7,5e7](10M) |
陷波带宽 | 10M/15M/20M |
上采样倍数 | 2/4 |
采样频率 | 4e8/8e8 |
信噪比 | 8dB/5dB |
信干比 | -10dB/-20dB/-30dB |
频偏 | 0/2000/4000/5000 |
EbN0 | 8dB |
EbN0和SNR的关系在MATLAB的官方文档中有具体的说明,详见help awgn(在命令行输入即可):
EbN0 = SNR + 10log10(oversampled rate)-10log10(k),其中oversampled rate为上采样倍数,k为每个符号包含的比特数,当上采样倍数为2且调制方式为QPSK时,EbN0等于SNR。
在MATLAB中,我们可以使用bertool工具箱计算不同EbN0下的误码率。 在本设计中,误码率要求为10e-2,由图知EbN0大于等于4dB即可,由于bertool中的理论仿真是没有干扰的,所以我们设计中,保证EbN0大于7dB或者8dB即可。
载波同步是基于锁相环技术使本地获取和载波同频同相的参考信号,用来解调信号。载波同步就是对本地参考信号进行频率和相位偏差的补偿,进而实现本地参考信号和载波信号同频同相。
comm.CarrierSynchronizer System object™ 用于补偿使用单载波调制方案的信号中的载波频率和相位偏移,创建并调用即可。载波同步器算法对于 BPSK、QPSK、OQPSK、8-PSK、PAM 和QAM 兼容。详见help comm.CarrierSynchronizer。
% 校正接收信号中的相位和频率偏移
carrierSync = comm.CarrierSynchronizer('SamplesPerSymbol',1,'Modulation','QPSK');
% 对输入信号的频率偏移进行补偿
syncSignal(:,jj) = step(carrierSync,sig_r_trap(:,jj));
同步算法会产生相位模糊问题,同步器引入的潜在相位模糊度取决于调制类型,如本设计中的QPSK引入的相位模糊可能是0、90、180、270。以下是解决相位模糊的代码。idx是随机选取的部分导频信号,通过这些符号来估计相位偏移,用于纠正相位模糊。
%%--------------------------- Phase ambiguity ---------------------------%%
idx = 1:50;
phOffset = angle(modSig(idx) .* conj(syncSignal(idx)));
phOffset = round((2/pi) * phOffset); % -1, 0, 1, +/-2
phOffset(phOffset==-2) = 2; % Prep for mean operation
phOffset = mean((pi/2) * phOffset); % -pi/2, 0, pi/2, or pi
disp(['Estimated mean phase offset = ',num2str(phOffset*180/pi),' degrees'])
%%------------------------------ Phase Shift ----------------------------%%
resPhzSig = exp(1i*phOffset) * syncSignal;
参数 | 内容 |
---|---|
EbN0 | 19.03dB |
信噪比 | 10dB |
上采样倍数 | 16 |
采样频率 | 32e8 |
信干比 | -10dB/-20dB/-30dB |
频偏 | 0~5000 |
结论:SIR=-10dB,SNR=10dB,频偏0~10kHz,锁相后BER为10e-2量级,通过GAN增强后BER降低至10e-3量级。
结论:
2.SIR=-10dB,SNR=10dB,当FrequencyOffset<5000时,不锁相效果更好;当FrequencyOffset≥5000时,锁相后BER更低。BER为10e-2量级,通过GAN增强后BER降低至10e-3量级。
结论:
3.SIR=-20dB,SNR=10dB,当FrequencyOffset≤5000时,不锁相效果更好,BER为10e-2量级,通过GAN增强后BER降低。
结论:
4.SIR=-30dB,SNR=10dB,当FrequencyOffset≤5000时,不锁相效果更好,BER为10e-1量级,通过GAN增强后BER降低至10e-2量级。锁相后BER为0.5左右。
结论:
5.当FrequencyOffset≤5000、SIR≥-30dB且不加锁相时,GAN能有效降低BER。
结论:
6.当FrequencyOffset≤5000、SIR≥-20dB且加锁相时,GAN能有效降低BER。SIR=-30dB时且加锁相时,BER为0.5,且生成器不收敛。
实际系统中,上采样倍数没有这么高,为和硬件保持一致,设置为2或者4。
参数 | 内容 |
---|---|
EbN0 | 8dB |
信噪比 | 8dB |
上采样倍数 | 2/4 |
采样频率 | 4e8/8e8 |
信干比 | -10dB/-20dB/-30dB |
频偏 | 0/2000/5000 |
频率分辨率是指所用的算法能将信号中两个靠得很近的谱峰保持分开的能力。DFT频率分辨率为Δf=fs/N。
实际应用时,可以将频率分辨率理解为频谱图中,在频率轴(频谱图的水平轴))上得到的最小频率间隔如果采样频率为fs,采样时间间隔为t,采样点数为N,采样时间为t(完成一组样本的采集所需要的时间),则频率分辨率为:f0 = fs/N = 1/t。所以信号长度越长,频率分辨率越好。
为了使陷波更加精准,将每帧符号数修改为16384,最后生成的clean_signals和noise_signals均reshape为[frame,1024,16]输入CGAN。
参数 | 内容 |
---|---|
EbN0 | 8dB |
信噪比 | 8dB |
上采样倍数 | 2 |
采样频率 | 4e8 |
信干比 | -10dB/-20dB/-30dB |
频偏 | 0/2000/5000 |
不加PLL时,每帧符号数16384,上采样倍数为2,EbNo = SNR = 8dB
结论:当符号数增加为16384后,频偏为0时BER有所提升;频偏不为0时,误码率增大。原因如下。
如下是代码中添加频偏的部分:
Rs = 2e8; % 符号速率
sps = 2; % 上采样倍数
fs = sps * Rs; % 采样频率
symbol_num = 16384;
f_shift = 2000; % 频率偏移
t0 = (0:symbol_num*sps-1)/fs;
% 加频偏
channel_out_delay(:,jj) = channel_out(:,jj).*exp(1j*2*pi*f_shift*t0');
plot(t0,real(exp(1j*2*pi*f_shift*t0')));
以频偏为2000为例,不同符号数的指数信号实部时域图像如图所示。
符号数为1024时,值基本上都在0.99附近,所以频偏对信号影响就比较小。符号数增长后,信号衰减较大,导致了BER变高。序列越长、频偏越大,对BER的影响越大。
结论:当信干比为-10dB时,陷波15M效果更好;当信干比为-20dB时,陷波20M效果更好;当信干比为-30dB时,陷波应该更多。(符号序列长度、频偏不影响陷波的多少)
之前系统结构不对,接收端应该是陷波-PLL-匹配-下采,而不是匹配-下采-陷波-PLL。
用16384点陷波时,并没有让误码率提高,可能是因为陷波不加过渡带是10M,加上过渡带可能是15M、16M,所以调整干扰,使得干扰加上过渡带后一共10M。
MATLAB中,复数信号的矩阵转置为共轭转置,如果仅仅需要转置,不能使用以下代码进行转置。
Sig = rxsig';
在命令行中进行测试:
因此,在转置时导致了数据共轭,而数据维度正确从而不会报错,导致误码率在0.5左右。
正确的转置代码如下:
Sig = rxsig.';
修改系统结构后,从匹配-下采-陷波-PLL到陷波-PLL-匹配-下采。第一种系统结构,画陷波后数据时已经下采过了,所以是channel_out_r(1:symbol_num,pp),symbol_num=1024。修改系统结构后,陷波之后还没下采,应该横坐标是2048个点,channel_out_r(:,pp)。如果还用channel_out_r(1:symbol_num,pp)就会出现陷波好像没陷干净的问题。