|
[求助]
【本科问题】BPSK理论误比特率与仿真误比特不吻合
源程序如下
一、BPSK仿真程序
function [bit_err_ratio1] = Program_BPSK(EBN0)
%%%%%%%%%%%%%%%%%%%% BPSK调制解调器误码性能仿真程序 %%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%% BPSK_modern_siml.m %%%%%%%%%%%%%%%%
%%%%%%%%% date: 2018-09-26 author: %%%%%%%%%%%
%%%%%%%%%% 程序说明
%完成BPSK调制解调器的仿真,比较不同信噪比下的误码性能。
%通信体制具体内容如下:
%调制方式:BPSK 编码方式:无
%滚降因子: 0.5
%解调方式:相干解调 译码方式:无
%噪声:加性高斯白噪声
%中频信号仿真
%%%% 仿真环境
%软件版本:matlab 2016a
%clear all;
%close all;
format long;
%%%%%%%%%%%%%%%%%%%%%%%%%%%% 程序主体 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 系统参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
bit_rate = 1000; %比特率
symbol_rate= 1000; %符率
fre_sample = 16000; %采样频率
symbol_sample_rate = 16; % —个符号内的采样倍数
fre_carrier = 4000; %载波频率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信源 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 随机信号
msg_source = [ones(1,20) zeros(1,20) randi([0,1],1,960)]; %总共1000个符号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 发射机 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%编码器
%%% BCH编码
% 确定BCH生成多项式 这里使用本原BCH码15 5
n=15;k=5; % n=2^4-1;
genpoly_gf = bchgenpoly(n,k);
genpoly_db = double(genpoly_gf.x);
%disp(['BCH' num2str(n), ',' ,num2str(k),')'])
%disp('GenPoly:')
%disp(genpoly_db)
msg_source_BCH=zeros(1,3000);
% 确定生成矩阵
% 将生成多项式的根逐个代入接收多项式,所得的值就是伴随式序列
G= [1 0 0 0 0 1 0 1 0 0 1 1 0 1 1;
0 1 0 0 0 1 1 1 1 0 1 0 1 1 0;
0 0 1 0 0 0 1 1 1 1 0 1 0 1 1;
0 0 0 1 0 1 0 0 1 1 0 1 1 1 0;
0 0 0 0 1 0 1 0 0 1 1 0 1 1 1;];
% msg_source_BCH=encode(msg_source,15,5,'bch');
j = 1;
for i=1:15:3000
msg_source_BCH(i:i+14) = msg_source(j:j+4)*G;
j = j + 5;
end
msg_source_BCH = mod(msg_source_BCH,2);
%%%%% 调制器
%%% 双极件变换
%bipolar_msg_source = 2*msg_source_BCH-1; %BCH编码调制
bipolar_msg_source=2*msg_source-1; %直接调制
%%% 滤波器
% rcosflt 滚降成型滤波
rcos_msg_source = rcosflt(bipolar_msg_source,1000,16000);
fir = rcosdesign(0.5,6, symbol_sample_rate); %滤波器阶数=96
%rcos_msg_source = filter(fir,1,bipolar_msg_source);
% Roll-off factor 为0.5.
%滤波器可视化
%fvtool(fir,'Analysis','impulse')
%频域观察
fft_rcos_msg_source = abs(fft(rcos_msg_source));
%figure(1)
%plot(rcos_msg_source)
%title('时域波形');
%figure(2)
%plot(fft_rcos_msg_source)
%title('频域波形')
aaa = 1; % 调试断点
%%% 载波发送
time = 1:1:length(rcos_msg_source);
rcos_msg_source_carrier = rcos_msg_source'.*cos(2*pi*fre_carrier.*...
time/fre_sample);
% 频域观察
fft_rcos_msg_source_carrier = abs(fft(rcos_msg_source_carrier));
%figure(3)
%plot(rcos_msg_source_carrier)
%title('时域波形')
%figure(4)
%plot(fft_rcos_msg_source_carrier)
%title('频域波形')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信道 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 设置信噪比
% 10lg16 + snr = 10lgEb/N0, snr = EBN0 - 12.041
% 比特信噪比
snr = EBN0-10*log10(16);
%%% 加性高斯白噪声
rcos_msg_source_carrier_noise = awgn(rcos_msg_source_carrier,snr,'measured');
%rcos_msg_source_carrier_noise = rcos_msg_source_carrier;
% 添加随机噪声
%n =2*randn(size(time));
%rcos_msg_source_carrier_noise=rcos_msg_source_carrier_noise+n;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 接收机 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%解调器
%%% 载波恢复
% 生成本地载波
rcos_msg_source_noise = rcos_msg_source_carrier_noise.*cos(2*pi*...
fre_carrier.*time/fre_sample);
% 滤波高频,保留基带信号
LPF_firl28 = fir1(128,0.2); % 生成低通滤波器
rcos_msg_source_LP = filter(LPF_firl28,1,rcos_msg_source_noise);
% 延时64个采样点输出
%figure(5);
%plot(rcos_msg_source_LP)
%title('时域波形');
%figure(6)
%plot(abs(fft(rcos_msg_source_LP)))
%title('频域波形');
% 匹配滤波器
rolloff_factor = 0.5; %滚降因子
rcos_fir= rcosdesign(rolloff_factor, 6, symbol_sample_rate);
% 生成匹配滤波 a square-rootraised cosine FIR filter with rolloff factor
% 滤波
% filter
rcos_msg_source_MF = filter(rcos_fir,1,rcos_msg_source_LP);
%figure(7)
%plot(rcos_msg_source_MF,'-*')
%title('时域波形')
%figure(8)
%plot(abs(fft(rcos_msg_source_MF)))
%title('频域波形')
%%% 最佳采样点
%选取最佳采样点,一个符号取一个点进行判决
decision_site = 160; % (96+128+96)/2 = 160 三个滤波器延迟值
rcos_msg_source_MF_option = rcos_msg_source_MF(decision_site:...
symbol_sample_rate:end);
% 涉及三个滤波器,固含有三个滤波器延迟累加。
%%% 判决
msg_source_MF_option_sign = sign(rcos_msg_source_MF_option);
%figure(9)
%plot(rcos_msg_source_MF_option,'-*')
%title('时域波形');
%%%%%%%%%%%%%%% 解码器
%%% BCH译码
% 考虑到丢失3个符号,解码时取5的整数倍符号
msg_source_result=zeros(1,995);
code = (msg_source_MF_option_sign+1)/2;
%j = 1;
%for i=1:15:2985
%msg1= gf(code(i:i+14));
%decoded = bchdec(msg1,15,5);
%temp = double(decoded.x);
%msg_source_result(j:j+4) = temp;
%j = j+5;
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信宿 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 误码性能比对
% 使用BCH编码的误码性能
%[err_number,bit_err_ratio] = biterr(msg_source(1:length(...
%msg_source_result)),msg_source_result);
% 不使用BCH编码的误码性能
[err_number,bit_err_ratio1] = biterr(msg_source(1:length(...
msg_source_MF_option_sign)),(msg_source_MF_option_sign+1)/2);
二、比较程序
%%%%%%%%%%%%%%%%%%%% BCH编码前后误码率比较仿真程序 %%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%% compare_BPSK&BCH.m %%%%%%%%%%%%%%%%
%%%%%%%%% date: 2018-09-26 author: 顾勇翔 %%%%%%%%%%%
clc;
clear all;
result = zeros(2,10);
result1 = zeros(2,10);
result2 = zeros(2,10);
% 计算直接BPSK在比特信噪比1-10的变化
for i=1:1:10
[bit_err_ratio1] = Program_BPSK(i);
result(1,i) = i;
result(2,i) = bit_err_ratio1;
end
for i=1:1:10
result2(1,i) = i;
result2(2,i) = berawgn(i,'psk',2,'nondiff');
end
x2=result2(1,;
y2=result2(2,;
figure(3)
plot(x2,y2)
semilogy(x2,y2)
grid on;
hold on
x=result(1,;
y=result(2,;
semilogy(x,y)
legend('理论误比特率','实际误比特率'); |
|