⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qpsk_ber.m

📁 考虑载波的qpsk信号在瑞利信道上的仿真
💻 M
字号:
% 编一个统计qpsk调制的误码率程序;
% clc; clear all; close all;
ray_factor=0.25;
% 发送的二进制点数;
N=10000; m=20;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 下面的程序只设置五条多径;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 初始是0101的代码;
input_signal=ceil(rand(1,N)-0.5);
% 再转化为+-1的双极性码;
input_signal=sign(input_signal-0.5);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 很关键的一点就是:
% 设置基带信号的采样点数,用于将来的延迟设置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 模拟发送信号;一路二进制比特信号被分成两路sin和cos正交的信号,
% 这两路信号是不会相互干扰的,两路信号分别有延迟和噪声;
for i=1:2:size(input_signal,2)-1
    channel_i((i+1)/2)=input_signal(i);
end;
for i=2:2:size(input_signal,2)
    channel_q((i)/2)=input_signal(i);
end;

% 转化为发送信号的形式;
channel_i_i=symbol_sample(channel_i,m);
channel_q_q=symbol_sample(channel_q,m);

 snr_plot=-20:20;
 ber=[];
 
for snr=-20:20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 经过瑞利多径信道后的结果
% 加噪声;
sigma=sqrt(1/10^(snr/10));
channel_i_ray=Rayleigh_DuoJing...
    (channel_i_i,sigma,5,ray_factor,[0,1,2,3,4],[0,-1,-2,-3,-4]);
channel_q_ray=Rayleigh_DuoJing...
    (channel_q_q,sigma,5,ray_factor,[0,1,2,3,4],[0,-1,-2,-3,-4]);
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % 加噪声;
% sigma=sqrt(1/10^(snr/10));
% randn('state',0);
% channel_i_ray=channel_i_ray+sigma*randn(size(channel_i_i));
% channel_q_ray=channel_q_ray+sigma*randn(size(channel_q_q));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 以下是检测部分;
matrix_4=[ones(m,1),ones(m,1),(-1)*ones(m,1),(-1)*ones(m,1);
          ones(m,1),(-1)*ones(m,1),ones(m,1),(-1)*ones(m,1)];

output_signal=zeros(2,size(input_signal,2)/2);

for i=1:size(input_signal,2)/2
    i_q=[channel_i_ray((i-1)*m+1:i*m),...
        channel_q_ray((i-1)*m+1:i*m)];
    temp_i_q=i_q*matrix_4;
    max_i_q=max(i_q*matrix_4);
    if temp_i_q(1)==max_i_q
       output_signal(:,i)=[1;1];
    elseif temp_i_q(2)==max_i_q
       output_signal(:,i)=[1;-1];
    elseif temp_i_q(3)==max_i_q
       output_signal(:,i)=[-1;1];
    elseif temp_i_q(4)==max_i_q
       output_signal(:,i)=[-1;-1];
    end;
end;

       end_out=[];% 最后输出的比特信息;
   for i=1:size(input_signal,2)/2
       temp_out=output_signal(:,i)';
       end_out=[end_out,temp_out];
   end;
   
   xx=find(input_signal-end_out);
   x_len=length(xx);
   ber_temp=x_len/N;
   ber=[ber,ber_temp];
end;
figure;
semilogy(snr_plot,ber,'b^-'); hold on;





% 设置了10条多径;

N=10000;
% 初始是0101的代码;
input_signal=ceil(rand(1,N)-0.5);
% 再转化为+-1的双极性码;
input_signal=sign(input_signal-0.5);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 很关键的一点就是:
% 设置基带信号的采样点数,用于将来的延迟设置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 模拟发送信号;一路二进制比特信号被分成两路sin和cos正交的信号,
% 这两路信号是不会相互干扰的,两路信号分别有延迟和噪声;
for i=1:2:size(input_signal,2)-1
    channel_i((i+1)/2)=input_signal(i);
end;
for i=2:2:size(input_signal,2)
    channel_q((i)/2)=input_signal(i);
end;

% 转化为发送信号的形式;
channel_i_i=symbol_sample(channel_i,m);
channel_q_q=symbol_sample(channel_q,m);

 snr_plot=-20:20;
 ber=[];
 
for snr=-20:20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 经过瑞利多径信道后的结果
% 加噪声;
sigma=sqrt(1/10^(snr/10));
channel_i_ray=Rayleigh_DuoJing...
    (channel_i_i,sigma,10,ray_factor,[0,1,2,3,4,5,6,7,8,9],[0,-1,-2,-3,-4,-5,-6,-7,-8,-9]);
channel_q_ray=Rayleigh_DuoJing...
    (channel_q_q,sigma,10,ray_factor,[0,1,2,3,4,5,6,7,8,9],[0,-1,-2,-3,-4,-5,-6,-7,-8,-9]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % 加噪声;
% sigma=sqrt(1/10^(snr/10));
% randn('state',0);
% channel_i_ray=channel_i_ray+sigma*randn(size(channel_i_i));
% channel_q_ray=channel_q_ray+sigma*randn(size(channel_q_q));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 以下是检测部分;
matrix_4=[ones(m,1),ones(m,1),(-1)*ones(m,1),(-1)*ones(m,1);
          ones(m,1),(-1)*ones(m,1),ones(m,1),(-1)*ones(m,1)];

output_signal=zeros(2,size(input_signal,2)/2);

for i=1:size(input_signal,2)/2
    i_q=[channel_i_ray((i-1)*m+1:i*m),...
        channel_q_ray((i-1)*m+1:i*m)];
    temp_i_q=i_q*matrix_4;
    max_i_q=max(i_q*matrix_4);
    if temp_i_q(1)==max_i_q
       output_signal(:,i)=[1;1];
    elseif temp_i_q(2)==max_i_q
       output_signal(:,i)=[1;-1];
    elseif temp_i_q(3)==max_i_q
       output_signal(:,i)=[-1;1];
    elseif temp_i_q(4)==max_i_q
       output_signal(:,i)=[-1;-1];
    end;
end;

       end_out=[];% 最后输出的比特信息;
   for i=1:size(input_signal,2)/2
       temp_out=output_signal(:,i)';
       end_out=[end_out,temp_out];
   end;
   
   xx=find(input_signal-end_out);
   x_len=length(xx);
   ber_temp=x_len/N;
   ber=[ber,ber_temp];
end;

semilogy(snr_plot,ber,'r*-'); grid on;
xlabel('Eb/No(dB)'); ylabel('误比特率'); 
title('短波瑞利多径信道下的误比特率曲线');
hold on;























%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 下面的程序设置20条多径;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




% 发送的二进制点数;
N=10000; 
% 初始是0101的代码;
input_signal=ceil(rand(1,N)-0.5);
% 再转化为+-1的双极性码;
input_signal=sign(input_signal-0.5);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 很关键的一点就是:
% 设置基带信号的采样点数,用于将来的延迟设置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 模拟发送信号;一路二进制比特信号被分成两路sin和cos正交的信号,
% 这两路信号是不会相互干扰的,两路信号分别有延迟和噪声;
for i=1:2:size(input_signal,2)-1
    channel_i((i+1)/2)=input_signal(i);
end;
for i=2:2:size(input_signal,2)
    channel_q((i)/2)=input_signal(i);
end;

% 转化为发送信号的形式;
channel_i_i=symbol_sample(channel_i,m);
channel_q_q=symbol_sample(channel_q,m);

 snr_plot=-20:20;
 ber=[];
 
for snr=-20:20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 经过瑞利多径信道后的结果
% 加噪声;
sigma=sqrt(1/10^(snr/10));
channel_i_ray=Rayleigh_DuoJing...
    (channel_i_i,sigma,20,ray_factor,[0:19],(-1)*[0:19]);
channel_q_ray=Rayleigh_DuoJing...
    (channel_q_q,sigma,20,ray_factor,[0:19],(-1)*[0:19]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% randn('state',0);
% channel_i_ray=channel_i_ray+sigma*randn(size(channel_i_i));
% channel_q_ray=channel_q_ray+sigma*randn(size(channel_q_q));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 以下是检测部分;
matrix_4=[ones(m,1),ones(m,1),(-1)*ones(m,1),(-1)*ones(m,1);
          ones(m,1),(-1)*ones(m,1),ones(m,1),(-1)*ones(m,1)];

output_signal=zeros(2,size(input_signal,2)/2);

for i=1:size(input_signal,2)/2
    i_q=[channel_i_ray((i-1)*m+1:i*m),...
        channel_q_ray((i-1)*m+1:i*m)];
    temp_i_q=i_q*matrix_4;
    max_i_q=max(i_q*matrix_4);
    if temp_i_q(1)==max_i_q
       output_signal(:,i)=[1;1];
    elseif temp_i_q(2)==max_i_q
       output_signal(:,i)=[1;-1];
    elseif temp_i_q(3)==max_i_q
       output_signal(:,i)=[-1;1];
    elseif temp_i_q(4)==max_i_q
       output_signal(:,i)=[-1;-1];
    end;
end;

       end_out=[];% 最后输出的比特信息;
   for i=1:size(input_signal,2)/2
       temp_out=output_signal(:,i)';
       end_out=[end_out,temp_out];
   end;
   
   xx=find(input_signal-end_out);
   x_len=length(xx);
   ber_temp=x_len/N;
   ber=[ber,ber_temp];
end;

semilogy(snr_plot,ber,'ks-'); grid on;
legend('5条多径','10条多径','20条多径');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -