载波幅度调制,PAM\ASK

  • 前言
  • 一、调制和解调的过程
  • 二、仿真的过程
  • 1.程序1-验证解调情况
  • 2.程序2-不同信噪比下的误码率
  • 3.调制信号的功率谱密度
  • 4.相干解调具体过程
  • 总结



前言

本节介绍了载波幅度调制,也就是PAM或ASK的调制和解调过程,以及讲述了仿真的具体步骤


一、调制和解调的过程

python载波信号 载波pam信号仿真_matlab


上图是调制和相干解调的过程,右侧的符号也是程序中所用的符号。除此之外,程序用来格雷码的编码规则,这里可以将其删去,也可以换成其他编码规则。

二、仿真的过程

1.程序1-验证解调情况

代码如下(可以改变信噪比ESNO的值,来人为观察误码率):

%% PAM//ASK
clear all;close all;clc;
n_symbol=1e2;                       %%符号个数
T=1;                                %%表达式中的参数
fs=100;
ts=1/fs;
t=0:ts:T-ts;
fc=10;
c=sqrt(2/T)*cos(2*pi*fc*t);         %%载波信号
M=4;
% graycode=[0 2 3 1];               %%可以使用格雷码,后面也需要用格雷码解出
graycode=[0 1 3 2];
ESNO=8   ;                          %%单位dBD   
snr=10.^(ESNO/10);                  %%转换成单位线性值
msg=randi(M,1,n_symbol);
msg1=graycode(msg);                 %%按照之前定义的graycode规则重新定义各数
msgmod=pammod(msg1,M).';
x=msgmod*c;
x1=reshape(x.',1,length(msgmod)*length(c));
s_pow=norm(x1).^2/(n_symbol);     %%这里是符号的平均功率,而不是每一个采样点
sigma=sqrt(s_pow/(2*snr));         %%根据线性值的信噪比和信号功率求出噪声功率
tx_nn=x1+sigma*randn(1,length(x1));              %%加性噪声后的信号
tx_n1=reshape(tx_nn,length(c),length(msgmod));     %%将合成信号分解一下以便后面的相干计算
y=(c*tx_n1).*T/length(c);                          %%相干计算
y1=pamdemod(y,M);                                  %%解调 
decmsg=graycode(y1+1)+1;                           %%格雷码还原

%想要将原符号来做比较验证误码率,可以为了将数字信号展开做比较
for i=1:n_symbol                    
    msg_x((100*i-99):100*i)=msg(i);
    decmsg_x((100*i-99):100*i)=decmsg(i);  
    msg1_x((100*i-99):100*i)=msg1(i);
    y1_x((100*i-99):100*i)=y1(i);  
end
figure;
subplot(411);
plot(msg_x);title('原信号');
subplot(412);
plot(x1);title('原信号+载波');
subplot(413);
plot(tx_nn);title('原信号+载波+噪声');
subplot(414);
plot(decmsg_x);title('解调信号');
figure;
subplot(211);
plot(msg1_x);title('格雷码原信号');
subplot(212);
plot(y1_x);title('格雷码解调信号');

下面第一张图片是原信号、原信号+载波(调制信号)、原信号+载波+噪声(调制信号经过信道)、解调信号

python载波信号 载波pam信号仿真_matlab_02


第二张图片表达的是:若有格雷码的出现,相对于也给出了原信号和解调信号的对比,其实与无格雷码的误码情况应该是一模一样,只是不同码元规则的对应关系。

python载波信号 载波pam信号仿真_算法_03

2.程序2-不同信噪比下的误码率

判断不同信噪比的误码率,是建立在上端程序的基础上,创建16组不同信噪比的对比组,最终得出不同信噪比情况下的误码情况。

其中理论误比特率公式为:

python载波信号 载波pam信号仿真_数字信号处理_04


其中Q函数表达式如下所示,其在matlab用qfunc表示。

python载波信号 载波pam信号仿真_matlab_05


因为有的教材是用erfc来表达理论误码率的,根据上式也可以看出Q函数与erfc的关系如下:

python载波信号 载波pam信号仿真_python载波信号_06

%% PAM//ASK
clear all;close all;clc;
n_symbol=1e5;                       %%符号个数
T=1;                                %%表达式中的参数
fs=100;
ts=1/fs;
t=0:ts:T-ts;
fc=10;
c=sqrt(2/T)*cos(2*pi*fc*t);         %%载波信号
M=4;
% graycode=[0 2 3 1];               %%可以使用格雷码,后面也需要用格雷码解出
graycode=[0 1 3 2];
ESNO=0:15;                          %%单位dBD   创建16组不同信噪比的情况做自变量
snr=10.^(ESNO/10);                  %%转换成单位线性值
msg=randi(M,1,n_symbol);
msg1=graycode(msg);                 %%按照之前定义的graycode规则重新定义各数
msgmod=pammod(msg1,M).';
x=msgmod*c;
x1=reshape(x.',1,length(msgmod)*length(c));
% s_pow=norm(tx1).^2/(nsymbol*length(c));
s_pow=norm(x1).^2/(n_symbol);
for i=1:length(ESNO)
%     tx_n=awgn(tx1,i,'measured');
    sigma=sqrt(s_pow/(2*snr(i)));
    x_n=x1+sigma*randn(1,length(x1));
    x_n1=reshape(x_n,length(c),length(msgmod));
    y=(c*x_n1).*T/length(c);
    y1=pamdemod(y,M);
    decmsg=graycode(y1+1)+1;
    [err,ber(i)]=biterr(msg1,y1,log2(M));    
    [err,ser(i)]=symerr(msg1,y1);
end

ser_real=(2*(M-1)/M)*qfunc(sqrt((6/(M^2-1))*snr));
semilogy(ESNO,ser,'b',ESNO,ber,'k',ESNO,ser_real,'r'); 
xlabel('信噪比(dB)');legend('误比特率','误符号率','理论的误比特率');

下图则表示,不同信噪比下的误比特率、误符号率以及理论误比特率的情况。

python载波信号 载波pam信号仿真_matlab_07

3.调制信号的功率谱密度

根据求功率谱密度估计的方法(此链接几乎涵盖了大部分普遍使用的经典功率谱密度)。(需要使N小于x_n)

N=1024;Nfft=1024;
window=hamming(N); noverlap=N/2;
[Pxx,f]=pwelch(x_n,window,noverlap,Nfft);
figure;
plot(f/pi,Pxx);grid on;title('ASK功率谱密度');

python载波信号 载波pam信号仿真_数字通信_08

4.相干解调具体过程

在程序中,解调就写了一句简单的相干计算

y=(c*tx_n1).*T/length(c);                       %%相干计算

其实我是这样想的:

python载波信号 载波pam信号仿真_python载波信号_09


总结

本节介绍了数字信号载波传输中的载波幅度调制,也就是将所要传输的信息放在载波的幅度中传输。下一节仿真载波相位调制,也就是将信息放在载波的相位中进行传输。