利用Matlab实现对二进制数字调制与解调的仿真,包括以下三部分:二进制数字相移键控(2PSK),二进制数字振幅键控(2ASK),二进制数字频移键控(2FSK)。
解调方式为基本的相干解调,与载波同频同相。
clear all;
close all;
clc;
M=16; %产生码元数
L=128; %码元采样数
Ts=1; %码元周期
Rb=1/Ts; %码元速率
dt=Ts/L; %采样间隔
fs = 1/dt
TotalT=M*Ts; %总时间
t=0:dt:TotalT-dt; %时间序列
bits=randi([0,1],1,M); %随机二进制序列
fz=ones(1,L);
x1=bits(fz,:);
dnrz=reshape(x1,1,L*M); %2ASK调制
fc=2*Rb;
zb=sin(2*pi*fc*t); %载波信号
ask2=dnrz.*zb;
at1=ask2.*cos(2*pi*fc*t);
at1=at1-mean(at1);
[f,af] = T2F(t,at1);%通过低通滤波器
[t,at1] = lpf(f,af,2*Rb);
kf=0.3; %2FSK调制
fsk2=modulate(dnrz,fc,fs,'fm',kf);
ft1=fskdemod(fsk2,M,dt,fc);
m1=[]; %2PSK调制
c1=[];
b1=[];
for i=1:M
t1=(i-1)*Ts:dt:i*Ts-dt;
if bits(i)==0;
m=ones(1,L);
b=zeros(1,L);
else bits(i)==1;
m=-ones(1,L);
b=ones(1,L);
end %通过循环方式对输入信号的进行赋值实现调制目的
c=sin(2*pi*fc*t1);
m1=[m1 m];
c1=[c1 c];
b1=[b1,b];
end
psk2=c1.*m1;
pt1=2*b1.*psk2; %同步解调
figure(1); %波形绘制
subplot(4,1,1)
plot(t,dnrz)
title('单极性归零码')
axis([0,TotalT,-0.1,1.1])
subplot(4,1,2)
plot(t,ask2);
title('2ASK已调信号波形')
axis([0,TotalT,-1.1,1.1]);
subplot(413)
plot(t,fsk2);
title('2FSK已调信号波形')
axis([0,TotalT,-1.1,1.1]);
subplot(414)
plot(t,psk2)
title('2PSK已调信号波形')
axis([0,TotalT,-1.1,1.1]);
figure(2)
subplot(3,1,1);
plot(t,at1);
title('2ASK相干解调波形');
subplot(3,1,2);
plot(ft1);
title('2FSK相干解调波形');
subplot(3,1,3);
plot(pt1);
title('2PSK相干解调波形')
function [f,sf]= T2F(t,st)
dt = t(2)-t(1);
T=t(end);
df = 1/T;
N = length(st);
f=-N/2*df : df : N/2*df-df;
sf = fft(st);
sf = T/N*fftshift(sf);
end
function [t,st]=lpf(f,sf,B)
df = f(2)-f(1);
T = 1/df;
hf = zeros(1,length(f));%全零矩阵
bf = [-floor( B/df ): floor( B/df )] + floor( length(f)/2 );
hf(bf)=1;
yf=hf.*sf;
[t,st]=F2T(f,yf);
st = real(st);
end
function [t,st]=F2T(f,sf)
df = f(2)-f(1);
Fmx = ( f(end)-f(1) +df);
dt = 1/Fmx;
N = length(sf);
T = dt*N;
%t=-T/2:dt:T/2-dt;
t = 0:dt:T-dt;
sff = fftshift(sf);
st = Fmx*ifft(sff);
end