matlab高斯脉冲PAM调制文字通信简易仿真演示
环境
matlab2016a
摘要
matlab高斯脉冲PAM调制文字通信简易仿真演示,文字转化成二进制数组,在使用PAM调制输出,通过信道传输后,PAM解调,输出结果。
code
%PAM文字通信程序
%要传输的文字使用记事本的utf-8格式保存到同一个目录,文件名为text.txt
fileID = fopen('text.txt','r','n','utf-8'); %%https://ask.zol.com.cn/x/5444926.html
formatSpec = '%s';
OriginStr=fscanf(fileID,formatSpec);
%对文字的编码
WordNum=double(OriginStr); %文字字符转化成对应的编码
Wordbit=16; %一个文字字符对应16位bit的数据
WordBin=dec2bin(WordNum,Wordbit); %十进制转化成2进制
WordBin = boolean(WordBin-'0');
WordBin = WordBin.';
WordBin = WordBin(:);
WordBinSend = WordBin.';%该矩阵输出为01
Fs=16e9; %任意波形发生器的采样率16G Sa/s
Ts=1/Fs;
Num1Period=100; %在任意波形发生器一个脉冲周期的点数
ContinueTime=Ts*Num1Period;%一个脉冲的周期,总共2400个点,有24个周期的脉冲,100点一个周期,6.25e-9 s= 6.25ns一个周期
Freq=1/ContinueTime;%脉冲频率160MHz
t=linspace(-ContinueTime/2,ContinueTime/2,Num1Period);
Lenth_t=length(t);
tao=ContinueTime/10;
t0=0;
Info=WordBinSend;
InfoBitNum=length(WordBinSend);
MSign=zeros(InfoBitNum,Lenth_t);
% y0=zeros(Lenth_t,1); %%OOK脉冲调制0编码对应波形
%PAM脉冲调制0编码对应二阶高斯波形
y0=(-0.5).*(t.^2-tao.^2).*exp(-1.*((t-t0)/tao).^2)./(((2*pi).^(1/2)).*(tao.^5));
y0=y0./max(y0)/2; %缩小到1
%PAM脉冲调制1编码对应二阶高斯波形
y=(-1).*(t.^2-tao.^2).*exp(-1.*((t-t0)/tao).^2)./(((2*pi).^(1/2)).*(tao.^5));
y=y./max(y);
%
for i=1:InfoBitNum
if Info(i)==1
MSign(i,:)=repmat(y,1);
else
MSign(i,:)=repmat(y0,1);
end
end
MSignDisplay=MSign.';
MSignDisplay=MSignDisplay(:);
MSignDisplay=MSignDisplay.';
SendSignal=MSignDisplay;
SendSignal=awgn(SendSignal,10,'measured'); %给信道加高斯白噪声,信噪比10dB
MSignDisplay=SendSignal(1:Num1Period*Wordbit*2);%取出前十六位显示出来
%PAM编码的前十六位波形,也就是前16个字符的波形
tDisplay=linspace(0,ContinueTime*Wordbit*2,Num1Period*Wordbit*2);
figure(1);
plot(tDisplay,MSignDisplay)
grid on
axis([0,ContinueTime*Wordbit*2,-0.2,1])
xlabel('t')
ylabel('PAM编码的前十六位波形')
%%解调
sumsign=zeros((length(SendSignal)/Num1Period),1);%对信号求积分矩阵
verdict=zeros((length(SendSignal)/Num1Period),1);%判决结果矩阵
for i=1:(length(SendSignal)/Num1Period)
muli=(SendSignal((i-1)*Num1Period+1:(i-1)*Num1Period+Num1Period)).*y;
sumsign(i,:)=trapz(muli,t);
if sumsign(i)<=-4.8e-10 %判决的门限
verdict(i)=1;
else
verdict(i)=0;
end
end
verdict=verdict';
RcvInfoBit=verdict;
RcvInfoBitNum=length(RcvInfoBit);
RcvWord=zeros(RcvInfoBitNum/Wordbit,1);
%将对应的bit数据转化成文字
for i=1:(RcvInfoBitNum/Wordbit)
TempChar=mat2str(RcvInfoBit((i-1)*Wordbit+1:(i-1)*Wordbit+Wordbit));
TempChar=TempChar(2:32);
TempNum=bin2dec(TempChar);
TempNum=double(TempNum);
RcvWord(i)=TempNum;
end
RcvWord=RcvWord';
char(RcvWord)
结果
图为PAM编码的前十六位波形