clear all;
tic
%-----------------仿真参数----------------------------
fs_filter=2048;%滤波器的采样率
N=2048;%子载波个数
Ns=40;%symbol个数
dsource_buf=zeros(1,2048*Ns-6);
dsource=zeros(1,2048*Ns-6);
N_frame=2;%仿真次数
SNR=0:1:10;
BER=zeros(1,length(SNR));
out_interleaving=zeros(1,163840);
out_interleaving1=zeros(2,81920);
data=zeros(2048,40);
d_source=zeros(2048,80);
%-------------- 多径衰落信道:IEEE802.22-----------------------------------
SampR = 1/9.14; % 信号速率 9.14M
h = zeros(1,round(14/SampR)+1); % 信道冲激响应初始化
h(1) = 10^((-6)/10);
h(round(3/SampR)+1) = 1; % 信道长度:6 chips
h(round(5/SampR)+1) = 10^((-7.0)/10);
h(round(7/SampR)+1) = 10^((-22.0)/10);
h(round(10/SampR)+1) = 10^((-16.0)/10);
h(round(14/SampR)+1) = 10^((-20.0)/10);
%----------------------------------------------------------------------
for isnr=1:length(SNR)
count=0;
sigma=sqrt(1/2/(10^(SNR(1,isnr)/10)));
for n_frame=1:N_frame
%------------------产生数据符号-----------------------------
dsource_buf=randn(1,2048*Ns-6);
dsource_buf=dsource_buf>0;
dsource=[dsource_buf,0,0,0,0,0,0];%生成一帧内的随机二进制比特流,此帧为发送端发送的数据
%----------FEC coder----------
d_trellis=poly2trellis(7,[133 171]);
out_fec=convenc(dsource,d_trellis);%编码,输入1bit输出2bit
%----------interleaving----------
k=0:163839; %first step interleaving
s=10240*mod(k,16)+floor(k/16);
out_interleaving(k+1)=out_fec(s+1);
for m=1:81920
out_interleaving1(1,m)=out_interleaving(2*m-1);
out_interleaving1(2,m)=out_interleaving(2*m);
end
modObj = modem.pskmod('M',4, 'PhaseOffset',pi/4,'SymbolOrder', 'binary', 'InputType', 'bit');
modulatedsig = modulate(modObj, out_interleaving1);
for m=1:40
data(1:2048,m)=modulatedsig(2048*(m-1)+1:2048*m);
end
%-------------------------------滤波器设计---------------------------------
rolloff=1;%滚降系数
L=4*fs_filter;%滤波器阶数
h_sqrt_nyquist = rcosine(1,fs_filter,'fir/sqrt',rolloff,L/(2*fs_filter));%产生滤波器
%plot(h_sqrt_nyquist);grid on;hold on
%------------------------------发送端------------------------------------
%for m=0:2047
% for n=0:79
% d_source(m+1,n+1)=d_source(m+1,n+1)*exp(i*(m+n));
%end
%end
%---------------------------------------------------------------
%signal_up=(upsample(d_source.',fs_filter/2)).';%对信号上采样
%signal_filtered=zeros(N,length(signal_up)+length(h_sqrt_nyquist)-1);
%for m=1:2048
%signal_filtered(m,:)=conv(signal_up,h_sqrt_nyquist);
%end
%-----------------------------------------------------------------------------
signal_new=zeros(N,2*Ns);
signal_real=real(data);
signal_imag=imag(data);
for m=1:1024
signal_new(2*m-1,1:2:2*Ns-1)=signal_real(2*m-1,:);
signal_new(2*m-1,2:2:2*Ns)=signal_imag(2*m-1,:);
signal_new(2*m,1:2:2*Ns-1)=signal_imag(2*m,:);
signal_new(2*m,2:2:2*Ns)=signal_real(2*m,:);
end
signal_modulation=zeros(N,2*Ns);
for m=1:N
for n=1:2*Ns
signal_modulation(m,n)=signal_new(m,n)*exp(1i*(m+n-2)*pi/2);
end
end
%for n=1:N
%signal_modulation(n,:)=signal_new(n,:)*exp(1i*(n-1)*pi/2);
%signal_modulation(n,2:2:2*Ns)=signal_modulation(n,2:2:2*Ns)*exp(1i*pi/2);
%end
signal_ifft=zeros(2*Ns,N);
signal_filtered=zeros(2*Ns,length(h_sqrt_nyquist));
signal_carrier=zeros(2*Ns,length(h_sqrt_nyquist)+(2*Ns-1)*fs_filter/2);
for n=1:2*Ns
signal_ifft(n,:)=ifft(signal_modulation(:,n),N)*N;
signal_ifft(n,:)=circshift(signal_ifft(n,:).',-N/2*(n-1)).';
signal_filtered(n,1:N)=signal_ifft(n,:).*h_sqrt_nyquist(1:N);
signal_filtered(n,N+1:2*N)=signal_ifft(n,:).*h_sqrt_nyquist(N+1:2*N);
signal_filtered(n,2*N+1:3*N)=signal_ifft(n,:).*h_sqrt_nyquist(2*N+1:3*N);
signal_filtered(n,3*N+1:4*N)=signal_ifft(n,:).*h_sqrt_nyquist(3*N+1:4*N);
signal_filtered(n,4*N+1:(length(h_sqrt_nyquist)))=signal_ifft(n,(length(h_sqrt_nyquist)-4*N)).*h_sqrt_nyquist(4*N+1:(length(h_sqrt_nyquist)));
signal_filtered_shift=[zeros(1,(n-1)*fs_filter/2),signal_filtered(n,:)];
signal_carrier(n,:)=[signal_filtered_shift,zeros(1,length(signal_carrier)-length(signal_filtered_shift))];
end
signal_transmit=sum(signal_carrier);
%-------------------------------通过信道-------------------------------
power=var(signal_transmit)+mean(signal_transmit)*conj(mean(signal_transmit));
power_db=10*log10(power);
awgn_signal_transmit=awgn(signal_transmit,SNR(isnr),power_db);
%----------------接收端------------------------------------
signal_received= awgn_signal_transmit;
h_sqrt_nyquist_shift=zeros(2*Ns,length(signal_received));
signal_received_filtered=zeros(2*Ns,length(signal_received));
signal_received_filtered1=zeros(2*Ns,N*(L/fs_filter+Ns));
for n=1:2*Ns
h_sqrt_nyquist_temp=[zeros(1,(n-1)*fs_filter/2),h_sqrt_nyquist];
h_sqrt_nyquist_shift(n,:)=[h_sqrt_nyquist_temp,zeros(1,length(signal_received)-length(h_sqrt_nyquist_temp))];
signal_received_filtered(n,:)=h_sqrt_nyquist_shift(n,:).*signal_received;
signal_received_filtered1(n,:)=[signal_received_filtered(n,:),zeros(1,length(signal_received_filtered1)-length(signal_received_filtered))];
end
signal_received_filtered_new=zeros(2*Ns,N);
signal_received_fft=zeros(2*Ns,N);
signal_received_demodulation=zeros(2*Ns,N);
signal_received_demodulation1=zeros(2*Ns,N);
for n=1:2*Ns
for m=1:N
signal_received_filtered_new(n,m)=sum(signal_received_filtered1(n,1+(m-1):N:(N*(L/fs_filter+Ns-1)+(m-1))));
end
signal_received_fft(n,:)=fft(signal_received_filtered_new(n,:),N);
end
for m=1:N
for n=1:2*Ns
signal_received_demodulation(n,m)=signal_received_fft(n,m)*exp(-1i*(m+n-2)*pi/2);
end
end
%for n=1:N
%signal_received_demodulation(:,n)=signal_received_fft(:,n)*exp(-1i*(n-1)*pi/2);
%end
signal_received_demodulation1(1:2:2*Ns-1,:)=real(signal_received_demodulation(1:2:2*Ns-1,:));
signal_received_demodulation1(2:2:2*Ns,:)=real(signal_received_demodulation(2:2:2*Ns,:));
% variance_real=mean((signal_demod_real_filtered_down(:,1:N_symbol).'-real(signal).').^2);%实部信号不同载波上方差
% variance_imag=mean((signal_demod_imag_filtered_down(:,1:N_symbol).'-imag(signal).').^2);%虚部信号不同载波上方差
% variance_r_n(n_time)=mean(variance_real);
% variance_i_n(n_time)=mean(variance_imag);
signal_final=real(signal_received_demodulation).';
signal_real_final=zeros(N,Ns);
signal_imag_final=zeros(N,Ns);
for m=1:1024
signal_real_final(2*m-1,:)=signal_final(2*m-1,1:2:2*Ns-1);
signal_imag_final(2*m-1,:)=signal_final(2*m-1,2:2:2*Ns);
signal_real_final(2*m,:)=signal_final(2*m,2:2:2*Ns);
signal_imag_final(2*m,:)=signal_final(2*m,1:2:2*Ns-1);
end
signal_data_final=signal_real_final+1i*signal_imag_final;
demodulatedsig=zeros(1,N*Ns);
for m=1:40
demodulatedsig(2048*(m-1)+1:2048*m)=signal_data_final(1:2048,m);
end
demodObj_SD = modem.pskdemod(modObj,'OutputType','bit','DecisionType','llr','NoiseVariance',0.1);
llr1_SD=zeros(1,N*Ns*2);
llr_SD = demodulate(demodObj_SD,demodulatedsig);
for n=1:N*Ns
llr1_SD(2*n-1)=llr_SD(1,n);
llr1_SD(2*n)=llr_SD(2,n);
end
%----------deinterleaving----------
outdeinterleaving=zeros(1,N*Ns*2);
j=0:N*Ns*2-1;
k=10240*j-(N*Ns*2-1)*floor(j/16);
outdeinterleaving(k+1)=llr1_SD(j+1);
%----------FEC decoder----------
outfec=vitdec(outdeinterleaving,d_trellis,35,'term','unquant');
count=count+sum(abs(outfec-dsource));
end