二进制相移键控(BPSK)

基础

BPSK的时域表达式是

  • :待发送的二进制信息
  • :符号周期
  • :成型滤波器的冲激响应
  • :载波中心频率

:未必整数倍

MATLAB仿真

按照上图流程进行MATLAB仿真

调制与解调

设定参数:系统时钟频率为,根升余弦滤波器滚降系数,其它参数可修改

1
2
3
4
5
6
7
sys_clk = 160e6;
Rb = 5e6; % //FIXME
Rs = Rb; Ts = 1 / Rs;

usmp_rate = sys_clk / Rs; % //FIXME
fc = 20e6; % //FIXME
hrc = 'rrc'; % //FIXME
  1. 随机生成num个二进制数,并对极化处理:
1
2
3
4
num = round(100000 * 10 ^ (EbNo / 10));
b = randi([0 1], 1, num);
b_sign = 1 - 2 * b;
% b_sign = exp(1j * pi * b) % 1: cos(-\pi)=-1 / 0: cos(\pi)=1
  1. 成型滤波,并去除延迟:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch hrc
case 'rect'
h = ones(1, usmp_rate + 1);
case 'sinc'
t = -3 * pi : pi / usmp_rate : 3 * pi;
h = sinc(t);
case 'rrc'
beta = 0.35;
span = 6;
sps = usmp_rate;
h = rcosdesign(beta, span, sps, 'sqrt');
end

baseband = conv(upsample(b_sign, usmp_rate), h);
delay = (length(h) - 1 ) / 2;
baseband = baseband(delay + 1:end - delay);

基带信号的时域波形与功率谱密度
  1. 载波调制
1
2
3
4
5
phase = 2 * pi * rand;
total_t = Ts * num;
t = 0 : 1/sys_clk : (total_t - 1/sys_clk);
carrier = cos(2 * pi * fc * t + phase);
modulated_signal = baseband .* carrier;

调制信号的时域波形与功率谱密度

  1. 经过高斯白噪声信道

的关系:

1
2
SNR = EbNo - 10 * log10(usmp_rate / 2);
noised_signal = awgn(modulated_signal, SNR, 'measured');
  1. 相干解调
1
2
local_carrier = 2 * carrier;
received_signal = noised_signal .* local_carrier;

相干解调信号的时域波形与功率谱密度
  1. 匹配滤波与抽样判决
1
2
3
4
mf_dout = conv(received_signal, fliplr(h));
delay = (length(h) - 1) / 2;
decision_result = downsample(mf_dout(delay+1:end), usmp_rate);
decision_result = decision_result(1:num);

匹配滤波后信号的时域波形与功率谱密度

仿真结果

将仿真得到的误比特率曲线与理论误比特率曲线比较,基本重合

理论分析

载波频率对误比特率的影响

带通采样定理:

频带信号如图所示,为了保证被采样后不会发生混叠,需要满足条件:

在采样频率、码元速率一定时,由带通采样定理可以推导出载波频率的范围: 时,可以得到载波频率的取值范围

内插系数对误比特率的影响

时,可以得到内插系数的范围是

接收机采样点位置对误比特率的影响

由仿真结果可以看出,在最佳的接收机采样点处采样,误比特率最低,距离该点越远,误比特率越高。

成型滤波器对误比特率的影响

几乎无影响。

FPGA仿真(调制)

设定参数:系统时钟频率为,传输速率,发送比特数为位。

1
2
3
4
5
6
7
8
9
10
11
12
13
reg [14:0] counter = 15'd0;
always @(posedge clk) begin
if (!rst_n) begin
counter[14:0] <= 13'd0;
end
else begin
counter[14:0] <= counter[14:0] + 13'd1;
end
end

wire [9:0] address;
// sys_clk = 160M / Rb = 5M = 32
assign address[9:0] = counter[14:5];

由系统时钟频率和传输速率可以得到内插系数为,需要位计数器;发送位数据,需要位地址,于是定义计数器变量为reg [14:0] counter,每计数,地址增,将counter的高位赋值给.

存储数据、成型滤波、载波调制等过程通过IP核实现:

功能 IP 核
存储数据 Block Memory Generator
成型滤波 FIR Compiler
生成载波 DDS Compiler
载波调制 Multiplier
生成系统时钟 Clock Wizard

仿真波形如下图