通信原理仿真——数字基带和频带传输

1.线路编码

信息码经过编码后可以更好地在信道中传输,数字基带信号传输系统常用码型有双极性不归零码、差分码、双相码、曼彻斯特码、CMI 码、AMI 码、HDB3 码。它们都遵循各自的编码规则。按照这些规则可以使用 MATLAB 实现输入已知信码将其编为对应的码元。本编码器由test.m 和 image_test.m 以及各类编码函数构成。其中 test 用于题目给定的四组信码进行测试,运行程序之后,在命令行窗口输入数字即可实现相应编码和解码。Image_test 用于对北洋大学堂素描图编码和解码,并将处理后的结果显示。

 1.双极性不归零码

function C=en_shuangji(B)
%编码
changdu=length(B);
C=zeros(1,changdu);
for i=1:changdu
    if B(i)==1
        C(i)=1;
    else
        C(i)=-1;
    end
end
%画图
dt=0.01;
time=changdu/dt;
figure;
subplot(2,1,1);
D=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        D(t)=B(i);
    end
end
t=1:time;
plot(t/100,D,'Linewidth', 2);
grid on;
ylim([-0.5 1.5])
title('原码')

subplot(2,1,2);
A=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        A(t)=C(i);
    end
end
t=1:time;
plot(t/100,A,'Linewidth', 2);
grid on;
ylim([-1.5 1.5]);
title('编码后的双极性不归零码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

2.差分码

function B=en_1chafen(A)
%编码,差分码默认与0比较
changdu=length(A);
B=zeros(1,changdu);
for i=1:changdu
    if i==1
        B(1)=xor(0,A(1));
    else
        if xor(A(i),B(i-1))
            B(i)=1;
        else
            B(i)=0;
        end
    end
end
%画图
figure;
dt=0.01;
time=changdu/dt;
D=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        D(t)=A(i);
    end
end
t=1:time;
subplot(2,1,1);
plot(t/100,D,'Linewidth', 2);
grid on;
ylim([-0.5 1.5]);
title('原码')

C=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        C(t)=B(i);
    end
end
t=1:time;
subplot(2,1,2);
plot(t/100,C,'Linewidth', 2);
grid on;
ylim([-0.5 1.5]);
title('编码后的1差分码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

 3.双相码

function B=en_shuangxiang(A)
%编码
changdu=length(A);
B=zeros(1,2*changdu);
for i=1:changdu
    if A(i)==1
        B(2*i-1)=1;
        B(2*i)=0;
    else
        B(2*i-1)=0;
        B(2*i)=1;
    end
end

%画图
dt=0.01;
time=changdu/dt;
D=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        D(t)=A(i);
    end
end
t=1:time;
subplot(2,1,1);
plot(t/100,D,'Linewidth', 2);
grid on;
ylim([-0.5 1.5]);
title('原码')

C=zeros(1,time);
for i=1:2*changdu
    for t=50*i-49:50*i
        C(t)=B(i);
    end
end
t=1:time;
subplot(2,1,2)
plot(t/100,C,'Linewidth', 2);
grid on;
ylim([-0.5 1.5]);
title('编码后的双相码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

4.CMI码

function B=en_cmi(A)
%编码
changdu=length(A);
B=zeros(1,2*changdu);
flag=0;
for i=1:changdu
    if A(i)==0
        B(2*i-1)=0;
        B(2*i)=1;
    else
        flag=flag+1;
        if rem(flag,2)
            B(2*i-1)=1;
            B(2*i)=1;
        else
            B(2*i-1)=0;
            B(2*i)=0;
        end
    end
end
%画图
figure;
dt=0.01;
time=changdu/dt;
C=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        C(t)=A(i);
    end
end
t=1:time;
subplot(2,1,1);
plot(t/100,C,'Linewidth', 2);
grid on;
ylim([-0.5 1.5])
title('原码')

subplot(2,1,2)
D=zeros(1,time);
for i=1:2*changdu
    for t=50*i-49:50*i
        D(t)=B(i);
    end
end
t=1:time;
plot(t/100,D,'Linewidth', 2);
ylim([-0.5 1.5])
grid on;
title('编码后得到的CMI码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

5.AMI编码

function B=en_ami(A)
%编码
changdu=length(A);
flag=0;
B=zeros(1,changdu);
for i=1:changdu
    if A(i)==0
        B(i)=0;
    else
        flag=flag+1;
        if rem(flag,2)
            B(i)=1;
        else
            B(i)=-1;
        end
    end
end

%画图
figure;
dt=0.01;
time=changdu/dt;
C=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
       C(t)=A(i);
    end
end
t=1:time;
subplot(2,1,1);
plot(t/100,C,'Linewidth', 2);
grid on;
ylim([-0.5 1.5])
title('原码')

time=changdu/dt;
D=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
       D(t)=B(i);
    end
end
t=1:time;
subplot(2,1,2)
plot(t/100,D,'Linewidth', 2);
grid on;
ylim([-1.5 1.5])
title('编码后的AMI码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

6.HDB3码

function B=en_hdb3(A)
%编码
changdu=length(A);
last_V=-1;
last_one=-1;
B=zeros(size(A));    
count=0;             

for i=1:changdu
     if A(i)==1       
         B(i)=-last_one;
         last_one=B(i);
         count=0;
     else
         count=count+1;
         if count==4   
             count=0;
             B(i)=-last_V;            
             last_V=B(i);
             if B(i)*last_one==-1     
                 B(i-3)=B(i);         
             end
             last_one=B(i);
         end
     end
end
%画图
dt=0.01;
time=changdu/dt;
C=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        C(t)=A(i);
    end
end
t=1:time;
figure;
subplot(2,1,1);
plot(t/100,C,'Linewidth', 2);
grid on;
ylim([-0.5 1.5]);
title('原码');

subplot(2,1,2);
D=zeros(1,time);
for i=1:changdu
    for t=100*i-99:100*i
        D(t)=B(i);
    end
end
t=1:time;
plot(t/100,D,'Linewidth', 2);
grid on;
ylim([-1.5 1.5])
title('编码后的HDB3码')

若输入信码{1 0 0 0 0 0 0 0 0 0 0 1},运行结果为

2.基带传输

数字信号的传输可分为基带传输和频带传输两种方式。通常把从原始信源转换过来,未经调制的信号称为基带信号,将基带信号直接在信道中传输的方式称为基带传输方式。

将二进制码输入基带传输系统,首先经过极性变换变为双极性码,然后经过发送滤波器形成基带波形发送出去,接受滤波器接收波形,滤除带外噪声,对失真波形进行均衡。发送和接受滤波器均为均方根升余弦滚降滤波器,可消除码间串扰,得到输出波形 y(t),抽样判决对接收到的信号定时抽样,然后和判决电平相比得到接收码。

经过发送滤波器产生的信号为原信号与均方根升余弦滚降单位脉冲响应的卷积,卷积函数为hfilter.m,卷积前信号序列要先进行码元拓展。

function y=hfilter(b_extend,hn)
y=conv(b_extend,hn);
L=length(hn);
for j=1:(L-1)/2
    y(:,1)=[];
end
for i=1:(L-1)/2
    y(:,length(b_extend)+1)=[];
end

%无噪基带传输
function problem2_BT(a)
Ts=1;%码元周期
N_sample=10;%每个码元抽样点数
alpha=1;%滚降系数为1
N_data=length(a);%码元数
dt=Ts/N_sample;%抽样时间间隔
t=-3*Ts:dt:3*Ts;%设置采样
A=1;
%%产生双极性数字信号
b=[];
for i=1:length(a)
    if a(i)>0
        b(i)=A*1;
    else
        b(i)=A*-1;
    end
end


%码元扩展
b_extend=zeros(1,length(b)*N_sample);
for i=N_sample:N_sample:length(b)*N_sample
    b_extend(i)=b(i/N_sample);
end
figure(1);
subplot(3,1,1);
stem([1:Ts:N_data],a,LineWidth=1.5);
xlim([0,N_data]);
title('输入的单极性码');
subplot(3,1,2);
stem([0:Ts/N_sample:length(b)*Ts-Ts/N_sample],b_extend,LineWidth=1.5);
title('变换后的双极性码');
hn=rcosdesign(alpha,6,4,'sqrt'); 
y0=hfilter(b_extend,hn);
figure(2);
subplot(3,1,1);
plot([0:Ts/N_sample:length(b)*Ts-Ts/N_sample],y0,LineWidth=1.5);
title('经过发送滤波器的信号')
y=hfilter(y0,hn);
subplot(3,1,2);
plot([0:Ts/N_sample:length(b)*Ts-Ts/N_sample],y,LineWidth=1.5);
title('经过接收滤波器的信号y(t)')
v=0;
for n=1:N_data
    if y(n*N_sample*Ts)>v
        c(n)=1;
       
    else
        c(n)=0;
    end
    figure(2);
    subplot(3,1,3);
    stem(n*Ts,y(n*N_sample*Ts),'color',[0 0.4470 0.7410],LineWidth=1.5);
    title('抽样信号')
    hold on;
    xlim([0,N_data]);

end

figure(1);
subplot(3,1,3);
stem([1:Ts:N_data],c,LineWidth=1.5);
xlim([0,N_data]);
title('判决后的输出信号')
err=0;
for i=1:N_data
    if c(i)~=a(i)
        err=err+1;
    end
end
err=err/N_data;
disp('误码率:');
disp(err);

若输入序列为[1 0 1 1 0 1 0 1 0 0 0 1] ,输出结果为

 3.基带系统抗噪声性能

在信道中加入特定信噪比的高斯白噪声,根据判决得到的输出码和输入码计算误码率,
绘制仿真得到的误码率曲线与理论误码率曲线比较。将图像转化为二进制码输入基带传输
系统传输,比较不同信噪比情况下输出图像的 PSNR。

主要流程如下:

1.给定信号幅度和噪声强度。

2.随机产生K个二进制信码。

3.极性转换。

4.通过基带系统后得到接收波形。

5.抽样判决。

6.计算误码率。

1.双极性码基带传输

给定信噪比SNR,在信道中加入强度为sigma的高斯白噪声。

%信噪比SNR
sigma=A/SNR;
y_noise=addnoise(sigma,y0);
subplot(3,1,2);
plot([0:Ts/N_sample:length(b)*Ts-Ts/N_sample],y_noise,LineWidth=1.5);
title('加入噪声后的信号')
y=hfilter(y_noise,hn);

noise_BT.m为含噪声的双极性码基带传输函数 ,noise_dBT为含噪声的单极性码基带传输函数。

%1.基带传输随机二进制信码
N_data=10;%码元数目
SNR=3;%信噪比
a= randi([0, 1], 1, N_data);%随机生成二进制信码
y2=noise_BT(a,SNR);%双极性码基带传输
y1=noise_dBT(a,SNR);%单极性码基带传输

随机产生 N_data=10 个二进制数,经过极性变换得到双极性码,经过发送滤波器,添加
信噪比为 SNR=3dB 的高斯白噪声,再经过接收滤波器。 以下是传输过程中的波形,由此可以看出,接收滤波器可以明显地减小噪声的影响。

对经过接受滤波器的信号 y(t)进行抽样判决,双极性码阈值电压为 0,判决后的输出信
号与输入的双极性码相同,误码率为 0。 

2.单极性码基带传输

随机产生 N_data=10 个二进制数单极性码,经过发送滤波器,添加信噪比为 SNR=3dB 的
高斯白噪声,再经过接收滤波器。

对经过接受滤波器的信号 y(t)进行抽样判决,单极性码阈值电压为 A/2,10 个判决后的
输出信号有 2 个与输入的单极性码相同,误码率为 0.2,由此可见在相同信噪比的情况下,
单极性码的抗噪声性能弱。

3.绘制仿真误码率曲线 

%2.绘制理论与实际误码率曲线
N_data=1000000;%码元数目
a= randi([0, 1], 1, N_data);
%理论误码率
A_dB = 1:0.5:7;  % A/a的取值范围,从0到7,步长为0.5
A = 10.^(A_dB./10);  % 将A/a转换为线性值
Pe1 = 1/2 * erfc(A_dB./(2*sqrt(2)));
A_dB = 1:0.5:7;  % A/a的取值范围,从0到7,步长为0.5
A = 10.^(A_dB./10);  % 将A/a转换为线性值
Pe = 1/2 * erfc(A_dB./sqrt(2));
%实际误码率
err1=ones(1,13);i=1;
for SNR=1:0.5:7
    [err1(i),~]=dBT(a,SNR);%单极性码基带传输
    i=i+1;
end
err2=ones(1,13);i=1;
for SNR=1:0.5:7
    [err2(i),~]=BT(a,SNR);%双极性码基带传输
    i=i+1;
end
SNR=1:0.5:7;
figure(5);
loglog(A_dB,Pe1,LineWidth=1.5,LineStyle="-");
hold on;
loglog(A_dB,Pe,LineWidth=1.5,LineStyle="-");
hold on;
loglog(SNR,err1,LineWidth=1.5,LineStyle="--");
hold on;
loglog(SNR,err2,LineWidth=1.5,LineStyle="--");
hold on;
grid on;  % 显示网格线
xlabel('(A/a)/dB');  % 设置横坐标标签
ylabel('Pe/dB');  % 设置纵坐标标签
title('Pe vs (A/a)');  % 设置图表标题
legend('理论单极性误码率','理论双极性误码率','实际单极性误码率','实际双极性误码率');

输出图像为

由绘制的误码率曲线可知,单极性码误码率实际测得的曲线和理论曲线完全拟合,双极性
码误码率曲线在误码率(A/a)低于 5dB 时完全拟合,高于 5dB 时误码率低于 10-6,若要
测出准确数值要求码元数目大于 108,但这超出了 matlab 的运算内存,导致算出的值不准,
误码率均为 0,在图像中无法显示。因此,总体来说该仿真基带传输系统的实际误码率和
理论误码率相符。

4.基带传输图像

用 imread('bydxt.jpg')读取图像,将图像转为灰度图像并将像素值归一化,按尺寸将
图像变换为二值序列 flatten_img 输入系带系统,调用 BT(flatten_img,SNR)(双极性基
带传输),或 dBT(flatten_img,SNR)(单极性基带传输),输出信号 out_img,显示接收
图像 out_img,调用函数 psnr(img,out_img)计算图像峰值信噪比。

%3.基带传输图像
%双极性码
psnrvalue1=[];
i=1;
img=uint8(imread('bydxt.jpg'));
img=rgb2gray(img);
flatten_img = reshape(img, 1, []);
flatten_img=flatten_img./255;
for SNR=1:0.2:7
    [~,out_img]=BT(flatten_img,SNR);
    out_img(out_img==-1)=0;
    out_img=out_img.*255;
    out_img = reshape(out_img, 667, 774);
    % 统一数据类型
    out_img=im2uint8(out_img);
    psnrvalue1(i) = psnr(img,out_img);
    if i>1
        if psnrvalue1(i-1)<20&&psnrvalue1(i)>20
            figure(6);
            imshow(out_img);
            title('人眼可接受的最低信噪比图像(双极性传输)');
            SNR1=SNR;%人眼可接受的最低信噪比
            psnrvalue3=psnrvalue1(i);%人眼可接受的最低信噪比图像的峰值信噪比
        end
    end
    disp('灰度图像的峰值信噪比:');
    disp(psnrvalue1(i));
    i=i+1;    
end
SNR=1:0.2:7;
figure(7);
plot(SNR,psnrvalue1,LineWidth=1.5);
grid on;
xlabel('(A/a)/dB');  % 设置横坐标标签
ylabel('PSNR');  % 设置纵坐标标签
title('图像经过基带传输后客观重建质量PSNR与信噪比A/a的关系(双极性码)');  % 设置图表标题

function [err,c]=BT(a,SNR)
Ts=1;%码元周期
N_sample=10;%每个码元抽样点数
alpha=1;%滚降系数为1
N_data=length(a);%码元数
dt=Ts/N_sample;%抽样时间间隔
t=-3*Ts:dt:3*Ts;%设置采样
A=1;
%%产生双极性数字信号
b=[];
for i=1:length(a)
    if a(i)>0
        b(i)=A*1;
    else
        b(i)=A*-1;
    end
end
%码元扩展
b_extend=zeros(1,length(b)*N_sample);
for i=N_sample:N_sample:length(b)*N_sample
    b_extend(i)=b(i/N_sample);
end
hn=rcosdesign(alpha,6,4,'sqrt'); 
y0=hfilter(b_extend,hn);

%信噪比SNR
sigma=A/SNR;
y_noise=addnoise(sigma,y0);

y=hfilter(y_noise,hn);
v=0;
for n=1:N_data
    if y(n*N_sample*Ts)>v
        c(n)=1;       
    else
        c(n)=-1;
    end
end
err=0;
for i=1:N_data
    if c(i)~=b(i)
        err=err+1;
    end
end
err=err/N_data;
disp('误码率:');
disp(err);

以下是当信噪比为 2dB 时,图像经双极性码系带系统的传输过程,误码率为 0.19,PSNR
为 17dB。(图像的客观质量评价通常用峰值信噪比PSNR来衡量)

输入图像
传输过程

接收图像

 

由图像可以看出,随着信噪比(A/a)的增大,PSNR 也随之增大,且双极性码基带传输的抗
噪声性能强。当 PSNR 小于 20dB 时,图像的质量在人眼的范围内开始不可接受。因此,以
PSNR=20dB 为分界点,经过测试,双极性码基带传输人眼可接受的最低信噪比约为 2.4dB,
单极性码基带传输人眼可接受的最低信噪比约为 4.8dB。以下是人眼可接受的最低信噪比
的接收图像。 

4.数字频带传输 

为了提高频带的利用率,将基带信号经过调制后在信道中传输。

然后再对其解调,本次实验使用的方法为二进制振幅键控和二进制和二进制相移键控。振
幅键控是利用载波的幅度变化来传递数字信息,而频率和初始相位保持不变。通过二进制
振幅键控方式生成 2ASK 称为通-断键控(OOK)。将表示信息的脉冲信号和载波信号时域
相乘得到 2ASK 信号。相移键控是利用载波的相位变化来传递数字信息。用初始相位 0 和 π
表示 0 和 1。是绝对相移方式,可以用双极性矩形脉冲序列与一个正弦载波相乘得到。解
调方式使用相干解调法。最后将信码、基带波形、已调信号波形、解调器带通滤波器波形,
低通波形,判决得到的波形可视化。
BASK 调制和 BPSK 的实际误码率和理论误码率是不同的。理论误码率是在理想的传输
环境下计算得出的,而实际误码率则考虑了传输信道的噪声、失真、多径等影响。对于 BASK
调制,理论误码率可以通过公式计算得到。实际误码率则需要考虑信道的影响。 

1.BASK调制与解调 

clear;
clc;
close all;
a=[1,0,0,1,0,1,1,1,0,1,0];      %输入信码
Ts=1;%码元周期
fs=2;       %载波频率
N_sample=10;%每个码元抽样点数
alpha=0.5;%滚降系数为
N_data=length(a);%码元数
dt=Ts/N_sample;%抽样时间间隔
SNR=10;
filter_size=1300;
A=1;
t0=1;
%%产生双极性数字信号
b=zeros(1,length(a));
for i=1:length(a)
    if a(i)>0
        b(i)=A*1;
    else
        b(i)=A*-1;
    end
end

%码元扩展
b_extend=zeros(1,length(b)*N_sample);
for i=N_sample:N_sample:length(b)*N_sample
    b_extend(i)=b(i/N_sample);
end
tt=0:Ts/N_sample:length(b)*Ts-Ts/N_sample;
figure(1);
subplot(3,1,1);
stem(tt,b_extend,LineWidth=1.5);
ylim([-1.5 1.5])
xlim([0,N_data]);
title('双极性码')
hn=rcosdesign(alpha,6,4,'sqrt'); 

y0=hfilter(b_extend,hn);        %y0为经过滤波器的信号
subplot(3,1,2);
plot(tt,y0,LineWidth=1.5);
xlim([0,N_data]);
ylim([-1 1])
grid on;
title('基带波形');
figure(1);

%ASK调制
F=[];
TT=[];
tt=0:0.001:1;
for i=10:10:length(y0)
    if y0(i)>0.5
        x1=sin(2*pi*fs*tt);
        F=[F,x1];
    else
        x1=0*sin(2*pi*fs*tt);
        F=[F,x1];
    end
%     a1=0+i*t0/10-t0;
%     b1=0+i*t0/10;
    T1=0+i*t0/10-t0:0.001:0+i*t0/10;
    TT=[TT,T1];
    subplot(3,1,3)
    plot(TT,F,'b','linewidth',1.5);
    xlim([0,N_data]);
    hold on
end

ylim([-2,2])
xlabel('t')
title('BASK已调信号波形')
grid on
hold off
changdu=length(F);

figure(2);
%%信噪比SNR
sigma=A*10^(-SNR./10);
y_noise=addnoise(sigma,F);
subplot(3,1,1);
plot(TT,y_noise,'b',LineWidth=1.5);
xlim([0,N_data]);
ylim([-1.5 1.5]);
grid on;
title('加入噪声后的调制信号')
%ASK解调
figure(2);
deY=sin(2*pi*fs*TT).*y_noise;
subplot(3,1,2);
plot(TT,deY,'b','linewidth',1.5);
ylim([-0.5,1.5])
xlim([0,N_data]);
grid on;
title('解调信号')
yy = imgaussfilt(deY, sigma);
% %低通滤波
% flag=0;
% flag1=0;
% flag2=0;
% AL=length(TT)/length(a);
% Y=yy;
% for i1=1:length(a)
%     if i1==length(a)
%         i3=i1;
%     else
%         i3=i1+1;
%     end
%     if i1==1
%         i4=1;
%     else
%         i4=i1-1;
%     end
%      if (a(i1)==1)&&(a(i3)==1)
%             flag1=1;
%         else
%             flag1=0;
%      end
%     if (a(i1)==1)&&(a(i4)==1)
%             flag2=1;
%         else
%             flag2=0;
%      end
%     for i2=(i1-1)*AL+1:i1*AL
%         if deY(i2)==1
%             flag=flag+1;
%         end
%         if ((flag>=1)&&(flag<=2*fs-1))
%             Y(i2)=1;
%         end
%         if (flag>=2*fs)&&(flag1)
%             Y(i2)=1;
%         end
%         if (flag==0)&&(flag2)
%             Y(i2)=1;
%         end
%     end
%     flag=0;
% end
% subplot(3,1,2);
% plot(TT,Y,'b','linewidth',1.5);
% ylim([-0.5,1.5])
% xlim([0,N_data]);
% grid on;
% title('解调信号滤波以后的信号')

% input_sequence: 输入序列
% filter_size: 低通滤波器的大小
    
% 使用平均滤波器进行低通滤波

filter = ones(1, filter_size) / filter_size;
filtered_sequence = conv(yy, filter, 'same');
subplot(3,1,3);
plot(TT,filtered_sequence,'linewidth',1.5);
ylim([-0.2 0.8])
grid on;
title('解调信号滤波以后的信号')
%抽样判决
v=0.2;
suo=1;
c=zeros(1,length(1:N_data));
for n=1/4/fs:1:(N_data-1)+1/4/fs
    if filtered_sequence(ceil(1000*n))>v
        c(suo)=1;
       
    else
        c(suo)=-1;
    end
    suo=suo+1;
end

figure(3);
stem(1:Ts:N_data,c,LineWidth=1.5);
ylim([-2,2])
xlim([0,N_data]);
title('判决后的输出信号')
err=0;
for i=1:N_data
    if c(i)~=b(i)
        err=err+1;
    end
end
err=err/N_data;
disp('误码率:');
disp(err);

 

 

输入信码为{1 0 0 1 0 1 1 1 0 1 0 },以上依次为双极性码,基带信号, BASK 调制信号,加入高斯白噪声(信噪比为 10dB)的 BASK 调制信号,BASK 解调信号,解调后低通滤波后的信号,最终输出判决的信号。 

2.BPSK调制与解调

clear;
clc;
close all;
a=[1,0,1,1,0,1,1,1,0,1,1];      %输入信码
SNR=10;
filter_size=1600;
Ts=1;%码元周期
fs=3;       %载波频率
N_sample=10;%每个码元抽样点数
alpha=0.5;%滚降系数为1
N_data=length(a);%码元数
dt=Ts/N_sample;%抽样时间间隔
A=1;
t0=1;
%%产生双极性数字信号
b=zeros(1,length(a));
for i=1:length(a)
    if a(i)>0
        b(i)=A*1;
    else
        b(i)=A*-1;
    end
end

%码元扩展
b_extend=zeros(1,length(b)*N_sample);
for i=N_sample:N_sample:length(b)*N_sample
    b_extend(i)=b(i/N_sample);
end
tt=0:Ts/N_sample:length(b)*Ts-Ts/N_sample;
figure(1);
subplot(3,1,1);
stem(tt,b_extend,LineWidth=1.5);
xlim([0,N_data]);
ylim([-1.5 1.5])
title('双极性码')
hn=rcosdesign(alpha,6,4,'sqrt'); 
subplot(3,1,2);

y0=hfilter(b_extend,hn);        %y0为经过滤波器的信号
subplot(3,1,2);
plot(tt,y0,LineWidth=1.5);
xlim([0,N_data]);
ylim([-1 1])
title('基带波形');
figure(1);

%BPSK调制
F=[];
TT=[];
tt=0:0.001:1;
for i=10:10:length(y0)
    if y0(i)>0.5
        x1=sin(2*pi*fs*tt);
        F=[F,x1];
    else
        x1=-1*sin(2*pi*fs*tt);
        F=[F,x1];
    end
    a1=0+i*t0/10-t0;
    b1=0+i*t0/10;
    T1=a1:0.001:b1;
    TT=[TT,T1];
    subplot(3,1,3)
    plot(T1,x1,'b','linewidth',1.5);
    xlim([0,N_data]);
    hold on
end

ylim([-2,2])
xlabel('t')
title('已调信号波形')
grid on
hold off
changdu=length(F);
%信噪比SNR
sigma=A*10^(-SNR./10);
y_noise=addnoise(sigma,F);
figure(2);
subplot(3,1,1);
plot(TT,y_noise,'b',LineWidth=1.5);
xlim([0,N_data]);
ylim([-2 2]);
title('加入噪声后的调制信号')

%BPSK解调
figure(2);
deY=sin(2*pi*fs*TT).*y_noise;
Y=hfilter(deY,hn);        %y0为经过滤波器的信号
subplot(3,1,2);
plot(TT,Y,'b','linewidth',1.5);
xlim([0,N_data]);
ylim([-3 3])
title('解调后的信号')

figure(2);
filter = ones(1, filter_size) / filter_size;
filtered_sequence = conv(Y, filter, 'same');
subplot(3,1,3);
plot(TT,filtered_sequence,'linewidth',1.5);
ylim([-0.5 1.5])
grid on;
title('解调信号滤波以后的信号')

%抽样判决
v=0;
suo=1;
c=zeros(1,length(1:N_data));
for n=1/4/fs:1:(N_data-1)+1/4/fs
    if filtered_sequence(ceil(1000*n))>v
        c(suo)=1;
       
    else
        c(suo)=-1;
    end
    suo=suo+1;
end

figure(3);
stem(1:Ts:N_data,c,LineWidth=1.5);
xlim([0,N_data]);
ylim([-2 2]);
title('判决后的输出信号')
err=0;
for i=1:N_data
    if c(i)~=b(i)
        err=err+1;
    end
end
err=err/N_data;
disp('误码率:');
disp(err);

 

以上依次为双极性码,基带信号, BPSK 调制信号,加入高斯白噪声(信噪比为 10dB)的 BPSK 调制信号,BPSK 解调信号,解调后低通滤波后的信号,最终判决输出的信号。 

 3.误码率比较

可以看出信噪比较小时 BASK 与 BPSK 的误码率较高,随着信噪比的增加误码率下降,BPSK
的误码率下降的更为明显,性能优于 BASK。 

项目完整代码见附录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值