基础·

BPSK 的时域表达式是

eBPSK(t)=n=+anh(tnTS)cos(ωct+φ)e_{BPSK}(t) = \sum_{n = -\infty}^{+\infty} a_nh(t-nT_S)\cos(\omega_ct+\varphi)

  • ana_n:待发送的二进制信息
  • TST_S:符号周期
  • h(t)h(t):成型滤波器的冲激响应
  • ωc\omega_c:载波中心频率

TSN2πωcT_S\sim N\dfrac{2\pi}{\omega_c}:未必整数倍

MATLAB 仿真·

按照上图流程进行 MATLAB 仿真

调制与解调·

设定参数:系统时钟频率为 160MHz160MHz,根升余弦滤波器滚降系数 α=0.35\alpha=0.35,其它参数可修改

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. 经过高斯白噪声信道

SNRSNREb/n0E_b/n_0 的关系:

SNR=SN=Ebn0RbBSNR = \dfrac{S}{N} = \dfrac{E_b}{n_0}\dfrac{R_b}{B}

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);
匹配滤波后信号的时域波形与功率谱密度

仿真结果·

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

理论分析·

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

带通采样定理:

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

{fL+mfsfLfH+(m+1)fsfH\left\{ \begin{aligned} &-f_L + mf_s \leq f_L\\ &-f_H + (m+1)f_s \geq f_H\\ \end{aligned} \right.

2fHm+1fs2fLm\dfrac{2f_H}{m+1} \leq f_s \leq \dfrac{2f_L}{m}

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

2fHm+1fs2fLm(fH=fc+B2,fL=fcB2)m2fs+B2fcm+12fsB2(B=RS21+α×2)m2fs+RS(1+α)2fcm+12fsRS(1+α)2\begin{aligned} &\dfrac{2f_H}{m+1} \leq f_s \leq \dfrac{2f_L}{m}\\ &(f_H = f_c + \dfrac{B}{2}, f_L = f_c - \dfrac{B}{2})\\ &\dfrac{m}{2}f_s + \dfrac{B}{2}\leq f_c \leq \dfrac{m+1}{2}f_s - \dfrac{B}{2}\\ &(B = \dfrac{R_S}{\frac{2}{1+\alpha}}\times 2)\\ &\dfrac{m}{2}f_s + \dfrac{R_S(1+\alpha)}{2}\leq f_c \leq \dfrac{m+1}{2}f_s - \dfrac{R_S(1+\alpha)}{2}\\ \end{aligned}

fs=160MHz,α=0.35,RS=5MHzf_s = 160MHz, \alpha=0.35, R_S = 5MHz 时,可以得到 载波频率的取值范围

m=0,3.375<fc<76.625m=1,83.375<fc<156.625m=2,163.375<fc<236.625\begin{aligned} &m = 0, \quad 3.375 < f_c < 76.625\\ &m = 1, \quad 83.375 < f_c < 156.625\\ &m = 2, \quad 163.375 < f_c < 236.625\\ &\cdots \end{aligned}

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

RS2fcmfs1+αRS(m+1)fs2fc1+α\begin{aligned} &R_S \leq \dfrac{2f_c - mf_s}{1+\alpha}\\ &R_S \leq \dfrac{(m+1)f_s - 2f_c}{1+\alpha}\\ \end{aligned}

fs=160,α=0.35,fc=20f_s = 160, \alpha =0.35, f_c = 20 时,可以得到内插系数的范围是

{2fcmfs>0(m+1)fs2fc>0m=0\left\{ \begin{aligned} &2f_c - m f_s > 0\\ &(m+1)f_s - 2f_c > 0\\ \end{aligned} \right. \Rightarrow m = 0

RS401.35UsmpRate5.4R_S \leq \dfrac{40}{1.35}\Rightarrow UsmpRate\geq 5.4

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

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

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

几乎无影响。

FPGA 仿真(调制)·

设定参数:系统时钟频率为 160MHz160MHz,传输速率 Rb=5MHzR_b=5MHz,发送比特数为 10241024 位。

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];

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

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

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

仿真波形如下图

附录·

噪声建模·

  • SNR 与 Eb/n0 的关系

下文用到的符号表示:

  • EbE_b:比特能量,单位 JJ
  • n0n_0:噪声的功率谱密度,单位 W/HzW/Hz
  • Eb/n0E_b/n_0:无量纲
  • SS:信号功率,单位 WW
  • NN:噪声功率,单位 WW
  • BB 带宽
  • SNRSNR:信噪比,无量纲
  • RbR_b:比特速率,单位 bpsbpsTbT_b:传输每比特所需的时间
  • RSR_S:符号速率,单位 BaudBaud
  • RCR_C:码片速率,单位 chip/schip/s
  • MM:调制星座点个数
  • SSRSSR:扩频比
  • α\alpha:根升余弦成型滤波器的滚降因子
  • usmp_rateusmp\_rate:内插系数

SNR(Signal Noise Radio)表示信噪比,Eb/n0E_b/n_0 表示传输 1bit1bit 信息所需要的能量与噪声功率谱密度的比值。对于数字信号来说,用时间长度为 TsT_s 的波形表示码元,每个码元的平均功率为 00,因此不能用功率描述数字信号,因此采用码元能量来描述数字信号波形。

SNR=SN=EbRbn0B=EsRsn0B=EcRcn0BSNR = \dfrac{S}{N} = \dfrac{E_bR_b}{n_0 B} = \dfrac{E_sR_s}{n_0 B} = \dfrac{E_cR_c}{n_0 B}

其中带宽 B=fsmp/2B = f_{smp} / 2,比特能量与符号能量满足关系 Es=Eblog2ME_s=E_b \log_2 M,则

SNR=EsRsn0B=(Eblog2M)(Rc/SSR)n0fsmp2=Ebn0log2M2Rcfsmp1SSRSNR = \dfrac{E_sR_s}{n_0 B} = \dfrac{(E_b\log_2{M})(R_c/SSR)}{n_0 \tfrac{f_{smp}}{2}} = \dfrac{E_b}{n_0} \cdot\log_2M \cdot \dfrac{2R_c}{f_{smp}} \cdot \dfrac{1}{SSR}

最终得到,

[SNR]dB=[Eb/n0]dB+[log2M]dB[usmp_rate2]dB[SSR]dBusmp_rate=fsmp/Rc\begin{aligned} [SNR] _{dB} &= [E_b/n_0]_{dB} + [\log_2{M}] _{dB} - [\dfrac{usmp\_rate}{2}]_{dB} - [SSR]_{dB}\\ usmp\_rate &= f_{smp} / R_c \end{aligned}

注:

  • 在常规通信系统中,usmp_rateusmp\_rate 是仿真中的采样速率与 符号速率 之比;
  • 在扩频通信系统中,usmp_rateusmp\_rate 是仿真中的采样速率与 码片速率 之比;

BPSK 的 MATLAB 仿真·

  • MATLAB 仿真代码(CPU 版)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
close all; clear; clc;

tic;

% FIXME System Parameters
fs = 122.88e6;
Rs = 3.072e6;
Rb = Rs; Ts = 1 / Rs;
fc = 2e9;

usmp_rate = floor(fs / Rs);

num = 5000;
b = 1 - 2 * randi([0 1], 1, num);

%% Send
beta = 0.1; span = 12;
sps = usmp_rate;
h = rcosdesign(beta, span, sps, "sqrt");

baseband_tx = conv(upsample(b, usmp_rate), h, "same");

toc;

t = (1 : length(baseband_tx)) / fs;
carrier = cos(2 * pi * fc * t);
tx_wave = baseband_tx .* carrier;

toc;

%% Channel
Ebn0_dB = 10;
SNR_dB = Ebn0_dB - 10 * log10(usmp_rate / 2);
rx_wave = awgn(tx_wave, SNR_dB, 'measured');

toc;

%% Recv
% Coherent Demodulation
local_carrier = 2 * carrier;
demod_wave = rx_wave .* local_carrier;

% Matched Filtering
baseband_rx = conv(demod_wave, h, "same");

% Sampling and Decision
samples = baseband_rx(1 : sps : end);
bits_recovered = double(samples < 0);

toc;

original_bits = (b < 0);
err = sum(original_bits(1:num) ~= bits_recovered(1:num));
fprintf('Bit error rate: %d\n', err / num);

%% Figure
N = 65536;
t = (1 : length(baseband_tx)) / fs;
% Send
figure;
subplot(2, 1, 1);
plot(t, baseband_tx);
xlabel("Time (s)"); ylabel("Amplitude");
title("BPSK Baseband Signal");
grid on;

subplot(2, 1, 2);
f = (-fs/2 : fs/N : fs/2-fs/N);
plot(f, 10 * log10(abs(fftshift(fft(baseband_tx, N)))));
xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
title("BPSK Baseband Spectrum");
grid on;

% Recv
figure;
subplot(2, 2, 1);
plot(t, demod_wave);
xlabel("Time (s)"); ylabel("Amplitude");
title("Coherent Demodulation Signal");
grid on;

subplot(2, 2, 2);
plot(t, baseband_rx);
xlabel("Time (s)"); ylabel("Amplitude");
title("Matched Filtering Signal");
grid on;

subplot(2, 2, 3);
f = (-fs/2 : fs/N : fs/2-fs/N);
plot(f, 10 * log10(abs(fftshift(fft(demod_wave, N)))));
xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
title("Coherent Demodulation Spectrum");
grid on;

subplot(2, 2, 4);
f = (-fs/2 : fs/N : fs/2-fs/N);
plot(f, 10 * log10(abs(fftshift(fft(baseband_rx, N)))));
xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
title("Matched Filtering Spectrum");
grid on;

figure;
subplot(2, 1, 1);
plot(original_bits(1:100));
hold on;
stem(original_bits(1:100), "r", "LineStyle", "none", "Marker", "o");
title('Original Bits (First 100)');
subplot(2, 1, 2);
plot(bits_recovered(1:100));
hold on;
stem(bits_recovered(1:100), "r", "LineStyle", "none", "Marker", "o");
title('Recovered Bits (First 100)');
  • MATLAB 仿真代码(GPU 版)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
close all; clear; clc;

if gpuDeviceCount > 0
gpuDevice(1);
fprintf('Using GPU: %s\n', gpuDevice().Name);
else
error('No GPU detected!');
end

tic;

% FIXME System Parameters
fs = 122.88e6;
Rs = 3.072e6;
Rb = Rs; Ts = 1 / Rs;
% fc = 2e9;

usmp_rate = floor(fs / Rs);

num = 10000000;
b = gpuArray(1 - 2 * randi([0 1], 1, num));

%% Send
beta = 0.1; span = 12;
sps = usmp_rate;
h = gpuArray(rcosdesign(beta, span, sps, "sqrt"));

baseband_tx = conv(upsample(b, usmp_rate), h, "same");

toc;

% t = (1 : length(baseband_tx)) / fs;
% carrier = cos(2 * pi * fc * t);
% tx_wave = baseband_tx .* carrier;
%
% toc;

%% Channel
Ebn0_dB = 10;
SNR_dB = Ebn0_dB - 10 * log10(usmp_rate / 2);
signal_power = mean(abs(baseband_tx).^2);
noise_power = signal_power / (10^(SNR_dB/10));
noise = sqrt(noise_power) * randn(size(baseband_tx), 'gpuArray');
rx_wave = baseband_tx + noise;

toc;

%% Recv
% % Coherent Demodulation
% local_carrier = 2 * carrier;
% demod_wave = rx_wave .* local_carrier;

% Matched Filtering
baseband_rx = conv(rx_wave, h, "same");

% Sampling and Decision
samples = baseband_rx(1 : sps : end);
bits_recovered = double(samples < 0);

toc;

original_bits = (b < 0);
bits_recovered = gather(bits_recovered);
baseband_tx = gather(baseband_tx);
baseband_rx = gather(baseband_rx);
err = sum(original_bits(1:num) ~= bits_recovered(1:num));
fprintf('Bit error rate: %d\n', err / num);

%% Figure
N = 65536;
t = (1 : length(baseband_tx)) / fs;
% Send
figure;
subplot(2, 1, 1);
plot(t, baseband_tx);
xlabel("Time (s)"); ylabel("Amplitude");
title("BPSK Baseband Signal");
grid on;

subplot(2, 1, 2);
f = (-fs/2 : fs/N : fs/2-fs/N);
plot(f, 10 * log10(abs(fftshift(fft(baseband_tx, N)))));
xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
title("BPSK Baseband Spectrum");
grid on;

% Recv
figure;
% subplot(2, 2, 1);
% plot(t, demod_wave);
% xlabel("Time (s)"); ylabel("Amplitude");
% title("Coherent Demodulation Signal");
% grid on;

subplot(2, 1, 1);
plot(t, baseband_rx);
xlabel("Time (s)"); ylabel("Amplitude");
title("Matched Filtering Signal");
grid on;

% subplot(2, 2, 3);
% f = (-fs/2 : fs/N : fs/2-fs/N);
% plot(f, 10 * log10(abs(fftshift(fft(demod_wave, N)))));
% xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
% title("Coherent Demodulation Spectrum");
% grid on;

subplot(2, 1, 2);
f = (-fs/2 : fs/N : fs/2-fs/N);
plot(f, 10 * log10(abs(fftshift(fft(baseband_rx, N)))));
xlabel("Frequency (Hz)"); ylabel("Amplitude (dB)");
title("Matched Filtering Spectrum");
grid on;

figure;
subplot(2, 1, 1);
plot(original_bits(1:100));
hold on;
stem(original_bits(1:100), "r", "LineStyle", "none", "Marker", "o");
title('Original Bits (First 100)');
subplot(2, 1, 2);
plot(bits_recovered(1:100));
hold on;
stem(bits_recovered(1:100), "r", "LineStyle", "none", "Marker", "o");
title('Recovered Bits (First 100)');

参考资料·