【通信原理】【实验】实验三: 数字调制解调实验2ASK--2FSK--2PSK思路(GZHU)

一. 总体思路:

针对2ASK调制使用相干解调法:对整个过程进行分析
相比实验二:数字基带传输实验(GZHU) 这里只是增加了调制和解调两个部分,同时对于2ASK 这里选择的码型是单极性不归零码型;剩下的部分跟实验二是一样的;调制方法:包络法和模拟相乘法进行调制和相干解调;

在这里插入图片描述

二. 内容

采用Matlab对数字调制解调系统进行搭建并仿真,基本参数设置如下:
 1. 信源为长度N=1000的随机“0”、“1”序列,发送端符号速率RB=1000Baud;
 2. 基带数字信号根据具体调制方式采用合适的基带编码;
 3. 发送端的发送滤波器采用平方根升余弦滤波器,采样频率fs=16000Hz,滚降系数α=0.25,延迟delay=5;
 4. 信道为awgn信道,信噪比snr=-5dB、5dB;
 5. 接收端的低通滤波器采用平方根升余弦滤波器进行匹配滤波;
请实验仿真并给出以下信息:、

  1. 2ASK
    载波频率fc=4000Hz
    (1) 发送端采用平方根升余弦脉冲成型后的时域和频域波形;
    (2) 发送端进行2ASK调制后的时域和频域波形;%
    (3) 接收端进行2ASK相干解调后的时域和频域波形;
    (4) 接收端进行匹配滤波的时域和频域波形;
    (5) 发送端输入信号和接收判决器输出的信号波形对比图;
    (6) 误码率;
    (7) 分析接收端抽样判决阈值的选取对误码率的影响。
    简单实验使用单极性不归零码型;

2.1 第一个实验部分:2ASK (二进制幅度调制)

代码:跟实验二不同的是信号在输入信道前进行调制,输出信道后进行解调,剩下的都是跟实验二一样!

2.1.1 2ASK


fc = 4000;                  % 载波频率

% f_up = 2000                 % 上分支载波频率
% f_down = 4000               % 下分支载波频率

x_len = length(x_shaped);     % 发送信号长度

ln = 0:x_len - 1;

t = ln/fs;                    % 时间t 2ASK调制

cari_x = cos(2*pi*fc*t);    % 载波
m_x_c = x_shaped .* cari_x;  % 模拟相乘法进行调制
2.1.2 信道
m_x_c_n = awgn(m_x_c, snr, 'measured', 'db');     % 添加高斯白噪声
1
相干解调
x_c_n = m_x_c_n .* cari_x;                          % 与同频率相乘 .* 
1
脉冲成型
res = conv(x_c_n, h_sqrt);            % 接收端脉冲成型,滤波器还是使用平方根升余弦
1

接收端同步抽样

% 抽样同步
SynPosi = delay * oversamp * 2 + 1;                 % 两个时延*过采样率
SymPosi = SynPosi + (0:oversamp:(N-1) * oversamp);  % 采样点

res_signl = res(SymPosi);                           % 接收端采样信号

判决
for i = 1:N
    if res_signl(i) > 0.5
        res_match(i) = 1;
        
    elseif res_signl(i) <= 0.5
        res_match(i) = 0;
        
    end
end

计算误码率

for i = 1:N
    if res_match(i) ~= s_nrz(i)
        c_error = c_error 
    end
 end
2.1.3 符号解释


fc : 载波频率
cari_x : 载波
m_x_c : 调制后信号
m_x_c_n : 调制后信号在信道上添加高斯白噪声
x_c_n : 接收端解调后信号
res : 经过卷积后的接收端信号,此时已经是低频信号
res_signl : 经过抽样判决后的信号
res_match: 接收通过判决匹配信号
c_error : 错误码元个数
elv : 误码率

2.1.4 问题思考
  1. 基带信号有码间串扰,那么调制信道是否有码间串扰?

    有,只要是带限信道就会产生码间串扰

  2. 怎么避免码间串扰呢?在这里插入图片描述

组成 一起就能避免码间串扰!

  1. 码型的选择?

单极性不归零码

  1. 为什么不选择双极性?

因为如果选择双极性码型的时候,表示0或者1的正弦波的幅度的绝对值是相等;而单极性表示0或者1的时候表示1是正弦波,表示0是0;

  1. 载波的时候为什么使用 .*(点乘),而不使用(乘);

这是因为载波的是将基带信号搬移到载波频谱上,所以是将每个基带信号与载波对应元素进行相乘,而乘法是矩阵乘法,也就是mxn维度*nxm维度点乘是nxm维度*nxm维度

在这里插入图片描述
6. 接受端解调

解调方法:相干解调和包络解调(以下是相干解调)
在这里插入图片描述
就是将经过载波的信号通过相乘器(与载波信号(同频同相)进行相乘),进行简单的频谱搬移,之后通过低通滤波器将高频成分过滤,得到的就是基带信号的低频成分;

  1. 抽样判决的阈值的选择

选择0.5,因为使用的是单极性码元

3.1 第二个实验部分:2FSK (二进制频率调制)

3.1.1思路:

在这里插入图片描述

  • 2FSK = 2ASK + 2ASK

在这里插入图片描述

4.1 第三个实验部分:2PSK (二进制相位调制)

在2ASP的基础上进修改

将2ASK的码型由原来的单极性不归零码改为双极性不归零码
修改接受端的判别阈值有原来的0.5修改为0

不发生倒pi现象:

  • 这是因为使用了双极性不归零码的时候-1 会将同频同相的载波在-1 的位置与1 进行倒置,得到的是相位的变化来表示原来的-1和1;

不发生倒pi现象:

  • 将接收端载波在相位上偏移pi个单位,实现倒pi 效果

carri_x_1 = cos(2 * pi * fc * t + pi); %接收端在倒pi现象

对接收端载波进行一个pi相位的偏移部分代码:

ln = 0:length(x_shaped) - 1;
t = ln / fs;
carri_x_1 = cos(2*pi*fc*t + pi); % 接受端的载波比发送端的载波在时域上多个pi单位   发送端载波  cari_x = cos(2*pi*fc*t);
x_c_n_1 = m_x_c_n .* carri_x_1; %乘以与发送端同频不同相的载波 
figure('name', '倒pi接收端');
subplot(2,1,1),plot(x_c_n_1); axis([0 800 -1 1]);  %时域波形
title('----时域');
 
f_x_c_n_1 = fft(x_c_n_1, N); %傅里叶变换
f_x_c_n_1_abs = abs(f_x_c_n_1);                  %取绝对值
subplot(2,1,2),plot(f,f_x_c_n_1_abs);           %频域波形
title('----频域');


%时域上卷积滤波
res1 = conv(x_c_n_1, h_sqrt);                   %频域乘积,时域卷积
figure('name', '2PSK相干解调');
subplot(2,1,1),plot(res1);axis([0 800 -1 1]);   %接收端时域波形
title('----倒π时域');
 
f_res1 = fft(res1, N);                           %傅里叶变换
f_res1_abs = abs(f_res1);                        %取绝对值
subplot(2,1,2),plot(f,f_res1_abs);    
title('----倒π频域');
grid on;

%接收端同步
res_signal1 = res1(SymPosi);   %倒π现象

%接收端采样
res_match1 = zeros(length(res_signal1)); %初始化一个长度为 N 的全零数组,存放接收端抽样判决得到的码元
for i = 1:N
    if res_signal1(i) > 0
        res_match1(i) = 1;
    elseif res_signal1(i) <= 0
        res_match1(i) = -1;
    end
end

figure('name', '----2PSK匹配波形');
subplot(2,1,1),stem(D_x);axis([0 100 -1 1]);
title('----原始波形');
subplot(2,1,2),stem(res_match1);axis([0 100 -1 1]);
title('----2PSK抽样判决波形');
RecBit2 = zeros(N);
%误码率
error = 0;

%求误码率方法1
% for j = 1:N
%     if RecBit2(j) ~= D_x(j)
%         error = error + 1;
%     end
% end
% elv1 = error / N;
%sprintf('误码率:%0.5f% ',elv1);

% 方法2:
[error, radio] = symerr(RecBit2,D_x)

 

sprintf('错误码元数量:%d ',error);
sprintf('误码率:%0.5f%',radio);


5.1 第四部分 2DSK

实验完整代码:后续…

【2ASK】:https://download.csdn.net/download/zcw1234515/19547248
【2FSK】:https://download.csdn.net/download/zcw1234515/19547258
【2PSK】:https://download.csdn.net/download/zcw1234515/19547270
github[本来先把代码放github避免下载花积分,后来知道原来可以把下载积分设置为0]
参考文献:
[1] 基于MATLAB仿真的模拟乘法器AM波分析
[2]讲解傅里叶变换的知乎

posted @ 2022-05-02 19:40  jucw  阅读(1092)  评论(0编辑  收藏  举报