clear
close all
% 参数设置
fs = 100e3; % 采样速率
sr = 5e3; % 码元速率
N=10000;
ebno = 1000;
cfo = -200;
b=randi([0 1],1,N);
bitData=b;
nBytes =N* 1;
nCode = 1; %一个字节用8个bit编码
totaldata=N/2+100;
% 2. 进行交织
bitData_scramble = matintrlv(bitData, 10* nCode, nBytes / 10);
%一个突发的错误变成随机错误,提升纠错能力
% 3. 映射为QPSK符号
symData = QPSKMap(bitData_scramble);
% 添加训练符号
symData = [ones(1, 100), symData];
% 4. 调制
modData = pskmod(symData, 4, pi/4);
figure(6)
title('星座图');
scatter(real(modData),imag(modData));
% 5. 利用zc序列生成同步头
onePreData = CreatZC(500);
preData = repmat(onePreData, 1, 2);
preLength = length(preData);
% 6. 添加导频纠正相偏
totalData = modData;
% 7. 设置发射滤波器,也就是脉冲成型滤波器
irfn = 8;%;;滤波器截断的码元范围
ipoint = fs/sr;%每个码元范围内采样的点数
alfa = 0.5; % 由此可以得出带宽是10e3 * (1.5) = 15e3;
sendFilter = rcosdesign(alfa, irfn, ipoint, 'sqrt');
delay = irfn * ipoint / 2;
upData = upsample(totalData, ipoint);%进行上采样才能得到正确结果
toSend = conv(upData, sendFilter,'same');
%%%%%%%%%%%%%%%%pluto发送的数据要为列向量%%%%%%%%%%%%%%%%%%%%
toSend=[preData toSend];
% toSend=toSend.';
Frame_len = length(toSend);
% 计算信噪比系数
spow = mean(abs(toSend).^2);
npow = 0.5 * spow ./ 10^(ebno / 10);
attn = sqrt(npow);
%频偏Hz
% 计算信噪比系数
spow = mean(abs(toSend).^2);
npow = 0.5 * spow ./ 10^(ebno / 10);
attn = sqrt(npow);
%% channel
noise = attn.*(randn(1,Frame_len) + randn(1,Frame_len).*1i);
data_noise = toSend + noise;
extra_noise = attn.*(randn(1,50000) + randn(1,50000).*1i);
end_noise = attn.*(randn(1,100000) + randn(1,100000).*1i);
rx_signal = [extra_noise data_noise end_noise];
nn = (0:length(rx_signal)-1);
rx_signal_fre_offset = rx_signal.*exp(1i*2*pi*cfo.*nn./fs);
%%
pre = CreatZC(500);
ipoint = 20;
irfn = 8;
alfa = 0.5; % 由此可以得出带宽是10e3 * (1.5) = 15e3;
recvFilter = rcosdesign(alfa, irfn, ipoint, 'sqrt');
freqComp = comm.CoarseFrequencyCompensator(...
'Modulation','QPSK', ...
'SampleRate',fs, ...
'FrequencyResolution',1);%粗频偏纠正
symbolSync = comm.SymbolSynchronizer('SamplesPerSymbol', ipoint);%符号同步器,纠正码元时延
fine = comm.CarrierSynchronizer( ...
'SamplesPerSymbol',1,'Modulation','QPSK');%纠正载波频偏
i=1;
while(true)
% [data,datavalid,overflow] = rxPluto();
out = xcorr(rx_signal_fre_offset,pre);
out = out(length(rx_signal_fre_offset):end);
% figure(1)
% plot(abs(out));
pos = find(abs(out) > 100);
[pos_max,loc] = max(abs(out(pos(1):pos(1)+20)));
pos1 = loc+pos(1)-1+500*2;
data = rx_signal_fre_offset(pos1:20*totaldata+pos1-1 );
%data = agc(data);
[rxData1, estFreqOffset] = freqComp(data');
% estFreqOffset;
%
% scatterplot(rxData1);
% title('粗频偏纠正');
% 匹配滤波
rxData2 = conv(rxData1, recvFilter, 'same');
rxData3 = symbolSync(rxData2);
if(length(rxData3) < totaldata)
rxData3 = [rxData3', zeros(1, totaldata- length(rxData3))]';
else
rxData3 = rxData3(1:totaldata);
end
% scatterplot(rxData3);
% title('符号同步');
rxData4 = fine(rxData3);%相偏修正
% scatterplot(rxData4);
% title('相偏纠正');
% 本来是取前100个训练符号来做纠正相偏,但是经过实际测试,发现前面一些点会因为没有收敛导致相位错误,
% 所以直接取后50个来纠正
pre100 = rxData4(1: 100);
pre100=pre100(51:end);
pre100=pre100.';
a=repmat(-1+1j,1,50);
anout = angle(pre100./a);
anout = mean(anout);
% scatterplot(a);
rxData4 = rxData4./exp(1j*anout);
rxData4=rxData4(101:end);
% scatterplot(rxData4);
% rxData4=rxData4.*exp(1j*pi/2);
demodData = pskdemod(rxData4, 4, pi/4);
% 解交织, 这里有一个符号映射bit的问题
bitDemap = QPSKDeMap(demodData);
nCode = 1; %一个字节用8个bit编码
bitData_descramble = matdeintrlv(bitDemap, 10* nCode, nBytes / 10);
% 比较误码率
% [~, rate] = biterr(demodData, symData');
[~, rate] = biterr(bitData, bitData_descramble);
rate;
rate1(i)=rate;
i=i+1;
if(rate<0.4)
break
end
end
% str = num2str(bitData_descramble);
% str1=strrep(str,' ','');
% b=reshape(str1,8,x1*x2);
% c=bin2dec(b');
% d=reshape(c,x1,x2);
% imshow(uint8(d));
figure(1)
scatter(real(rxData1),imag(rxData1));
title('粗频偏纠正');
figure(2)
scatter(real(rxData3),imag(rxData3));
title('符号同步的波形');
figure(3)
scatter(real(rxData4),imag(rxData4));
title('相偏纠正后的波形');
symerr(b,bitData_descramble)/length(b)
评论30