一.实验原理
直接序列扩频,就是直接用高码率的扩频码序列在发端去扩展信号的频谱,在收端用相同的扩频码去解扩,把展宽的扩频信号还原成原始的基带信号。 在发端输入的信息与扩频码发生器产生的伪随机码序列(这里使用的是m序列)进行波形相乘,得到复合信号,实现信号频谱的展宽,展宽后的信号再调制射频载波发送出去。由于采用平衡调制可以提高系统抗侦波的能力,所以直接序列扩频调制一般都采用二相平衡调制方式。一般扩频调制时一个信息码包含一个周期的伪码,用扩频后的复合信号对载波进行二相相移监控(BPSK)调制,当gt从“0”变成“1”或从“1”变到“0”时,载波相位发生180度相移。 接收端的本振信号与发射端射频载波相差一个中频,接收端收到的宽带射频信号与本振信号混频、低频滤波后得到中频信号,然后与本地产生的与发端相同并且同步的扩频码序列进行波形相乘,实现相关解扩,再经信息解调,恢复出原始信号。
二.模型组成
1.扩频调制
用扩频码发生器产生一个伪随机码 pn(这里用的是m序列),与信源信息码序列xt相乘,实现频谱的展宽
2.BPSK调制
调制的方式可以有二相相移监控BPSK、四相相移键控QPSK、偏移四相相移监控OQPSK、最小频移监控MSK。QPSK调制的目的是节省频谱。
3.BPSK解调
选用的是科斯塔斯环,因为它的突出优点是能够解调移相键控信号和抑制了载波的信号,且环路的工作频率与输入信号载波频率完全相同。
4.扩频解调
由于相关解扩在性能上很好,在接收端产生的本地pn’码,可以用科斯塔斯环实现与发端的pn码精确的同步。
三.实现代码
clear
clc
x_code=sign(mgen(19,11,2000)-0.5); %PN码
pn=rectpulse(x_code,8);%每个伪码元内采样8个点
plot(pn);
axis([0 1000 -1.5 1.5]);
title('伪随机码序列');
grid on;
%%
code_length=20; %信息码元个数
N=1:code_length;
rand('seed',0);
x=sign(rand(1,code_length)-0.5); %信息码从0、1序列变成-1、1序列
x1=rectpulse(x,800);%每个码元内采样800个点
figure(2)
plot(x1);
axis([0 16000 -1.5 1.5]);
title('信源信息码序列');
grid on;
figure(3)
gt=x1.*pn;
plot(gt);
axis([0 1000 -1.5 1.5]);
title('复合码序列');
grid on;
figure(4);
%% 用BPSK调制
f0=6000;%载波频率
fs=5*f0;%采样频率
for i=1:2000
AI=2;
dt=fs/f0;
n=0:dt/7:dt; %一个载波周期内采样8个点
cI=AI*cos(2*pi*f0*n/fs);
x_bpsk((1+(i-1)*8):i*8)=gt((1+(i-1)*8):i*8).*cI;
end
subplot(3,1,1)
plot(x_bpsk);
axis([0 200 -2.5 2.5]);
title('BPSK调制后的波形');
grid on;
SNR=10;
gt1=awgn(x_bpsk,SNR);%加高斯白噪声形成接收信号
f0=6000;%载波频率
fs=5*f0;%采样频率
for i=1:2000
dt=fs/f0;
n=0:dt/7:dt; %一个载波周期内采样8个点
cI=cos(2*pi*f0*n/fs);
x_bpsk1((1+(i-1)*8):i*8)=gt1((1+(i-1)*8):i*8).*cI;
end
subplot(3,1,3)
plot(x_bpsk1);
axis([0 200 -2.5 2.5]);
title('加噪后已调波的波形');
grid on;
figure(6)
%% 解调
for i=1:2000
dt=fs/f0;
n=0:dt/7:dt; %一个载波周期内采样八个点
cI=cos(2*pi*f0*n/fs);
s((1+(i-1)*8):i*8)= x_bpsk1((1+(i-1)*8):i*8).*cI;
end
plot(s);
axis([0 200 -2.5 2.5]);
title('解调后的波形');
grid on;
figure(7)
%% 相关解扩
jk_code=s.*pn;
%% 低通滤波
wn=1/500;
b=fir1(16,wn);
H=freqz(b,1,16000);
xx=filter(b,1,jk_code);
plot(xx);
axis([0 16000 -1.5 1.5]);
title('解扩并滤波后的波形');
grid on;
for i=1:16000
if xx(i)<0
xx1(i)=-1;
else
xx1(i)=1;
end
end
%% 信源信息码与收端恢复出的波形的比较
figure(8)
subplot(2,1,1);
plot(x1);
axis([0 16000 -1.5 1.5]);
title('信源信息码序列');
grid on;
subplot(2,1,2);
plot(xx1);
axis([0 16000 -1.5 1.5]);
title('收端接收到的波形');
grid on;
[m,n]=symerr(xx1,x1);%m表示误码个数,n表示误码率
function[out]=mgen(g,state,N)
gen=dec2bin(g)-48;
M=length(gen);
curState=dec2bin(state,M-1)-48;
for k=1:N
out(k)=curState(M-1);
a=rem(sum(gen(2:end).*curState),2);
curState=[a curState(1:M-2)];
end
end
最后:
如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!