⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bpsk.m

📁 本程序实现产生几种调制方式的眼图并且对其进行比较
💻 M
字号:
clf;
clear;
clc;
%—— 产生随机‘0’,‘1’信号序列
N=2000;
N1=20;
fc=3;
data_bit=randint(1,N);

%——产生r=0.5的升余弦信号,左右各三个边瓣
t=-3:0.05:3;
h=sin(pi*t)./(pi*t).*cos(pi/2*t)./(1-t.^2);
%——由于计算机没有0/0的定义,所以要另外附加此点的定义
h((length(t)-1)/2+1)=1;
h(41)=0;
h(81)=0;
figure(1);
stem(t,h,'.');
title('r=0.5的升余弦滤波器函数序列');
grid on;
%——输出前有60个点(滤波器阶数的一半)的滤波器输出延迟
delay=floor(length(h)/2);



%——BPSK调制——————————————BPSK调制———————————

for i=1:N                      %——将信号序列转换为基上的向量值
    if data_bit(1,i)==1
       data_p(1,i)=sqrt(7)/4;
    else data_p(1,i)=-sqrt(7)/4;
    end
end
figure(2);
t1=0:9;
stem(t1,data_p(1:10),'.');      %——绘出10个点的转换信号序列图
title('原始BPSK信号');
xlabel('t/s');
ylabel('信号幅度');
grid on;

%——20倍过采样,过采样点数应为上面的sinc函数从0到第一个零点间的样点数,
%——才能保证符号间无串扰
%——在所产生星座信号序列每点间插入(N1-1)个值
sig=zeros(1,N1*length(data_p));
for i=1:length(data_p)
    sig(i*N1-(N1-1))=data_p(i);
end

sig_conv=conv(sig,h);         %——信号序列与冲击函数卷积
figure(3);
t=0:1/N1:(length(sig_conv)-1)/N1;
plot(t(1:280),sig_conv(1:280),':.');
hold on;
i=61:20:261;
stem(t(i),sig_conv(i),'.r');
grid on;
title('升余弦函数成形');
xlabel('t /s');
ylabel('信号幅度');


%——去掉滤波器输出延时
out_sig(1:length(sig_conv)-2*delay)=sig_conv(delay+1:length(sig_conv)-delay);
figure(4);
t=0:1/N1:(length(out_sig)-1)/N1;
plot(t(1:200),out_sig(1:200),':.');
hold on;
i=1:N1:10*N1+1;
stem(t(i),out_sig(i),'.r');
grid on;
title('去掉滤波器输出延迟之后的波形');
xlabel('t /s');
ylabel('信号幅度');


%——调制原始信号序列
t=0:1/N1:(length(out_sig)-1)/N1;
fcos=cos(2*pi*fc*t);
sym0_fc=fcos.*out_sig;
figure(5);
plot(t(1:200),sym0_fc(1:200));
grid on;
title('升余弦成形带通BPSK信号');
xlabel('t /s');
ylabel('信号幅度');


%——QPSK调制————————————QPSK调制————————————

for i=1:2:N-1                  %——将信号序列转换为基上的向量值
    if data_bit(i)==1 & data_bit(i+1)==1
        sym_i((i+1)/2)=-1/2;
        sym_q((i+1)/2)=-1/2;
    elseif data_bit(i)==1 & data_bit(i+1)==0
        sym_i((i+1)/2)=1/2;
        sym_q((i+1)/2)=-1/2;
     elseif data_bit(i)==0 & data_bit(i+1)==1
        sym_i((i+1)/2)=-1/2;
        sym_q((i+1)/2)=1/2;
    elseif data_bit(i)==0 & data_bit(i+1)==0
        sym_i((i+1)/2)=1/2;
        sym_q((i+1)/2)=1/2;;
    end
end

%——画出原始的I路与Q路信号
figure(6);
t=0:9;
subplot(2,1,1);
stem(t,sym_i(1:10),'.');
title('I路原始信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;
subplot(2,1,2);
stem(t,sym_q(1:10),'.');
title('Q路原始信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;

%——20倍过采样,过采样点数应为上面的sinc函数从0到第一个零点间的样点数,
%——才能保证符号间无串扰
%——在所产生星座信号序列每点间插入(N1-1)个值
sym2_i=zeros(1,N1*length(sym_i));
sym2_q=zeros(1,N1*length(sym_q));
for i=1:length(sym_i)
    sym2_i(i*N1-(N1-1))=sym_i(i);
    sym2_q(i*N1-(N1-1))=sym_q(i);
end

symi=conv(sym2_i,h);              %——I路信号序列与冲击函数卷积
symq=conv(sym2_q,h);              %——Q路信号序列与冲击函数卷积

figure(7);
subplot(2,1,1);
t23=0:1/N1:(length(symi)-1)/N1;
plot(t23(1:280),symi(1:280),'.');
hold on;
i=61:20:261;
stem(t23(i),symi(i),'.r');
title('I路升余弦函数成形');
xlabel('t /s');
ylabel('信号幅度');
grid on;

subplot(2,1,2);
t23=0:1/N1:(length(symq)-1)/N1;
plot(t23(1:280),symq(1:280),'.');
hold on;
i=61:20:261;
stem(t23(i),symq(i),'.r');
title('Q路升余弦函数成形');
xlabel('t /s');
ylabel('信号幅度');
grid on;



%——去掉滤波器输出延时
out_symi(1:length(symi)-2*delay)=symi(delay+1:length(symi)-delay);
out_symq(1:length(symq)-2*delay)=symq(delay+1:length(symq)-delay);
figure(8);
subplot(2,1,1);
t22=0:1/N1:(length(out_symi)-1)/N1;
plot(t22(1:200),out_symi(1:200),'.');
hold on;
i=1:N1:10*N1+1;
stem(t22(i),out_symi(i),'.r');
title('去掉滤波器输出延迟之后的I路波形');
xlabel('t /s');
ylabel('信号幅度');
hold on;
grid on;

subplot(2,1,2);
t22=0:1/N1:(length(out_symq)-1)/N1;
plot(t22(1:200),out_symq(1:200),'.');
hold on;
i=1:N1:10*N1+1;
stem(t22(i),out_symq(i),'.r');
title('去掉滤波器输出延迟之后的Q路波形');
xlabel('t /s');
ylabel('信号幅度');
grid on;

%——调制原始信号序列
figure(9);
t2=0:1/N1:(length(out_symi)-1)/N1;;
fcos=cos(2*pi*fc*t2);
fsin=sin(2*pi*fc*t2);
symi_fc=fcos.*out_symi;
symq_fc=fsin.*out_symq;
subplot(3,1,1);
plot(t2(1:200),symi_fc(1:200));
title('I路载波信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;


subplot(3,1,2);
plot(t2(1:200),symq_fc(1:200));
title('Q路载波信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;

subplot(3,1,3);
plot(t2(1:200),symi_fc(1:200)+symq_fc(1:200));
title('I路Q路相加后的波形');
xlabel('t /s');
ylabel('信号幅度');
grid on;


%——16QAM调制——————————16QAM调制——————————————

for i=1:4:N-3                 %——将信号序列转换为基上的向量值
    if data_bit(i)==0 & data_bit(i+1)==0 & data_bit(i+2)==0 & data_bit(i+3)==0
        sym_ii((i+3)/4)=3*sqrt(7)/4;
        sym_qq((i+3)/4)=3*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==0 & data_bit(i+2)==0 & data_bit(i+3)==1
           sym_ii((i+3)/4)=3*sqrt(7)/4;
           sym_qq((i+3)/4)=1*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==1 & data_bit(i+2)==0 & data_bit(i+3)==1
           sym_ii((i+3)/4)=3*sqrt(7)/4;
           sym_qq((i+3)/4)=-1*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==1 & data_bit(i+2)==0 & data_bit(i+3)==0
           sym_ii((i+3)/4)=3*sqrt(7)/4;
           sym_qq((i+3)/4)=-3*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==0 & data_bit(i+2)==1 & data_bit(i+3)==0
           sym_ii((i+3)/4)=1*sqrt(7)/4;
           sym_qq((i+3)/4)=3*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==0 & data_bit(i+2)==1 & data_bit(i+3)==1
           sym_ii((i+3)/4)=1*sqrt(7)/4;
           sym_qq((i+3)/4)=1*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==1 & data_bit(i+2)==1 & data_bit(i+3)==1
           sym_ii((i+3)/4)=1*sqrt(7)/4;
           sym_qq((i+3)/4)=-1*sqrt(7)/4;
    elseif data_bit(i)==0 & data_bit(i+1)==1 & data_bit(i+2)==1 & data_bit(i+3)==0
           sym_ii((i+3)/4)=1*sqrt(7)/4;
           sym_qq((i+3)/4)=-3*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==0 & data_bit(i+2)==1 & data_bit(i+3)==0
           sym_ii((i+3)/4)=-1*sqrt(7)/4;
           sym_qq((i+3)/4)=3*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==0 & data_bit(i+2)==1 & data_bit(i+3)==1
           sym_ii((i+3)/4)=-1*sqrt(7)/4;
           sym_qq((i+3)/4)=1*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==1 & data_bit(i+2)==1 & data_bit(i+3)==1
           sym_ii((i+3)/4)=-1*sqrt(7)/4;
           sym_qq((i+3)/4)=-1*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==1 & data_bit(i+2)==1 & data_bit(i+3)==0
           sym_ii((i+3)/4)=-1*sqrt(7)/4;
           sym_qq((i+3)/4)=-3*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==0 & data_bit(i+2)==0 & data_bit(i+3)==0
           sym_ii((i+3)/4)=-3*sqrt(7)/4;
           sym_qq((i+3)/4)=3*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==0 & data_bit(i+2)==0 & data_bit(i+3)==1
           sym_ii((i+3)/4)=-3*sqrt(7)/4;
           sym_qq((i+3)/4)=1*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==1 & data_bit(i+2)==0 & data_bit(i+3)==1
           sym_ii((i+3)/4)=-3*sqrt(7)/4;
           sym_qq((i+3)/4)=-1*sqrt(7)/4;
    elseif data_bit(i)==1 & data_bit(i+1)==1 & data_bit(i+2)==0 & data_bit(i+3)==0
           sym_ii((i+3)/4)=-3*sqrt(7)/4;
           sym_qq((i+3)/4)=-3*sqrt(7)/4;
    end
end

%——画出原始的I路与Q路信号
figure(10);
t=0:9;
subplot(2,1,1);
stem(t,sym_ii(1:10),'.');
title('I路原始信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;
subplot(2,1,2);
stem(t,sym_qq(1:10),'.');
title('Q路原始信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;

%——20倍过采样,过采样点数应为上面的sinc函数从0到第一个零点间的样点数,
%——才能保证符号间无串扰
%——在所产生星座信号序列每点间插入(N1-1)个值
sym2_ii=zeros(1,N1*length(sym_ii));
sym2_qq=zeros(1,N1*length(sym_qq));
for i=1:length(sym_ii)
    sym2_ii(i*N1-(N1-1))=sym_ii(i);
    sym2_qq(i*N1-(N1-1))=sym_qq(i);
end

symii=conv(sym2_ii,h);          %——I路信号序列与冲击函数卷积
symqq=conv(sym2_qq,h);          %——Q路信号序列与冲击函数卷积

figure(11);
subplot(2,1,1);
t23=0:1/N1:(length(symii)-1)/N1;
plot(t23(1:280),symii(1:280),'.');
hold on;
i=61:20:261;
stem(t23(i),symii(i),'.r');
title('I路升余弦函数成形');
xlabel('t /s');
ylabel('信号幅度');
grid on;

subplot(2,1,2);
t23=0:1/N1:(length(symqq)-1)/N1;
plot(t23(1:280),symqq(1:280),'.');
hold on;
i=61:20:261;
stem(t23(i),symqq(i),'.r');
title('Q路升余弦函数成形');
xlabel('t /s');
ylabel('信号幅度');
grid on;


%——去掉滤波器输出延时
out_symii(1:length(symii)-2*delay)=symii(delay+1:length(symii)-delay);
out_symqq(1:length(symqq)-2*delay)=symqq(delay+1:length(symqq)-delay);
figure(12);
subplot(2,1,1);
t22=0:1/N1:(length(out_symii)-1)/N1;
plot(t22(1:200),out_symii(1:200),'.');
hold on;
i=1:N1:10*N1+1;
stem(t22(i),out_symii(i),'.r');
title('去掉滤波器输出延迟之后的I路波形');
xlabel('t /s');
ylabel('信号幅度');
grid on;

subplot(2,1,2);
t22=0:1/N1:(length(out_symqq)-1)/N1;
plot(t22(1:200),out_symqq(1:200),'.');
hold on;
i=1:N1:10*N1+1;
stem(t22(i),out_symqq(i),'.r');
title('去掉滤波器输出延迟之后的Q路波形');
xlabel('t /s');
ylabel('信号幅度');
grid on;

%——调制原始信号序列

figure(13);
t2=0:1/N1:(length(out_symii)-1)/N1;
ffcos=cos(2*pi*fc*t2);
ffsin=sin(2*pi*fc*t2);
symii_fc=ffcos.*out_symii;
symqq_fc=ffsin.*out_symqq;
subplot(3,1,1);
plot(t2(1:200),symii_fc(1:200));
title('I路载波信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;


subplot(3,1,2);
plot(t2(1:200),symqq_fc(1:200));
title('Q路载波信号');
xlabel('t /s');
ylabel('信号幅度');
grid on;

subplot(3,1,3);
plot(t2(1:200),symii_fc(1:200)+symqq_fc(1:200));
title('I路Q路相加后的波形');
xlabel('t /s');
ylabel('信号幅度');
grid on;











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -