% Basic simulation for DSSS
% College of Underwater Acoustic Engineering
% Harbin Engineering University
% All Rights Reserved.
% Programmer:Leigh lilin@hrbeu.edu.cn
% Version:1.0
% Last modified:2017-3-14
% Program function: Realize the basic simulation for DSSS
clear
clc
%% Parameter selection
load DataForDsss
load m_sequence
fs = 48000; %Sampling Rate
fc = 4000; %carrier frequency
bandwidth = 4000; %Bandwidth
%% Spread spectrum modulation
DataTx = Data(1:200);
for i = 1:length(DataTx)
if DataTx(i)==0
DataTx(i)=-1;
end
end
m_seq = m_sequence.order9(4,:);
DataTxmseq = kron(DataTx,m_seq);
%plot(corr_fun(DataTxmseq,m_seq))
%% Upsample
NumUpsanple = 2*fs/bandwidth; %N*1/fs = T; B/2 = 1/T (N:NumUpsample B:bandwidth )
DataTxmseqUpsample = rectpulse(DataTxmseq,NumUpsanple);
%% Carrier modulation
t = 0:1/fs:(length(DataTxmseqUpsample)-1)/fs;
carrier = cos(2*pi*fc*t);
TxSig = DataTxmseqUpsample.*carrier;
%% Generate LFM signal
SigSyncLFM = lfmgenerate(0.5,fc+bandwidth/2,fc-bandwidth/2,fs);
%% Generate transmate data
len = 0.2*fs; %spacing interval
SigSpace = zeros(1,len);
TxSignalCompleted=[SigSpace SigSyncLFM SigSpace TxSig SigSpace SigSyncLFM SigSpace];
%% Generate .wav file
A_signal=25000; %存储为.wav文件
fid=fopen('C:\Users\LEE\Desktop\ExpLongKou\LL05.wav','wb');
fwrite(fid,TxSignalCompleted*A_signal,'int16');
fclose(fid);
%% Intend white noise
SNR=-18;
RxData=awgn(TxSignalCompleted,SNR,'measured');
%% Analog channel
h1=[0.4 zeros(1,100) 1 zeros(1,200) 0.6 zeros(1,300) 0.5 zeros(1,200) 0.3];
% h2=[1 zeros(1,500) 0.5 zeros(1,200) 0.3 zeros(1,200) 0.1 zeros(1,100) 0.05];
RxData=conv(RxData,h1);
%% Synchronous head detection
SyncDection=corr_fun(RxData(1:5*fs),SigSyncLFM );
[MAX, Start]=max(SyncDection); %find the MAX number and it's position in SyncDection
% figure(1)
% plot(SyncDection)
%% Find sync head
RxData_Syc = RxData(Start+len:end);
%% Carrier demodulation
RxInfoDemod = RxData_Syc(1:length(carrier));
RxInfoDemod = RxInfoDemod.*carrier;
RxInfo = filterlowpass(RxInfoDemod,bandwidth*8/5,bandwidth*2,0.1,20,fs);
%% Downsample
RxInfoMseq = resample(RxInfo,fs/NumUpsanple,fs);
%% Divide the signal
len_m = length(m_seq);
RxInfoPara = zeros(length(DataTx),len_m);
for i = 1:length(DataTx)
RxInfoPara(i,:) = RxInfoMseq((i-1)*len_m+1:i*len_m);
end
%% Copy related to get the RxInfo
RxInfoCom = zeros(1,length(DataTx));
% RxCorrPara = zeros(length(DataTx),len_m*2-1);
for i = 1:length(DataTx)
CorrPos = corr_fun(RxInfoPara(i,:),m_seq);
% RxCorrPara(i,:) = CorrPos;
% ConvTRPos = conv(fliplr(CorrPos),CorrPos);
CorrNeg = corr_fun(RxInfoPara(i,:),-m_seq);
[MAX1,POS1] = max(abs(CorrPos));
[MAX2,POS2] = max(abs(CorrNeg));
if CorrPos(POS1) > CorrNeg(POS2)
RxInfoCom(i) = 1;
else
RxInfoCom(i) = -1;
end
end
%% Bit error rate calculation
[Num,Rat] = symerr(RxInfoCom,DataTx);
评论0