当前位置:网站首页>BPSK调制系统MATLAB仿真实现(1)
BPSK调制系统MATLAB仿真实现(1)
2022-07-25 15:22:00 【町棠棠】
1. 写在前面
不加载波进行调制。
2. 数字基带传输系统框图

2.1 基带脉冲的产生
基带脉冲即二进制01随机序列,可用randn函数产生
%%基带信号产生
data_source = round(rand(1,data_len)); % 二进制随机序列
data_len是数据长度(详细代码见后文)
图形如下:
2.2 BPSK信号形成
BPSK是双极性信号,即“1”表示正电平“+1”,“0”表示负电平“-1”
%%BPSK基带调制
send_signal = (ham_code - 1/2) * 2; % 双极性不归零序列

2.3 高斯白噪声
高斯白噪声的产生可用awgn()函数或wgn函数均可,具体参数可以在MATLAB中help查看
noise2 = sqrt(N0(z)/2) * randn(1,data_len); %高斯白噪声

2.4 基带解调
解调规则:接收到的信号大于0则判为1,小于0则判为0
%BPSK基带解调
for w = 1:code_len
if (receive_signal(w) >= 0)
demod_signal(w) = 1; % 接收信号大于0 则判1
else
demod_signal(w) = 0; % 接收信号小于0 则判0
end
end

2.5 计算误码率
仿真误码率 = 错误码元个数 / 总码元个数;
理论仿真误码率 =
;
%统计码元错误个数
for w = 1:data_len
if (decode_signal(w) ~= data_source(w))
error(q) = error(q) + 1; % 错误比特个数
end
end
%计算误码率
simu_ber_ham(q) = error(q)/data_len;
theory_ber_BPSK(q) = qfunc(sqrt(2*SNR(q))); % 理论误比特率

3 代码
clc
clear
close all;
%%初始化参数设置
data_len = 100000; % 原始数据长度
SNR_dB = 0:10; % 信噪比 dB形式
SNR = 10.^(SNR_dB/10); % Eb/N0
Eb = 1; % 每比特能量
N0 = Eb./SNR ; %噪声功率
error2 = zeros(1,length(SNR_dB)); % 码元错误个数
simu_ber_BPSK = zeros(1,length(SNR_dB)); % 仿真误误码率
theory_ber_BPSK = zeros(1,length(SNR_dB)); % BPSK理论误码率
demod2_signal= zeros(1,data_len); % 解调信号
%%基带信号产生
data_source = round(rand(1,data_len)); % 二进制随机序列
%%BPSK基带调制
send_signal2 = (data_source - 1/2)*2; % 双极性不归零序列
%%高斯信道无编码
for z = 1:length(SNR_dB)
noise2 = sqrt(N0(z)/2) * randn(1,data_len); %高斯白噪声
receive_signal2 = send_signal2 + noise2;
demod_signal2 = zeros(1,data_len);
for w = 1:data_len
if (receive_signal2(w) > 0)
demod_signal2(w) = 1; % 接收信号大于0 则判1
else
demod_signal2(w) = 0; % 接收信号小于0 则判0
end
end
%统计错误码元个数
for w = 1:data_len
if(demod_signal2(w) ~=data_source(w) )
error2(z) = error2(z) + 1; % 错误比特个数
end
end
%计算误码率
simu_ber_BPSK(z) = error2(z) / data_len; % 仿真误比特率
theory_ber_BPSK(z) = qfunc(sqrt(2*SNR(z))); % 理论误比特率
end
%%二进制序列、基带信号图像
figure(1);
stem(data_source);
title("二进制随机序列");
axis([0,50,0,1]);
figure(2);
stem(send_signal2);
title("BPSK基带调制--发送信号");
axis([0,50,-1.5,1.5]);
figure(4);
stem(noise2);
title("高斯白噪声");
axis([0,50,-0.5,0.5]);
figure(5)
stem(receive_signal2);
title("接收信号");
axis([0,50,-1.5,1.5]);
figure(7)
stem(demod_signal2);
title("解调信号");
axis([0,50,0,1]);
figure(8);
semilogy(SNR_dB,simu_ber_BPSK,'M-X',SNR_dB,theory_ber_BPSK,'k-s');
grid on;
axis([0 10 10^-5 10^-1])
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('BPSK仿真误码率','BPSK理论误码率');
%%画星座图
scatterplot(send_signal2);
title('发送信号星座图');
scatterplot(receive_signal2);
title('接收信号星座图');
scatterplot(demod_signal2);
title('解码信号星座图');
简化版
clc
close all
clear all
snr_dB=1:10; %信噪比范围
snr = 10.^(snr_dB/10); %单位换算
delt_fa = 10.^(-snr_dB/10); %白噪声的方差 即噪声功率
delt = sqrt(delt_fa); %噪声幅值(强度)
Pe = zeros(1,length(snr_dB)); %定义存放误码率的矩阵
for iter = 1:length(snr_dB)
N = 100000; %二进制序列长度
fa_bit = randi([0 1],[1 N]); %bit stream 产生二进制随机序列,长度为N
fa_key = randi([0 1],[1 N]); %密钥序列
fa_enc = bitxor(fa_bit,fa_key); %已加密钥序列
% m_s =2*fa_bit-1; %double polar
m_s =2*fa_enc-1; %double polar 加密钥后的双极性序列(BPSK信号)
me = mean(fa_key); %求均值
av = var(fa_key); %求方差
n =delt(iter)*(randn(1,N) + sqrt(-1)*randn(1,N))/sqrt(2); %复噪声
r = m_s + n; % BPSK信号加信道噪声
es_fa = sign(real(r)); %抽样判决
es_bit = (1+es_fa)/2; %二进制序列(解调)
de_enc = bitxor(es_bit,fa_key); %解密
% Pb(iter) = sum(fa_bit~=es_bit)/N;
Pe(iter) = sum(fa_bit~=de_enc)/N; %计算误码率
theory_Pe = erfc(sqrt(snr))/2; %计算理论误码率
end
figure
semilogy(snr_dB,Pe,'r-o',snr_dB,theory_Pe,'*-b');%画曲线
xlabel('信噪比SNR (dB) ');
ylabel('误码率BER');
title('误码率曲线 SNR/10dB')
legend('BPSK仿真误码率','BPSK理论误码率');
边栏推荐
- args参数解析
- UITextField的inputView和inputAccessoryView注意点
- spark中saveAsTextFile如何最终生成一个文件
- Endnote 添加中文GBT7714样式 word中如何引用文献
- 记一次Spark报错:Failed to allocate a page (67108864 bytes), try again.
- 在win10系统下使用命令查看WiFi连接密码
- Scala110-combineByKey
- MySQL installation and configuration super detailed tutorial and simple database and table building method
- redis淘汰策列
- Spark 内存管理机制 新版
猜你喜欢

outline和box-shadow实现外轮廓圆角高光效果

如何解决Visual Studio中scanf编译报错的问题

Use the command to check the WiFi connection password under win10 system

Docker上运行redis以配置文件方式启动,连接客户端报错Error: Server closed the connection

Debounce and throttle

图论及概念

用setTimeout模拟setInterval定时器

用OpenPose进行单个或多个人体姿态估计

小波变换--dwt2 与wavedec2

Implementation of asynchronous FIFO
随机推荐
Iframe nested other website page full screen settings
Boosting之GBDT源码分析
数据系统分区设计 - 请求路由
打开虚拟机时出现VMware Workstation 未能启动 VMware Authorization Service
UITextField的inputView和inputAccessoryView注意点
Scala110-combineByKey
Spark002 --- spark task submission, pass JSON as a parameter
Spark获取DataFrame中列的方式--col,$,column,apply
Once spark reported an error: failed to allocate a page (67108864 bytes), try again
ML - 自然语言处理 - 自然语言处理简介
期货在线开户是否安全?去哪家公司手续费最低?
How spark gets columns in dataframe --column, $, column, apply
了解一下new的过程发生了什么
spark中saveAsTextFile如何最终生成一个文件
记一次Yarn Required executor memeory is above the max threshold(8192MB) of this cluster!
Delayed loading source code analysis:
Spark judges that DF is empty
从 join on 和 where 执行顺序认识T-sql查询执行顺序
密码强度验证示例
Spark提交参数--files的使用