实验2:BPSK调制与解调
一、实验目的
本实验将帮助学员理解BPSK调制与解调的基本概念,了解BPSK调制与解调过程中的主要功能单元,观察调制解调过程中的信号波形,并验证相关数字通信理论。通过本次实验,学员将达成如下实验目的:
(1)通过时域和频域观察,了解BPSK调制与解调的基本特征;
(2)理解BPSK通信系统的最佳接收机结构;
(3)仿真BPSK通信系统的误码性能,并和理论结果进行对比;
(4)了解噪声和干扰对数字通信系统的影响;
二、实验原理
2.1 BPSK调制原理
BPSK是二进制相移键控的简称,利用两种相位来传输二元符号。它最常用的两种相位是0与Π,在n时隙上,其信号可以表示为:
图1 BPSK信号表示公式
即传输码元 1时采用与载波同相的正弦波,而传输码元 0 时采用与载波反相的正弦波。这种通过载波的不同相位来直接表示二进制数字信号的调制方式,又称为二进制绝对相移方式。其调制原理图如下所示:
图2 BPSK调制原理图_乘积法
通过相乘的方式,体现出相位之间的变化,把基带信号调制为BPSK信号。
2.2 BPSK解调原理
得到BPSK信号以后,通过AWGN信道传递信号,再对接收到的信号进行解调和抽样,就可以完成原始信号的还原了。在这个过程中,信道中可能对信号施加的噪声、解调时选用的滤波器以及抽样的判决电平等等因素都可能会对结果产生较大影响,整个传输的示意图如下所示:
![]() |
图3 BPSK调制解调流程图
三、实验内容
在本实验中,我们将探究在不同信噪比之下,BPSK信号通过加性高斯白噪声模拟的信道后的实际误码率,并和理论误码率测量公式计算的结果进行对比,分析影响误码率的因素。实验流程图如下:
图4 MATLAB流程图
3.1 BPSK调制
-
信号选取
信号的来源有很多,可以是一段随机的01序列,也可以是一张图片或者一段音频。在这里需要满足下述两个条件:
- 可以记录下原始的信号;
- 样本的数量足够且充分随机;
为便于研究,我们使用随机的01序列作为信号来源:
-
BPSK映射
基于随机信号产生双极性NRZ:根据之前产生的01序列,可以通过乘2减1或者判决是否小于‘1’,把‘0’变为‘-1’,把‘1’变为‘+1’。
-
上采样
在相邻采样点之间插入(每个符号的采样点数sps-1)个0,实现上采样,使得信号更加平滑,减小误码率,提高系统性能。
图5 上采样的结果图
这里查看了6个符号的结果。
-
脉冲成形
为了更加贴近实际,我们在这里使用了平方根升余弦脉冲,作为脉冲成形滤波器,将数字信号与脉冲成形滤波器进行卷积,得到输出信号。
-
载波调制
将映射得到的序列与频率为fc的载波相乘,调制得到BPSK信号。
图6 载波调制后的时域波形
可以看到与矩形脉冲不同的是,信号调制后的幅度有明显的的不同;在不同信号之间,相位差也较为明显。
图7 载波调制后的频域波形
图8 载波调制后的眼图
不难看出此时眼图是“清晰”的,说明信号质量是较好的。
3.2 BPSK解调
-
相干解调
BPSK只可以通过相干解调的方式来恢复信号,用接收到的信号与载波相乘,将不同信号分隔开。
图9 解调后的时域波形
图10 解调后的频域波形
在频域图中可以看到比较明显的尖锐部分,说明高频被隔离出来了。
-
LPF
滤除高频噪声。
图11 LPF后的时域波形
图12 解调后的频域波形
经过LPF滤波后,频域和时域图明显变得“顺滑”接近传输的图像了。
-
匹配滤波器
为恢复原始的波形,使用匹配滤波器对低通滤波后的信号进行处理
-
下采样
下采样则是在接收端对接收到的信号进行抽取,减小采样率,降低计算量,同时使得信号更加稳定,减少噪声影响。
-
判决
对处理的信号判决恢复电平。
图13 完成调制与解调后的序列对比图
图14 完成调制与解调后的序列对比图(放大)
图中绝大部分是“红色”,说明信号传输以后基本实现了正确的识别,但同时在图中还是存在部分“黑色”凸显,说明实际上由于噪声等原因还是产生了误码。
-
理论和实际误码率的对比
图15 不同信噪比下的误码率对比
可以看到两个曲线基本是重合的,证明理论模型对实际传输的误码分析是正确的。
四、问题与建议
问题:在你设计传输的基带方案中,通过理论分析和实验说明所采用的发射和接收脉冲级联响应是否满足Nyquist第一准则?
答:在我设计的方案中,我选择了平方根升余弦脉冲作为级联响应。
- 理论分析:
首先我们需要获取平方根升余弦滤波器的滚降系数α,通过α计算出滤波器对应的带宽,并与我们设置的带宽对比即可。在本实验中,我们的α设置为0.5,Rs设置为1e6,fs设置为16e6,根据公式
,得到滤波器对应的带宽为0.75MHz,而当前的带宽大小为8MHz,所以理论上可以认为所采用的发射和接收脉冲级联响应满足Nyquist第一准则。
- 实验说明:
我们可以通过绘制眼图来观察采样后的信号,并判断是否满足Nyquist第一准则。如果眼图打开足够宽,没有重叠或者其他失真,那么就说明该脉冲响应满足Nyquist第一准则。
图16 发射端和接收端眼图的误码率对比
此外,通过计算误码率并与理论误码率进行比较,也可以初步判断是否采用了正确的脉冲响应。
附录:MATLAB代码
clc;
clear all;
close all;
%%%%%%%%%%%%%%%%%%%%% 程序主体 %%%%%%%%%%%%%%%%%%%%%
Rb = 1e6; % 比特速率 = 1MHz
M = 2; % 进制数
Rs = Rb * log2(M); % 符号速率,对于M=2而言,Rs = Rb
Fc = 2e6; % 载波频率
Fs = 16e6; % 采样频率【满足Niquest采样定理】
sps = Fs / Rs; % 每个符号的采样点数
t_simu = 1e-3; % 仿真持续时间 = 1ms
Symbols = Rb * t_simu; % 总符号数
N = Symbols * sps; % 总比特数
n = 0 : N - 1; % 采样点数的下标
t = n / Fs; % 采样时刻
%%%%%%%%%%%%%%%%%%%%% 发射机 %%%%%%%%%%%%%%%%%%%%%
%%%%%% 产生基带信号
data = randi([0 1], 1, Symbols); % 生成0/1比特序列
x = 1 - 2 * data; % 进行符号映射,将0/1序列映射到
%%%%%% 定义脉冲成型滤波器
roll_off = 0.5;
num_of_symbols = 6;
fir_rcos_trans = rcosdesign(roll_off, num_of_symbols, sps, 'sqrt'); % 根升余弦滤波器
N_fir = length(fir_rcos_trans); % 根升余弦滤波器的长度
%%%%%% 对信号进行上采样
data_upsample = upsample(x, sps); % upsample(x, n)在向量x的相邻2个点之间插入(n-1)个0实现上采样
%%%%%% 将上采样的信号送入脉冲成形滤波器进行成型滤波
data_bx = conv(data_upsample, fir_rcos_trans);
% 考虑滤波器的延时:
% conv :首尾均去掉 (N - 1) / 2
% filter :去掉前 (N - 1) / 2
% filtfilt :没有延时
data_bx = data_bx((N_fir- 1) / 2 + 1: end - (N_fir- 1) / 2); % 考虑了成型滤波器的时延
%%%%%% BPSK调制
carrier = cos(2 * pi * Fc * t); % 定义载波
data_bpsk = data_bx .* carrier;
%%%%% 绘图
% figure(1);
% plot(t, data_bpsk);
% title('信号的时域波形');
%
% figure(2);
% pwelch(data_bpsk);
% title('信号频谱');
%
% eyediagram(data_bpsk, sps);
% title('眼图');
%%%%%%%%%%%%%%%%%%%%% 信道(加噪声) %%%%%%%%%%%%%%%%%%%%%
%%%%% 设置信噪比
EbN0 = -6 : 8; % 数字通信系统的性能指标,是归一化的SNR:EbN0 = S / N * (W / Rb)
EsN0 = EbN0 + 10 * log10(M);
snr = EbN0 - 10 * log10(0.5 * Fs / Rb);
%%%%% 将BPSK信号通过AWGN信道
for i = 1 : length(snr)
data_bpsk_addnoise = awgn(data_bpsk, snr(i), 'measured');
%%%%%%%%%%%%%%%%%%%%% 接收机 %%%%%%%%%%%%%%%%%%%%%
%%%%% 相干解调
y_demod = data_bpsk_addnoise .* carrier;
%%%%% 绘图
% figure(4);
% plot(t, y_demod);
% title('相干解调后信号的时域波形');
%
% figure(5);
% pwelch(y_demod);
% title('相干解调后信号频谱');
%%%%% LPF
fir_lp = fir1(128, 0.2); % LPF的阶数为128,截止频率为0.2 * (Fs/2)
N_LPF = length(fir_lp);
y_demod_lpf = filter(fir_lp, 1, y_demod);
% 考虑了LPF的时延
y_demod_lpf = y_demod_lpf((N_LPF - 1) / 2 + 1:end);
%%%%% 匹配滤波器
fir_rcos_rec = fir_rcos_trans;
N_fir_rec = length(fir_rcos_rec); % MF的阶数
y_demod_lpf_MF = conv(y_demod_lpf, fir_rcos_rec);
% 考虑了匹配滤波器的时延
y_demod_lpf_MF = y_demod_lpf_MF((N_fir_rec- 1) / 2 + 1: end - (N_fir_rec- 1) / 2);
%%%%% 抽取
y_end = y_demod_lpf_MF(1 : sps : end);
%%%%% 判决
for k = 1 : length(y_end)
if y_end(k) >= 0
y_end(k) = 1;
else
y_end(k) = -1;
end
end
%%%%% 绘图
% figure(6);
% stem(y_end,'-k*');hold on;
% stem(x,'-ro'); hold on;grid on;
% legend('最后输出序列','基带序列');
%
% eyediagram(data_bpsk, sps);
% title('发射端眼图');
%
% eyediagram(y_demod_lpf_MF, sps);
% title('接收端眼图');
%%%%%%%%%%%%%%%%%%%%% 信宿 %%%%%%%%%%%%%%%%%%%%%
%%%%% 误码率性能比较
error=0;
for j = 1:length(y_end)
if ( y_end(j) ~= x(j))
error=error+1;
end
end
bit_error_ratio(i) = error / length(y_end);
end
%%%%% 理论误码率
ber = berawgn(EbN0,'psk',2,'nondiff');
%%%%%%%%%%%%%%%%%%%%% 仿真结果 %%%%%%%%%%%%%%%%%%%%%
semilogy(EbN0, bit_error_ratio,'-*', EbN0, ber, '-+');
xlabel('EbNo');
ylabel('BER');
title('不同信噪比下的误码率仿真曲线');
legend('实验曲线','理论曲线');
grid on
参考文献
这是个人的学习记录,分享给正在学习通信原理的同学,这里有几篇参考文章,感谢博客主给我带来的帮助。
1.BPSK系统的调制和解调 - ee_101的文章 - 知乎 https://zhuanlan.zhihu.com/p/581277432
2.数字频带传输---BPSK - 俗世的囚徒遇见的文章 - 知乎 https://zhuanlan.zhihu.com/p/402121295