加载中...

BPSK收发系统

BPSK收发系统

理论部分

数字调制信号的表示

调制方式的种类

有记忆调制

📌无记忆调制

figure1

在无记忆调制方式中,二进制序列分成每段长度为$k$的序列,再将每段序列映射成$s_m(t)$ ,而不考虑先前发送的信号如何。

figure

figure

无记忆调制方式——以BPSK为例

MPSK表达式

figure

BPSK表达式

figure

图形简述过程如下:

figure

PSK和QAM

figure

  • QAM 和 PSK 的区别

figure

从左边的星座图可以很显然看出,QAM 的幅度是不恒定的,而 PSK 的幅度是恒定的,即 PSK 只会改变信号的相位,而 QAM 不仅改变信号的相位,还改变信号的幅度。

根升余弦成型

  • 带限信道

    我们的所有通信信道都一定不是无限带宽的,对于带限信道,我们可以将其表征为等效低通频率响应 $C(f)$。根据以前通信原理相关知识,我们可以知道信号通过带限滤波器后,其非理想信道频率响应特性 $C(f)$ 会引起幅度和延时失真,在接收端特定时间采样时,不同信号间产生重叠,因此出现符号间干扰。这个时候,我们就要从想办法克服码间串扰 $ISI$。

  • 奈奎斯特准则

    figure

    • 情况1
      figure
    • 情况2
      figure
    • 情况3
      figure
    • 拓展
      figure
  • 升余弦

  • 根升余弦滤波器

AWGN 信道的最佳接收机——理论部分

  • AWGN信道
  • 最佳判决的定义

MATLAB仿真设计

系统实现

收发系统框图

figure

MATLAB代码实现

系统分模块实现

发射序列

1
2
3
4
5
data_len = 10;                            %数据长度
data = randi([0 1],1,data_len); %发射随机1,0序列
%data = round(rand(1,data_len));
%data = ones(1,data_len);
%data = zeros(1,data_len);

映射(0 -> -1)

1
s = (data-1/2)*2;
1
2
3
4
5
figure(1);
subplot(211);
stem(data,'filled');title("发送端数据");
subplot(212);
stairs(s);title('映射之后序列');

figure

成型滤波

1
2
3
4
5
6
7
alfs = 0.35;                                   % 滚降系数
osr = 8; % 上采样倍数
data_up = upsample(s,osr); %上采样
fir_rcos = rcosdesign(alfs,6,osr,"sqrt"); %根升余弦滤波器
N = length(fir_rcos); %滤波器长度
data_bx = conv(fir_rcos,data_up); %通过滤波器

  • 上采样:upsample(x,n)函数;在序列x的每个数后插入n-1个0

    上采样又称信号插值,即在原序列_x_(n)的两点之间插入L个0,等效于其在频域上做了频谱压缩。数据内插补零后,其贡献为零,因此傅里叶频谱形态只是更加细致。

  • 根升余弦函数:rcosdesign(alfs,span,sps,shape);

    • alfs为滚降系数;span为表示截断的符号范围;sps为单个符号采样的个数(数值上等于osr,即上采样倍数);shape处可加上’normal',可加上’**sqrt',不加默认'sqrt'*
1
2
3
4
5
figure(2);
subplot(211);
plot(fir_rcos);title('根升余弦时域波形');
subplot(212);
plot(data_bx);title('成形之后的波形');

figure

上变频(乘以载波)

1
2
3
4
5
fs = 16000;                                       % 采样率 
fc = 2000; % 载波频率
t = 0:length(data_bx)-1;
carrier = cos(2*pi*fc/fs*t); %载波
s_up = data_bx .* carrier;
1
2
3
4
5
figure(3);
subplot(211);
plot(carrier);title('载波时域波形');
subplot(212);
plot(s_up);title('上变频之后的波形');

figure

物理信道(添加噪声)

1
r_n = awgn(s_up,10,'measured');

awgn函数:y= awgn(x,snr,'measured')将白高斯噪声添加到向量信号x中。标量snr指定了每一个采样点信号与噪声的比率,单位为dB。如果x是复数的,awgn将会添加复数噪声。'measured'在添加噪声之前测量了x的能量。

下变频(乘以载波)

1
r_down = r_n .* carrier;
1
2
3
4
5
figure(4);
subplot(211);
plot(r_n);title('添加高斯噪声波形');
subplot(212);
plot(r_down);title('下变频之后波形');

figure

匹配滤波器接收

1
2
3
4
r_bx = conv(fir_rcos,r_down);
figure(5);
plot(r_bx);

figure

采样/判决(最佳接收)

1
2
3
r_data = (r_bx(N:osr:end-N+1)) > 0;
%recv_data = (r_bx(osr*6+1:osr:end-osr*6)) > 0;
%recv_data = (r_bx(osr*6+1:osr:osr*6+1+osr*(data_len-1))) > 0;
1
2
3
4
5
figure(6);
subplot(211);
stem(data,'filled');title('发送端数据');
subplot(212);
stem(r_data,'filled');title("接受端数据");

figure

由于发送端数据为10,长度较小,只是为了测试整个程序运行正常,因此最后采样判决输出结果应该基本完全一致,用这个思路可以初步检验代码是否正确。

代码

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
% bpsk收发系统
clc;clear all;close all;
%% 参数设置
fs = 16000; % 采样率
Rb = 1000; % bit速率
fc = 2000; % 载波频率
symbol_rate = 1000; %符号速率
alfs = 0.6; % 滚降系数
data_len = 10; %数据长度
% osr = fs/Rb; % 过采样倍数 = 采样率 / 符号速率

%% 基带信号产生(发射序列)
%data = round(rand(1,data_len));
data = randi([0 1],1,data_len);
%data = ones(1,data_len);

%% 映射(0变-1)
osr = 8;
s = (data-1/2)*2;
data_up = upsample(s,osr); %上采样

%% 成型滤波器
fir_rcos = rcosdesign(alfs,6,osr,"sqrt");
N = length(fir_rcos); %滤波器长度
data_bx = conv(fir_rcos,data_up); %通过滤波器

%% 上变频(乘以载波)
t = 0:length(data_bx)-1;
carrier = cos(2*pi*fc/fs*t); %载波
s_up = data_bx .* carrier;

%% 物理信道(添加噪声)
r_n = awgn(s_up,10,'measured');

%% 下变频(乘以载波)
r_down = r_n .* carrier;

%% 匹配滤波器
r_bx = conv(fir_rcos,r_down);
%% 采样判决(解调)
r_data = (r_bx(N:osr:end-N+1)) > 0;
% recv_data = (r_bx(osr*6+1:osr:osr*6+1+osr*(data_len-1))) > 0;
%r_data = (r_bx(97:osr:end-97)) > 0;
%r_data = (r_bx(N-1:osr:N-1+osr*(data_len-1))) > 0;

误码率分析

  • 整体代码

    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
    %仿真作业——-----——输出误码率图像
    clc;clear all;close all;
    fs = 16000; % 采样率
    % Rb = 1000; % bit速率
    fc = 2000; % 载波频率
    % symbol_rate = 1000; %符号速率
    alfs = 0.35; % 滚降系数
    data_len = 1000000; %数据长度
    % osr = fs/Rb; % 过采样倍数 = 采样率 / 符号速率
    osr = 8;
    data = randi([0 1],1,data_len); %生成0/1序列
    data_bio = (data-1/2)*2; %映射,0变-1
    data_up = upsample(data_bio,osr); %上采样

    fir_rcos = rcosdesign(alfs,6,osr,'sqrt');
    data_bx = conv(data_up,fir_rcos); %根升余弦滤波
    % figure(1);
    % plot(data_bx);title('经过成型滤波之后的图像');

    carrier = cos(2*pi*fc/fs*(0:length(data_bx)-1)); %载波
    s_up = carrier.*data_bx; %上变频(乘以载波)
    % figure(2);
    % plot(s_carrier);title('调制波形');

    errbit = zeros(1,10);
    snr = zeros(1,10);
    i=1;
    for ebn0 = 1:10
    snr(i) = ebn0 + 10*log10(2) - 10*log10(osr); %SNR和EbN0的转化

    %物理信道(加性高斯白噪声)
    r_noise = awgn(s_up,snr(i),'measured');

    %下变频(乘以载波)
    r__down = r_noise.*carrier;

    %匹配滤波器
    %根升余弦滤波
    r_bx = conv(r__down,fir_rcos);

    %判决
    recv_data = (r_bx(osr*6+1:osr:end-osr*6)) > 0;
    errbit(i) = sum(abs(recv_data-data))/data_len;
    i = i + 1;
    end
    ebn0 = 1:10;
    ber_theory = 0.5*erfc(sqrt(power(10,ebn0/10)));%理论误码率
    figure
    semilogy(ebn0,ber_theory,'-or');
    grid on;hold on;

    semilogy(ebn0,errbit,'-sb');
    grid on;hold on;
    xlabel('EbN0(dB)');ylabel('BER')
    title('BPSK误码率曲线图');
    legend('理论误码率曲线','仿真误码率曲线');

    figure

  • 仿真过程中的部分要求

    观测根升余弦成型信号的频谱和方波成型信号的频谱形状

    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
    clc;clear all;close all;
    fs = 16000; % 采样率
    % Rb = 1000; % bit速率
    fc = 2000; % 载波频率
    % symbol_rate = 1000; %符号速率
    alfs = 0.35; % 滚降系数
    data_len = 100; %数据长度
    % osr = fs/Rb; % 过采样倍数 = 采样率 / 符号速率
    osr = 8;
    data = round(rand(1,data_len));
    %data = ones(1,data_len);

    s = (data-1/2)*2;
    s_up = upsample(s,osr); %上采样

    %成型滤波器——---根升余弦
    fir_rcos = rcosdesign(alfs,6,osr,"sqrt");
    N = length(fir_rcos); %滤波器长度
    data_bx = conv(fir_rcos,s_up); %通过滤波器
    figure(1);
    subplot(211);
    plot(data_bx);title('时域波形');
    subplot(212);
    N1 = 1024;
    y = fft(data_bx,N1);
    x = (1/N1).*(0:length(y)-1);
    plot(x,abs(y));title('频域波形'); %画坐标轴理解有点不到位
    %成型滤波器-----方波
    data_rect = rectpulse(s,osr);
    figure(2);
    subplot(211);
    stairs(data_rect);title('时域波形');
    ylim([-1.5 1.5]);
    N2 = 1024;
    subplot(212);
    y1 = fft(data_rect,N2);
    x1 = (1/N2).*(0:length(y1)-1);
    plot(x1,abs(y1));title('频域波形');

    figure

    figure