BPSK调制解调链路实现

发布于:2023-01-07 ⋅ 阅读:(544) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

        经过多年的学习,发现自己虽然通信专业科班出身,并且现在从事相关工作,但是工作中常常对很多概念含糊不清,所以想通过整理将现有的通信算法流程整理一下,查漏补缺,如有帮助到他人,也是手有余香的美事。


一、通信系统整体概念

        通信系统非常庞杂,但是学习时总是分模块理解,比较碎片化,常常只是处理整个流程中非常小的一部分,很难从全景出发。所以我想先能有个整体躯干,然后基于这一躯干逐步补充算法的枝节。我想在每个文档的给出每个模块的优化,对整体的性能影响。如下图所示,一个简单的通信系统分为如下几个模块,信源,发送设备,信道,噪声,解调器,信宿。

我想就从上述这个模型出发,搭建一个仿真链路,说明每个通信中的处理步骤的作用,首先从最简单的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调制解调,加窗,采样等处理节点的具体实现,并给出了仿真性能结果,希望能给大家带来帮助,接下来我会给出信道对信号处理的影响。


网站公告

今日签到

点亮在社区的每一天
去签到