%-----------------------------pi/4-QDPSK----------------------------------
clear all;
close all;
clc;
%--------------------------------------------------------------------------
%参数设置
Fc = 5e6;
data_len=10000;
%--------------------------------------------------------------------------
%随机产生传输信号
rand_data_len =randn(1,data_len);
for i=1:data_len
if rand_data_len(i)>=0.5
input(i)=1;
else
input(i)=0;
end
end
%--------------------------------------------------------------------------
%串并转换
for i=1:data_len
if rem(i,2)==1
if input(i)==1
I(i)=-1;
I(i+1)=-1;
else
I(i)=1;
I(i+1)=1;
end
else
if input(i)==1
Q(i-1)=-1;
Q(i)=-1;
else
Q(i-1)=1;
Q(i)=1;
end
end
end
%--------------------------------------------------------------------------
% 码变换
I_diff=zeros(1,data_len);
Q_diff=zeros(1,data_len);
I_diff(1)=I(1);
Q_diff(1)=Q(1);
for i=2:data_len
if I(i)==1&&Q(i)==1 % 0->+1 1->-1
if I_diff(i-1)==1&&Q_diff(i-1)==1
I_diff(i)=1;
Q_diff(i)=1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==1
I_diff(i)=-1;
Q_diff(i)=1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==-1
I_diff(i)=-1;
Q_diff(i)=-1;
else
I_diff(i)=1;
Q_diff(i)=-1;
end
elseif I(i)==-1&&Q(i)==1
if I_diff(i-1)==1&&Q_diff(i-1)==1
I_diff(i)=-1;
Q_diff(i)=1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==1
I_diff(i)=-1;
Q_diff(i)=-1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==-1
I_diff(i)=1;
Q_diff(i)=-1;
else
I_diff(i)=1;
Q_diff(i)=1;
end
elseif I(i)==-1&&Q(i)==-1
if I_diff(i-1)==1&&Q_diff(i-1)==1
I_diff(i)=-1;
Q_diff(i)=-1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==1
I_diff(i)=1;
Q_diff(i)=-1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==-1
I_diff(i)=1;
Q_diff(i)=1;
else
I_diff(i)=-1;
Q_diff(i)=1;
end
else
if I_diff(i-1)==1&&Q_diff(i-1)==1
I_diff(i)=1;
Q_diff(i)=-1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==1
I_diff(i)=1;
Q_diff(i)=1;
elseif I_diff(i-1)==-1&&Q_diff(i-1)==-1
I_diff(i)=-1;
Q_diff(i)=1;
else
I_diff(i)=-1;
Q_diff(i)=-1;
end
end
end
%--------------------------------------------------------------------------
%零内插
zero=5; % 采样率为25MHz
for i=1:zero*data_len
if rem(i,zero)==1
Izero(i)=I_diff(fix((i-1)/zero)+1);
Qzero(i)=Q_diff(fix((i-1)/zero)+1);
else
Izero(i)=0;
Qzero(i)=0;
end
end
%--------------------------------------------------------------------------
%脉冲成形滤波器
NT =50;
N=2*zero*NT;
Fs=25e6;
rf=0.1;
psf=rcosfir(rf,NT,zero,Fs,'sqrt');
Ipulse= conv(Izero,psf);
Qpulse= conv(Qzero,psf);
%--------------------------------------------------------------------------
%调制
for i=1:zero*data_len+N
t(i)=(i-1)/(Fc*zero);
Imod(i)=Ipulse(i).*sqrt(2)*cos(2*pi*Fc*t(i));
Qmod(i)=Qpulse(i).*(-sqrt(2)*sin(2*pi*Fc*t(i)));
end
sum=Imod+Qmod;
%--------------------------------------------------------------------------
%加噪声
for SNR=0:10
sum1 = awgn(sum,SNR);
%--------------------------------------------------------------------------
%解调
%--------------------------------------------------------------------------
%相乘器
for i=1:zero*data_len+N
Idem(i)=sum1(i).*sqrt(2)*cos(2*pi*Fc*t(i));
Qdem(i)=sum1(i).*(-sqrt(2)*sin(2*pi*Fc*t(i)));
end
%--------------------------------------------------------------------------
%匹配滤波器
mtf= rcosfir(rf,NT, zero,Fs,'sqrt');
Imat = conv(Idem,mtf);
Qmat = conv(Qdem,mtf);
%--------------------------------------------------------------------------
%抽取
for i=1:zero*data_len
Isel(i)=Imat(i+N);
Qsel(i)=Qmat(i+N);
end
%--------------------------------------------------------------------------
%采样
for i = 1:data_len
Isam(i)= Isel((i-1)*zero+1);
Qsam(i)= Qsel((i-1)*zero+1);
end
%--------------------------------------------------------------------------
%判决
threshold = 0.2;
for i = 1:data_len
if Isam(i)>= threshold
I_final(i)= 0;
else
I_final(i)= 1;
end
if Qsam(i) >= threshold
Q_final(i) = 0;
else
Q_final(i)= 1;
end
end
%--------------------------------------------------------------------------
% 码反变换
I_abs=zeros(1,data_len);
Q_abs=zeros(1,data_len);
I_abs(1)=I_final(1);
Q_abs(1)=Q_final(1);
for i=2:data_len
if I_final(i-1)==0&&Q_final(i-1)==0 %前一输入双比特为00
if I_final(i)==0&&Q_final(i)==0 %本时刻输入00
I_abs(i)=0;
Q_abs(i)=0; %输出数据00
elseif I_final(i)==0&&Q_final(i)==1 %本时刻输入01
I_abs(i)=0;
Q_abs(i)=1; %输出数据01
elseif I_final(i)==1&&Q_final(i)==1 %本时刻输入11
I_abs(i)=1;
Q_abs(i)=1; %输出数据11
else %本时刻输入10
I_abs(i)=1;
Q_abs(i)=0; %输出数据10
end
elseif I_final(i-1)==0&&Q_final(i-1)==1 %前一输入双比特为01
if I_final(i)==0&&Q_final(i)==0 %本时刻输入00
I_abs(i)=1;
Q_abs(i)=0; %输出数据10
elseif I_final(i)==0&&Q_final(i)==1 %本时刻输入01
I_abs(i)=0;
Q_abs(i)=0; %输出数据00
elseif I_final(i)==1&&Q_final(i)==1 %本时刻输入11
I_abs(i)=0;
Q_abs(i)=1; %输出数据01
else %本时刻输入10
I_abs(i)=1;
Q_abs(i)=1; %输出数据11
end
elseif I_final(i-1)==1&&Q_final(i-1)==1 %前一输入双比特为11
if I_final(i)==0&&Q_final(i)==0 %本时刻输入00
I_abs(i)=1;
Q_abs(i)=1; %输出数据11
elseif I_final(i)==0&&Q_final(i)==1 %本时刻输入01
I_abs(i)=1;
Q_abs(i)=0; %输出数据10
elseif I_final(i)==1&&Q_final(i)==1 %本时刻输入11
I_abs(i)=0;
Q_abs(i)=0; %输出数据00
else %本时刻输入10
I_abs(i)=0;
Q_abs(i)=1; %输出数据01
end
else %前一输入双比特为10
if I_final(i)==0&&Q_final(i)==0 %本时刻输入00
I_abs(i)=0;
Q_abs(i)=1; %输出数据01
elseif I_final(i)==0&&Q_final(i)==1 %本时刻输入01
I_abs(i)=1;
Q_abs(i)=1; %输出数据11
elseif I_final(i)==1&&Q_final(i)==1 %本时刻输入11
I_abs(i)=1;
Q_abs(i)=0; %输出数据10
else %本时刻输入10
I_abs(i)=0;
Q_abs(i)=0; %输出数据00
end
end
end
%--------------------------------------------------------------------------
%并串转换
for i = 1:data_len
if rem(i, 2)== 1
if I_abs(i)== 1
final(i)=1;
else
final(i)=0;
end
else
if Q_abs(i) == 1
final(i)=1;
else
final(i)=0;
end
end
end
%--------------------------------------------------------------------------
%计算误码率
[num,ber(SNR+1)] = symerr(final,input);
end
semi
pi/4 QDPSK 仿真
5星 · 超过95%的资源 需积分: 9 158 浏览量
2011-01-13
22:43:31
上传
评论 5
收藏 305KB RAR 举报
wujingzhihuixueyuan
- 粉丝: 2
- 资源: 7
最新资源
- tensorflow-gpu-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.8.0-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.4-cp39-cp39-manylinux2010-x86-64.whl
- 个人资料-1111相关内容
- # C 语言介绍与使用技巧 ## C 语言简介:
- 3、高质量汽车租赁系统+layui)
- 介绍 Python 的一些基本信息,并分享一些使用技巧
- Qt的tcp网络编程(客户端和服务器)
- 当谈到 Linux 常用命令时,有很多命令可以提及 以下是一些常见的 Linux 命令及其功能:
- Sora AI Video Preview Case Sora AI 视频模版项目,React全栈快速部署.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈