clc;
close;
clear;
ps=1*10^6; %码速率为1MHz
a=0.8; %成形滤波器系数
Fs=8*10^6; %采样速率
fc=2*10^6; %载波频率
N=10000; %仿真数据的长度
t=0:1/Fs:(N*Fs/ps-1)/Fs;%产生长度为N,频率为fs的时间序列
rng ('default');%每次都产生相同的随机数
%s = randi([0 1],16,1); % 产生0和1之间的整数,输出一个n*1的向量
s=randi(1,16); %产生随机16进制数据作为原始数据
Bs=dec2bin(s,4); %将十进制数据转换成4比特的二进制数据
%对Bs的高2比特进行差分编码
%取高2比特分别存放在A,B变量中
A=s>7;
B=(s-A*8)>3;
%差分编码后的数据存放在C,D中
C=zeros(N,1);D=zeros(N,1);
for i=2:N
C(i)=mod(((~mod(A(i)+B(i),2))&mod(A(i)+C(i-1),2)) + (mod(A(i)+B(i),2)&mod(A(i)+D(i-1),2)),2);
D(i)=mod(((~mod(A(i)+B(i),2))&mod(B(i)+D(i-1),2)) + (mod(A(i)+B(i),2)&mod(B(i)+C(i-1),2)),2);
end
%差分编码后的高2比特数据与原数据低2比特合成映射前的数据DBs
DBs=C*8+D*4+s-A*8-B*4;
%完成调制前的正交同相支路数据映射
I=zeros(1,N);Q=zeros(1,N);
for i=1:N
switch DBs(i)
case 0, I(i)=3; Q(i)=3;
case 1, I(i)=1; Q(i)=3;
case 2, I(i)=3; Q(i)=1;
case 3, I(i)=1; Q(i)=1;
case 4, I(i)=-3;Q(i)=3;
case 5, I(i)=-3;Q(i)=1;
case 6, I(i)=-1;Q(i)=3;
case 7, I(i)=-1;Q(i)=1;
case 8, I(i)=3; Q(i)=-3;
case 9, I(i)=3; Q(i)=-1;
case 10,I(i)=1; Q(i)=-3;
case 11,I(i)=1; Q(i)=-1;
case 12,I(i)=-3;Q(i)=-3;
case 13,I(i)=-1;Q(i)=-3;
case 14,I(i)=-3;Q(i)=-1;
otherwise,I(i)=-1;Q(i)=-1;
end
end
%对编码数据以Fs频率采样
Ads_i=upsample(I,Fs/ps);
Ads_q=upsample(Q,Fs/ps);
%加噪声
% SNR=30;
% Ads_i=awgn(Ads_i,SNR);
% Ads_q=awgn(Ads_q,SNR);
%设计平方根升余弦滤波器
n_T=[-2 2];
rate=Fs/ps;
T=1;
Shape_b = rcosdesign(a,n_T,rate,T,'sqrt');
%对采样后的数据进行升余弦滤波;
rcos_Ads_i=filter(Shape_b,1,Ads_i);
rcos_Ads_q=filter(Shape_b,1,Ads_q);
%产生同相正交两路载频信号
f0_i=cos(2*pi*fc*t);
f0_q=sin(2*pi*fc*t);
%产生16QAM已调信号
qam16=rcos_Ads_i.*f0_i+rcos_Ads_q.*f0_q;
%实现相干解调
demod_mult_i=qam16.*f0_i;
demod_mult_q=qam16.*f0_q;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制相干解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');
%仿真频率差500Hz时解调后星座图
f0_di=cos(2*pi*(fc+500)*t);
f0_dq=sin(2*pi*(fc+500)*t);
%实现解调
demod_mult_i=qam16.*f0_di;
demod_mult_q=qam16.*f0_dq;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');
%仿真相位差 pi/6时解调后星座图
f0_di=cos(2*pi*fc*t+pi/6);
f0_dq=sin(2*pi*fc*t+pi/6);
%实现解调
demod_mult_i=qam16.*f0_di;
demod_mult_q=qam16.*f0_dq;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');
%绘制16QAM信号频谱、信号时域波形
m_qam16=20*log10(abs(fft(qam16,1024)));m_qam16=m_qam16-max(m_qam16);
%设置幅频响应的横坐标单位为MHz
x_f=[0:(Fs/length(m_qam16)):Fs/2];x_f=x_f/10^6;
%只显示正频率部分的幅频响应
mqam16=m_qam16(1:length(x_f));
%设置时域波表的横坐标单位为us
Len=100;%设置时域波形显示的点数
x_t=1:Len;%产生长度为Len的时间序列
x_t=x_t/Fs*10^6;
%显示所需的频谱及时域波形
subplot(211); plot(x_f,mqam16);
legend('16QAM信号频谱');
xlabel('频率(MHz)');ylabel('幅度(dB)');grid on;
subplot(212);plot(x_t,qam16(101:Len+100));
legend('16QAM时域信号波形');
xlabel('时间(us)');ylabel('幅度(V)');grid on;
索引超出数组元素的数目(8)。
求指点