本节介绍了载波幅度调制,也就是PAM或ASK的调制和解调过程,以及讲述了仿真的具体步骤。
上图是调制和相干解调的过程,右侧的符号也是程序中所用的符号。除此之外,程序用来格雷码的编码规则,这里可以将其删去,也可以换成其他编码规则。
代码如下(可以改变信噪比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('格雷码解调信号');
下面第一张图片是原信号、原信号+载波(调制信号)、原信号+载波+噪声(调制信号经过信道)、解调信号。
第二张图片表达的是:若有格雷码的出现,相对于也给出了原信号和解调信号的对比,其实与无格雷码的误码情况应该是一模一样,只是不同码元规则的对应关系。
判断不同信噪比的误码率,是建立在上端程序的基础上,创建16组不同信噪比的对比组,最终得出不同信噪比情况下的误码情况。
其中理论误比特率公式为:
其中Q函数表达式如下所示,其在matlab用qfunc表示。
因为有的教材是用erfc来表达理论误码率的,根据上式也可以看出Q函数与erfc的关系如下:
%% 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('误比特率','误符号率','理论的误比特率');
下图则表示,不同信噪比下的误比特率、误符号率以及理论误比特率的情况。
根据求功率谱密度估计的方法(此链接几乎涵盖了大部分普遍使用的经典功率谱密度)。(需要使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功率谱密度');
在程序中,解调就写了一句简单的相干计算
y=(c*tx_n1).*T/length(c); %%相干计算
本节介绍了数字信号载波传输中的载波幅度调制,也就是将所要传输的信息放在载波的幅度中传输。下一节仿真载波相位调制,也就是将信息放在载波的相位中进行传输。