⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_bpsk.asv

📁 ofdm系统模型
💻 ASV
字号:
clear all;
clc;

% ****************************initialize the parametres*********************************

Bit_Num=1;  %每个符号比特数
IFFT_Num=256; %采样点数
Carrier_Num=150; %子载波数
OFDM_per_Symbol=50; %每帧OFDM信号含有的OFDM信号的个数
SNR_N=20; %信噪比间隔
SNR_Bit=50; %每比特信噪比
GI=20; %保护间隔长度
LI=5 ; %导频间隔
Np=ceil(Carrier_Num/LI)+1; %导频数    加1保证最后一行子载波中也有导频
Carriers=1:Carrier_Num+Np;
N_Num=Bit_Num*Carrier_Num*OFDM_per_Symbol;

% ***********************Generate the random binary stream for transmit test******
 
BitTx=randint(1,N_Num);

% ********************Modulate (generates 16QAM symbols)*****************

QAMTable=[1,-1];
SymQAM=QAMTable(BitTx+1);


%*******************Generate the pilot signal************
  
train_sym1=randint(1,2*OFDM_per_Symbol);
train_sym2=randint(1,2*OFDM_per_Symbol);
t=2*(train_sym1.*2-1)+(train_sym2.*2-1);
treal=t(1:2:2*OFDM_per_Symbol);
timage=t(2:2:2*OFDM_per_Symbol);
training_symbols1=treal+i.*timage;
training_symbols2=training_symbols1.';
training_symbols=repmat(training_symbols2,1,Np);

pilot=1:LI+1:Carrier_Num+Np;
if length(pilot)~=Np
    pilot=[pilot,Carrier_Num+Np];
end

% **********************P/S transform*********************

SymQAM1=reshape(SymQAM,Carrier_Num,OFDM_per_Symbol).';

% *******************Insert the pilot symbols****************

signal=1:Carrier_Num+Np;
signal(pilot)=[];
SymQAM2(:,pilot)=training_symbols;
SymQAM2(:,signal)=SymQAM1;
SymQAM3=SymQAM2.';

% **********************IFFT transform******************************

% Input:  SymQAM3(Carrier_Num+Np,OFDM_per_Symbol)    Output:  SymTx(1,(IFFT_Num+GI)*OFDM_per_Symbol)
SymIFFT=ifft(SymQAM3,IFFT_Num,1);
SymIFFT_test=ifft(SymQAM1.',IFFT_Num,1);

%加保护间隔(循环前缀)
SymTxtmp=zeros(IFFT_Num+GI,OFDM_per_Symbol);
SymTxtmp(1:GI,:)=SymIFFT(IFFT_Num-GI+1:IFFT_Num,:);
SymTxtmp(GI+1:GI+IFFT_Num,:)=SymIFFT;
SymTx=reshape(SymTxtmp,1,(IFFT_Num+GI)*OFDM_per_Symbol);

% *************************Channel*********************************

d=[2 3 4 5 9 13]; % 信道延迟
channel1=zeros(size(SymTx));
channel1(1+d(1):length(SymTx))=SymTx(1:length(SymTx)-d(1));
channel2=zeros(size(SymTx));
channel2(1+d(2):length(SymTx))=SymTx(1:length(SymTx)-d(2));
channel3=zeros(size(SymTx));
channel3(1+d(3):length(SymTx))=SymTx(1:length(SymTx)-d(3));
channel4=zeros(size(SymTx));
channel4(1+d(4):length(SymTx))=SymTx(1:length(SymTx)-d(4));
channel5=zeros(size(SymTx));
channel5(1+d(5):length(SymTx))=SymTx(1:length(SymTx)-d(5));
channel6=zeros(size(SymTx));
channel6(1+d(6):length(SymTx))=SymTx(1:length(SymTx)-d(6));

BER_plot=[];
for snr_db=SNR_Bit:-SNR_N:-SNR_Bit
%for snr_db=SNR_Bit:(-SNR_N):0 % ???????????????????????????????????????????倒序才可产生对应图  
%snr_db=20;
code_power=(norm(SymTx))^2/(length(SymTx));  %符号平均功率
bit_power=code_power/Bit_Num; %比特功率
noise_power=10*log10(bit_power/(10^(snr_db/10))); %噪声功率
noise=wgn(1,length(SymTx),noise_power,'complex'); %产生高斯白噪声信号
SymTx=SymTx+noise;

SymTxChannel=SymTx+channel1+channel2+channel3+channel4+channel5+channel6;

% ************************FFT  transform*********************************

%去保护间隔
SymRxtmp=reshape(SymTxChannel,IFFT_Num+GI,OFDM_per_Symbol);
SymRx=SymRxtmp(GI+1:GI+IFFT_Num,:);

SymFFT=fft(SymRx,IFFT_Num,1);
SymFFT=SymFFT(1:Carrier_Num+Np,:);

figure(2)
plot(SymFFT,'x');
axis([-5 5 -5 5]);

%************************Channel Estimation*****************************

HLs=ChannelEstimate(SymFFT,OFDM_per_Symbol,Np,training_symbols,Carrier_Num,LI,pilot);

SymFFT1=SymFFT.';
SymFFT2=SymFFT1(:,signal);
SymFFT3=SymFFT2./HLs;
SymFFT=SymFFT3.';

figure(snr_db+5+3)
plot(SymFFT,'x');
axis([-5 5 -5 5]);

% ***********************Demodulate ***************************************

SymDeQAM=[];
SymFFT=real(SymFFT);
for m=1:N_Num
    if SymFFT(m)>0
        SymDeQAM(m)=0;
    else SymDeQAM(m)=1;
    end
end

%***********************Error detection************************************

Error_Num=length(find(BitTx~=SymDeQAM));
BER=Error_Num./(4*N_Num);
fprintf('\n SNR is %1.2f dB ,BER is %e\n',snr_db,BER);
BER_plot=[BER_plot,BER];
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -