%ofdm
clc,clear all
para=128; %并行信道数
nd=20; %每个信道传输的符号数
ber=zeros(1,15);
snr=zeros(1,15);
h2=waitbar(0,'please wait...','name','当前进度');
for SNR=1:15;
waitbar(SNR/15);
nloop=200;%仿真次数
noe=0;%错误数据数
nod=0;%总数据数
for ns=1:nloop%仿真循环
oridata=randi([0 1],1,para*nd);
oridata_a=reshape(oridata,2,para*nd/2);
oridata_b=bi2de(oridata_a','left-msb')';
h=modem.pskmod(4);%设置qpsk调制
qpsk_data=modulate(h,oridata_b);
para_data=reshape(qpsk_data,para,nd/2);
ifft_data=ifft(para_data);
r_data=real(ifft_data);
i_data=imag(ifft_data);
r_data1=[r_data(para-para/4+1:para,:);r_data];%保护间隔一般不大于传送数据的四分之一
i_data1=[r_data(para-para/4+1:para,:);i_data];
r_out=reshape(r_data1,1,(para+para/4)*nd/2);
i_out=reshape(i_data1,1,(para+para/4)*nd/2);
data=r_out+i_out.*1i;
rdata=awgn(data,SNR,'measured') ;%加入噪声
%rdata=awgn(data,SNR) ;%加入噪声
r_data2=real(rdata);%加噪后信号实部
i_data2=imag(rdata);
r_data3=reshape(r_data2,para+para/4,nd/2); %实部矩阵
i_data3=reshape(i_data2,para+para/4,nd/2); %同上
r_data4=r_data3(para/4+1:para+para/4,:); %去实部保护间隔
i_data4=i_data3(para/4+1:para+para/4,:); %同上
get_data=r_data4+i_data4*1i;
fft_data=fft(get_data);
iqpsk_data=reshape(fft_data,1,para*nd/2);
h1 = modem.pskdemod(4);
f_data=demodulate(h1,iqpsk_data);
demodata=de2bi(f_data,'left-msb')';
demodata1=reshape(demodata,1,para*nd);
noe2=sum(abs(demodata1-oridata));
nod2=length(oridata);
noe=noe+noe2; %循环仿真
nod=nod+nod2; %同上
end
ber(1,SNR)= noe/nod; %误码率
snr(1,SNR)=SNR; %信噪比
scatterplot(iqpsk_data);
end
close(h2);
semilogy(snr,ber,'-*'); %画图
grid on;
xlabel('SNR');
ylabel('BER');
title('Performance of OFDM under the channel AWGN')