Matlab——通信原理小程序

概述

通信原理课上老师布置的作业

  1. AM,DSB,SSB信号的功率谱计算及其相干解调
  2. 2ASK,2FSK,2PSK信号功率谱及这三种信号信噪比与误码率之间的关系

AM,DSB,SSB信号功率谱计算及其相干解调

%% 通信原理作业1
%% variable 
clc
clear all

A0=1;A1=1; A2=1;
dt=0.0001;  T=3; 
df=1/T; N=T/dt;
f=(-N/2:N/2-1)*df;
f1=1; w1=2*pi*f1;
f2=10; w2=2*pi*f2;
fc=f2; fs=1/dt;

x=0:dt:(T-dt);
y1=A1*sin(w1.*x);
y2=A2*cos(w2.*x);
%% m(t)  c(t)
figure(1)
subplot(2,1,1); plot(x,y1,'linewidth',1.5); grid on
title('m(t)');
subplot(2,1,2); plot(x,y2,'linewidth',1.5); grid on
title('c(t)');
figure(2)

%% AM
yAM=(A0+y1).*y2;                                 % AM 

pAM=fft(yAM); pAM=T/N*fftshift(pAM);  % fft&shift 
pAM=(abs(pAM).^2)/x(end);

subplot(2,3,1); plot(x,yAM); axis([x(1),x(N),1.2*min(yAM),1.2*max(yAM)]); grid on 
title('AM');
subplot(2,3,4); plot(f,pAM); axis([-1.5*f2,1.5*f2,0,max(pAM)]); grid on
title('功率谱');
%% DSB
yDSB=y1.*y2;                                 % DSB 

pDSB=fft(yDSB); pDSB=T/N*fftshift(pDSB);  % fft&shift 
pDSB=(abs(pDSB).^2)/x(end);

subplot(2,3,2); plot(x,yDSB);  axis([x(1),x(N),1.2*min(yDSB),1.2*max(yDSB)]); grid on 
title('DSB');
subplot(2,3,5); plot(f,pDSB); axis([-1.5*f2,1.5*f2,0,max(pDSB)]); grid on
title('功率谱');
%% SSB
ySSB=real(hilbert(y1).*exp(1i*2*pi*f2*x));

pSSB=fft(ySSB); pSSB=T/N*fftshift(pSSB);  % fft&shift 
pSSB=(abs(pSSB).^2)/x(end);

subplot(2,3,3); plot(x,ySSB);  axis([x(1),x(N),1.2*min(ySSB),1.2*max(ySSB)]); grid on 
title('SSB');
subplot(2,3,6); plot(f,pSSB); axis([-1.5*f2,1.5*f2,0,max(pSSB)]); grid on
title('功率谱');

demod_am=demod(yAM,fc,fs,'am');
demod_dsb=demod(yDSB,fc,fs,'amdsb-sc');
demod_ssb=demod(ySSB,fc,fs,'amssb');
%% 解调
figure(3)

subplot(3,1,1); plot(x,demod_am,x,y1,'r');grid on
title('AM相干解调')
subplot(3,1,2); plot(x,demod_dsb,x,y1,'r');grid on
title('DSB相干解调')
subplot(3,1,3); plot(x,demod_ssb,x,y1,'r');grid on
title('SSB相干解调')

2ASK,2FSK,2PSK信号功率谱及这三种信号信噪比与误码率之间的关系

%% 通信原理作业2
%% varibale
clc
clear all
close all

n=1000;n_display=10;
b=randint(1,n);
f1=1;f2=2; ffsk_neg=f2;
t=0:1/30:1-1/30;
dt=1/30;
T=n;
df=1/T; N=T/dt;
f=(-N/2:N/2-1)*df;

%% 方便根据信噪比计算误码率------将信号能量转化为单位能量
%% 2ASK
sa_pos=sin(2*pi*f1*t);
E1=sum(sa_pos.^2);
sa_pos=sa_pos/sqrt(E1); %
sa_neg=0*sin(2*pi*f1*t);
%% 2FSK
sf_neg=sin(2*pi*f1*t);
E=sum(sf_neg.^2);
sf_neg=sf_neg/sqrt(E);
sf_pos=sin(2*pi*f2*t);
E=sum(sf_pos.^2);
sf_pos=sf_pos/sqrt(E);
%% 2PSK
sp_neg=-sin(2*pi*f1*t)/sqrt(E1);
sp_pos=sin(2*pi*f1*t)/sqrt(E1);

%% 调制
ask_signal=[];psk_signal=[];fsk_signal=[];
for i=1:n
    if b(i)==1
        ask_signal=[ask_signal sa_pos];
        psk_signal=[psk_signal sp_pos];
        fsk_signal=[fsk_signal sf_pos];
    else
        ask_signal=[ask_signal sa_neg];
        psk_signal=[psk_signal sp_neg];
        fsk_signal=[fsk_signal sf_neg];
    end
end
%% 10个码元序列-----用于波形显示
figure(1)
subplot(4,1,1)
stairs(0:n_display,[b(1:n_display) b(n_display)],'linewidth',1.5)
axis([0 n_display -0.5 1.5]); grid on
subplot(4,1,2)
tb=0:1/30:10-1/30;
plot(tb, ask_signal(1:10*30),'b','linewidth',1.5)
title('2ASK');grid on
subplot(4,1,3)
plot(tb, fsk_signal(1:10*30),'r','linewidth',1.5)
title('2FSK');grid on
subplot(4,1,4)
plot(tb, psk_signal(1:10*30),'k','linewidth',1.5)
title('2PSK');grid on
%% 对全部码元序列计算PSD
figure(2) 
subplot(3,1,1)
pask_signal=(abs(T/N*fftshift(fft(ask_signal(1:T*30)))).^2)/T;
pfsk_signal=(abs(T/N*fftshift(fft(fsk_signal(1:T*30)))).^2)/T;
ppsk_signal=(abs(T/N*fftshift(fft(psk_signal(1:T*30)))).^2)/T;

subplot(3,1,1); plot(f,pask_signal,'linewidth',1.5);axis([-ffsk_neg*2,ffsk_neg*2,0,max(pask_signal)]);
title('2ASK 功率谱');grid on
subplot(3,1,2); plot(f,pfsk_signal,'linewidth',1.5);axis([-ffsk_neg*2,ffsk_neg*2,0,max(pfsk_signal)]);
title('2FSK 功率谱');grid on
subplot(3,1,3); plot(f,ppsk_signal);axis([-ffsk_neg*2,ffsk_neg*2,0,max(ppsk_signal)]);
title('2PSK 功率谱');grid on


%% 添加高斯白噪声计算误码率
biterror_ask=zeros(1,21);
biterror_fsk=zeros(1,21);
biterror_psk=zeros(1,21);
for snr=0:20
    askn=awgn(ask_signal,snr);
    pskn=awgn(psk_signal,snr);
    fskn=awgn(fsk_signal,snr);


    A = zeros(1,n);
    F = zeros(1,n);
    P = zeros(1,n);
    for i=1:n
        if sum(sa_pos.*askn(1+30*(i-1):30*i))>0.5  %相干解调和抽样判决,没有加带通滤波器
            A(i)=1;
        end
        if sum(sf_pos.*fskn(1+30*(i-1):30*i))>0.5
            F(i)=1;
        end
        if sum(sp_pos.*pskn(1+30*(i-1):30*i))>0
            P(i)=1;
        end
    end
    errA=0;errF=0; errP=0;
    for i=1:n
        if A(i)~=b(i)
            errA=errA+1;
        end
        if F(i)~=b(i)
            errF=errF+1;
        end
        if P(i)~=b(i)
            errP=errP+1;
        end
    end
    biterror_ask(snr+1)=errA/n;
    biterror_fsk(snr+1)=errF/n;
    biterror_psk(snr+1)=errP/n;
end
%%
figure(3)
semilogy(0:20,biterror_ask, 'b','linewidth',2)
%plot(0:20,biterror_ask, 'b','linewidth',2)
grid on;
hold on
semilogy(0:20,biterror_fsk,'r','linewidth',2)
semilogy(0:20,biterror_psk, 'k','linewidth',2)
title('biterror rate & S/N')
legend('ASK','FSK','PSK');

你可能感兴趣的:(matlab,2015总结,matlab,通信原理)