?? bpsk_pet.m
字號:
echo off
m=10000;
ran(1,1:m)=randn(1,m);
a=zeros(1,m); %隨機產生qpsk的信號比特1或-1=zeros(1,m);
%隨機產生2psk的信號比特1或-1
for i=1:m
if ran(1,i)>0
a(1,i)=1;
else
a(1,i)=-1;
end
end
signal125=a;
%生成升余弦濾波器
Rs=1600;
nn=10;
fs=nn*Rs;
Ts=1/Rs;
al=0.375;
M=55;
htl=zeros(1,M);
for k=1:M;
t=(k-28)/fs;
W=pi*t/Ts;
if t==0
htl(k)=1;
elseif (al*W/pi==1/2)|(al*W/pi==-1/2)
htl(k)=0;
else
htl(k)=(sin(W)/W)*(cos(al*W)/(1-(4*al^2*W^2)/(pi^2)));
end
end
risecos=htl;
%原始信號抽樣
len=length(a);
aa=1;
sig_len=len*nn;
signal=zeros(1,sig_len);
for i=1:len
signal((i-1)*nn+nn/2+1)=a(i);
end
%波形生成
sig_conv=conv(signal,risecos);
sig_part=sig_conv(28:28+sig_len);
%2psk調制
fc=56000;
W=2*pi*fc/fs;
signal_on=zeros(1,sig_len);
for i=1:sig_len;
signal_on(1,i)=sig_part(i)*cos(W*i);
end
%加入多徑延遲
signalT=zeros(1,sig_len);
for i=3:sig_len
signalT(i)=0.5*signal_on(i)+0.3*signal_on(i-1)+0.2*signal_on(i-2);
end
echo on
% 加入噪聲后
% 產生噪聲并計算信噪比
for g=1:50
echo off
SNR=20-g;
signal_out=AWGN(signal_on,SNR);
%2psk解調
signal_demod=zeros(1,sig_len);
for i=1:sig_len
signal_demod(i)=signal_out(i)*cos(W*i);
end
%通過低通濾波器
N=150;
F=[0,0.2,0.2,1];
A=[1,1,0,0];
LF_Coefficient=firls(N,F,A);
LF_signal_demod=conv(LF_Coefficient,signal_demod);
LF_signal_demod=LF_signal_demod(75+1:sig_len+75);
%輸出抽樣判決
a_out=zeros(1,sig_len/nn);
for i=1:sig_len/nn
a_out(i)=LF_signal_demod((i-1)*nn+nn/2+1);
end
% 判決成雙極性碼并計算誤碼率
d=sig_len/nn;
signal=zeros(1,d);
for i=1:d
if a_out(i)>0
signal(i)=1;
else
signal(i)=-1;
end
end
% 比較
Ne=0;
for i=1:d
if signal(i)==signal125(i)
Ne=Ne;
else
Ne=Ne+1;
end
end
signal_Pe(g)=Ne/d;
signal_snr(g)=SNR;
echo on;
disp(g);
disp(SNR);
end
echo on
% 加入噪聲后
% 產生噪聲并計算信噪比
for g=1:50
echo off
SNR=20-g;
signal_out=AWGN(signalT,SNR);
%2psk解調
signal_demod=zeros(1,sig_len);
for i=1:sig_len
signal_demod(i)=signal_out(i)*cos(W*i);
end
%通過低通濾波器
N=150;
F=[0,0.2,0.2,1];
A=[1,1,0,0];
LF_Coefficient=firls(N,F,A);
LF_signal_demod=conv(LF_Coefficient,signal_demod);
LF_signal_demod=LF_signal_demod(75+1:sig_len+75);
%輸出抽樣判決
a_out=zeros(1,sig_len/nn);
for i=1:sig_len/nn
a_out(i)=LF_signal_demod((i-1)*nn+nn/2+1);
end
% 判決成雙極性碼并計算誤碼率
d=sig_len/nn;
signal=zeros(1,d);
for i=1:d
if a_out(i)>0
signal(i)=1;
else
signal(i)=-1;
end
end
% 比較
Ne=0;
for i=1:d
if signal(i)==signal125(i)
Ne=Ne;
else
Ne=Ne+1;
end
end
signal_PeT(g)=Ne/d;
signal_snrT(g)=SNR;
echo on;
disp(g);
disp(SNR);
end
plot(signal_snr,signal_Pe);xlabel('信噪比值');ylabel('誤碼率');
ylim([0,0.6]);grid on;title('加入多徑延遲前后誤碼率與信噪比值dB的比較關系');
hold on;
plot(signal_snrT,signal_PeT,'red');xlabel('信噪比值');ylabel('誤碼率');
ylim([0,0.6]);grid on;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -