提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
经过多年的学习,发现自己虽然通信专业科班出身,并且现在从事相关工作,但是工作中常常对很多概念含糊不清,所以想通过整理将现有的通信算法流程整理一下,查漏补缺,如有帮助到他人,也是手有余香的美事。
一、通信系统整体概念
通信系统非常庞杂,但是学习时总是分模块理解,比较碎片化,常常只是处理整个流程中非常小的一部分,很难从全景出发。所以我想先能有个整体躯干,然后基于这一躯干逐步补充算法的枝节。我想在每个文档的给出每个模块的优化,对整体的性能影响。如下图所示,一个简单的通信系统分为如下几个模块,信源,发送设备,信道,噪声,解调器,信宿。
我想就从上述这个模型出发,搭建一个仿真链路,说明每个通信中的处理步骤的作用,首先从最简单的BPSK调制解调链路开始。
二、链路实现
1.生成随机bit
a=rand(1,m);
2.量化
代码如下(示例):量化:BPSK调制只有水平幅度的调制,我们可以通过生成范围为0~1的随机比特,然后将这一范围的随机bit映射到-1、1这两个值上。
for i=1:m
if(a(1,i)>0.5)
a(1,i)=1;
else
a(1,i)=-1;
end;
end;
3.调制
将量化后的信号加载到载波上:
bpsk_m(1,i)=a(1,k)*sin(2*pi*0.5*i+fan)+a(1,k)*cos(2*pi*0.5*i+fan);
4.过信道
过信道:基线接收信号y=h*s+n;,这里为了简化逻辑,认为信道不对幅度相位做改变,只有噪声对信号有影响。
bpsk_m=bpsk_m+N0;% 信号加噪声,模拟过信道
5.加窗
加窗后接收信号y=window(h*s+n);这里window(*)表示对信号进行加窗。
tempx=fft(bpsk_m2);
tempxor=tempx;
tempx=tempx.*h0; %低通滤波
tempx=ifft(tempx);
窗函数如下图所示:
加窗前后的信号变化如下图所示:
上图中without window曲线表示没有低通滤波器的滤波的接收到的时域数据信号,从图中可以看出,此时的数据有很多杂波,这也就是高频分量。上图中with window曲线表示通过低通滤波器后接收到的时域数据信号,相对未加窗信号平滑了许多。随后的decoded曲线表示根据加窗后信号解码出的时域数据,又经过量化,变为了-1、1的数字信号。
6.解调
就是简单的硬判决,大于门限一个值,小于门限一个值。
In=real_x1+real_x; % 可只取一路,这里取了两路之和
for i=1:N % 滤波后整形
if(In(1,i)>0) % 判决,得到解调结果
In(1,i)=1;
else
In(1,i)=-1;
end;
end;
三、多信噪比下的误码率
下图给出不同信噪比下的误码率:
从图中可以看出,随着信噪比的增加,误码率在不断改善。
四、完整代码:
如下代码可由matlab/octave实现,前文中的图片均由下述代码实现:
clc;
close all;
clear;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
m=128;
N=512;
fan=pi/20;
n=1:1:N;
snr=-9:1:-2;
for isnr=1:length(snr)
iSNR=10^(snr(isnr)/10);
N0=sqrt(1/iSNR/2)*randn(1,N) ;%噪声
h0=mywindow(N);
%%%%%%%%% 随机序列
a=rand(1,m);
for i=1:m
if(a(1,i)>0.5)
a(1,i)=1;
else
a(1,i)=-1;
end;
end;
%%% 生成BPSK信号
bpsk_m=zeros(1,N);
j=1;k=1;
for i=1:N
if(j==(N/m+1))
j=1;
k=k+1;
end; % 0.05*pi 为初始相位,可以任意改变
bpsk_m(1,i)=a(1,k)*sin(2*pi*0.5*i+fan)+a(1,k)*cos(2*pi*0.5*i+fan);
j=j+1;
end;
bpsk_m=bpsk_m+N0;% 信号加噪声,模拟过信道
% 接收处理 用正交本振与信号相乘,变频
bpsk_m1=bpsk_m.*sin(2*pi*0.5*n);
bpsk_m2=bpsk_m.*cos(2*pi*0.5*n);
%滤波
tempx=fft(bpsk_m1);
tempx=tempx.*h0; %低通滤波
tempx=ifft(tempx);
real_x=real(tempx);
tempx=fft(bpsk_m2);
tempxor=tempx;
tempx=tempx.*h0; %低通滤波
tempx=ifft(tempx);
%显示非滤波后的时域效果
tempxor=ifft(tempxor);
real_x1=real(tempx);
real_x1or=real(tempxor);
In=real_x1+real_x; % 可只取一路,这里取了两路之和
for i=1:N % 滤波后整形
if(In(1,i)>0) % 判决,得到解调结果
In(1,i)=1;
else
In(1,i)=-1;
end;
end;
an=zeros(1,m);
for i=1:m
an(1,i)=In(1,(i-1)*N/m+N/(2*m));
end;
Pe(isnr) = sum(an~=a)/m;
end
figure(1)
subplot(2,1,1);
plot(real_x1or,'k');
hold on
plot(real_x1+real_x,'b');
axis([1 N -2.5 2.5]);
grid on;
hold on;
plot(In,'r');
title('received signal')
legend('without window','with window','decoded');
subplot(2,1,2); % 比较误码
plot(an,'r*');hold on;
axis([1 m -2 2]);
plot(a,'b^');
title('signal')
legend('out','in');
figure(2)
semilogy(snr,Pe,'r-o');%画曲线
xlabel('SNR (dB) ');
ylabel('BER');
title('BER-SNR')
legend('BPSK-simu');
grid on;
figure(3)
plot(1:length(h0),h0)
axis([1 length(h0) 0 1.1]);
title('window')
总结
本文给出了BPSK调制解调,加窗,采样等处理节点的具体实现,并给出了仿真性能结果,希望能给大家带来帮助,接下来我会给出信道对信号处理的影响。