ofdm解调算法_OFDM系统中固定频偏算法
加入固定頻偏:
function berMatrix = freqOffsetOFDM(BPS,NS,M,SNR,ifftsize,carriers,N,ep)
%標(biāo)準(zhǔn)OFDM系統(tǒng)
input_bit_stream= sign(randn(1,BPS*NS));
input_bit_stream(input_bit_stream== -1)=0;
parallel_data = StoP(input_bit_stream ,M);% 串并轉(zhuǎn)換
%QAM調(diào)制
modulated_data =qammod(parallel_data,M);
berMatrix = zeros(size(SNR));
for m=1:length( SNR) %信噪比變量
k = 1 ;
for n = 1 : NS%OFDM信號序數(shù)變量
ofdm_symbol = zeros(1 ,ifftsize);
ofdm_symbol(carriers) = modulated_data(k: k+N-1); %各子信道加載數(shù)據(jù)
%IFFT轉(zhuǎn)換成時域信號
tx_signal = ifft(ofdm_symbol ,ifftsize);
%信道
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%加入頻域頻移
rx_signal = tx_signal.*exp((2*1i*pi*ep/ifftsize).*(0:ifftsize-1));
%加入噪聲
rx_signal=awgn(rx_signal,SNR(m),'measured');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
received_ofdm = fft(rx_signal, ifftsize); %FFT轉(zhuǎn)換成各自通道數(shù)據(jù)
received_symbols(k:k+N-1) = received_ofdm(carriers); %去掉循環(huán)前綴
k = k +N ;
end %OFDM信號序數(shù)變量結(jié)束
%received_symbols:接收端FFT后得到的各子通道的復(fù)數(shù)據(jù),
% 直接畫得到星座圖
% %figure
% subplot(1,4,ll)
% plot(received_symbols,'*');
% axis([-log2(M),log2(M),-log2(M),log2(M)]);
% title(['epsilon=' num2str(ep)] );
%接收端對M進(jìn)制復(fù)數(shù)據(jù)解調(diào),得到M進(jìn)制碼元
received_data =qamdemod(received_symbols,M);
output_bit_stream = PtoS(received_data, M);%M進(jìn)制轉(zhuǎn)換為二進(jìn)制碼元
berMatrix(m)= sum(xor(input_bit_stream, output_bit_stream))/length(input_bit_stream);%計算誤碼率
end %信噪比變量結(jié)束對加頻偏信號進(jìn)行ICI自消除:
function berMatrix = freqOffsetOFDMICI(BPS,NS,M,SNR,ifftsize,carriers,N,ep)
%ICI自消除法
% Input Bit Stream is normally Distributed
input_bit_stream= sign(randn(1,BPS*NS));
input_bit_stream(input_bit_stream== -1)=0;
parallel_data = StoP(input_bit_stream ,M);
modulated_data =qammod(parallel_data,M);%QAM調(diào)制
%奇偶載波序列定義
odd_carriers = carriers(1:2: N-1);
even_carriers = carriers(2:2: N);
berMatrix = zeros(size(SNR));
for m=1:length(SNR) %信噪比變量
k = 1;
for n = 1:NS %OFDM信號序數(shù)變量
ofdm_symbol1 = zeros(1,ifftsize);
ofdm_symbol2 = zeros(1,ifftsize);
ofdm_symbol1(odd_carriers) = modulated_data(k: k+N/2-1);
ofdm_symbol1(even_carriers) = -modulated_data(k: k+N/2-1); %奇通道數(shù)據(jù)取反
ofdm_symbol2(odd_carriers) = modulated_data(k+N/2: k+N-1);
ofdm_symbol2(even_carriers) = -modulated_data(k+N/2:k+N-1); %奇通道數(shù)據(jù)取反
%發(fā)送端時域信號
tx_signal1 = (ifft(ofdm_symbol1,ifftsize));
tx_signal2 = (ifft(ofdm_symbol2,ifftsize));
%信道
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%加入頻移
rx_signal1 = tx_signal1.*exp(1i*pi*ep/ifftsize*(0:ifftsize-1));
rx_signal2 = tx_signal2.*exp(1i*pi*ep/ifftsize*(0:ifftsize-1));
%加入噪聲
rx_signal1 = awgn(rx_signal1, SNR(m),'measured');
rx_signal2 = awgn(rx_signal2, SNR(m),'measured');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 接收端FFT
received_ofdm1 = fft(rx_signal1, ifftsize);
received_ofdm2 = fft(rx_signal2, ifftsize);
demod_sym1 = .5*(received_ofdm1(odd_carriers)-received_ofdm1(even_carriers));%前半個OFDM信號
demod_sym2 = .5*(received_ofdm2(odd_carriers)-received_ofdm2(even_carriers));%后半個OFDM信號
received_ofdm3 = [demod_sym1 demod_sym2];
received_symbols(k:k+N-1) = received_ofdm3;
k = k + N;
end %OFDM信號序數(shù)變量結(jié)束
received_data =qamdemod(received_symbols,M);%接收端對M進(jìn)制復(fù)數(shù)據(jù)解調(diào),得到M進(jìn)制碼元
output_bit_stream = PtoS(received_data, M);%M進(jìn)制轉(zhuǎn)換為二進(jìn)制碼元
berMatrix(m)= sum(xor(input_bit_stream, output_bit_stream))/length(input_bit_stream); %計算誤碼率
end %信噪比變量結(jié)束極大似然估計法和改進(jìn)算法
function berMatrix = freqOffsetOFDMMSL(BPS,NS,M,SNR,ifftsize,carriers,N,ep,N_awgn)
%極大似然估計法和改進(jìn)算法
input_bit_stream= sign(randn(1,BPS*NS));
input_bit_stream(input_bit_stream== -1)=0;
parallel_data = StoP(input_bit_stream ,M);% 串并轉(zhuǎn)換
modulated_data =qammod(parallel_data,M);%QAM調(diào)制
berMatrix = zeros(size(SNR));
for m=1:length(SNR) %信噪比變量
%計算ep-SNR對應(yīng)的頻偏
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ofdm_symbol = zeros(1,ifftsize);
ofdm_symbol(carriers(1:N/2)) = modulated_data(1:N/2); %Use only half the data for MLE
tx_signal1 = ifft(ofdm_symbol,ifftsize/2); %對前一半通道的數(shù)據(jù)進(jìn)行ifft_size/2的IFFT
tx_signal = [tx_signal1,tx_signal1]; %復(fù)制前一半OFDM信號,形成一個完整的發(fā)送信號
%信道
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%加入頻移
rx_signal = tx_signal.*exp((2*1i*pi*ep/ifftsize).*(0:ifftsize-1));
%加入噪聲
%極大似然估計法:N_awgn=1;
%修正算法:N_awgn>1;
noise=0;
for n_awgn=1:N_awgn
%加入高斯白噪聲
noise=noise+awgn(rx_signal,SNR(m),'measured');
end
noise=noise/N_awgn;
rx_signal = rx_signal + noise;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%接收端對前后兩時域序列分別進(jìn)行FFT
received_ofdm1 = fft(rx_signal(1:ifftsize/2), ifftsize/2);
received_ofdm2 = fft(rx_signal((ifftsize/2)+1:ifftsize), ifftsize/2);
%對頻偏進(jìn)行極大似然估計
temp=0;temp1=0;
for w=1:length(ifftsize/2)
temp=temp + imag(received_ofdm2(w)*conj(received_ofdm1(w)));
temp1=temp1 + real(received_ofdm2(w)*conj(received_ofdm1(w)));
end
epestMLE(m) = (atan(temp/temp1))/(pi);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%完成ep-SNR對應(yīng)的頻偏估計
%以后接收到的OFDM信號直接用估計值校正
k = 1;
for n = 1:NS %OFDM信號序數(shù)變量
ofdm_symbol = zeros(1,ifftsize);
ofdm_symbol(carriers(1:N)) = modulated_data(k:k+N-1); %各子信道加載數(shù)據(jù)
tx_signal = ifft(ofdm_symbol,ifftsize);%IFFT轉(zhuǎn)換成時域信號
%信道
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rx_signal = tx_signal.*exp((2*1i*pi*ep/ifftsize).*(0:ifftsize-1));%加入頻域頻移
rx_signal=awgn(rx_signal,SNR(m),'measured');%加入噪聲
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用第一次估計出的頻偏進(jìn)行校正
received_ofdm = rx_signal.* exp((-2*1i*pi*epestMLE(m)/ifftsize)*(0:ifftsize-1));
car_data= fft(received_ofdm,ifftsize); %FFT轉(zhuǎn)換成各自通道數(shù)據(jù)
received_symbols(k:k+N-1)=car_data(carriers(1:N)); %去掉循環(huán)前綴
k = k + N;
end %OFDM信號序數(shù)變量結(jié)束
received_data =qamdemod(received_symbols,M);%接收端對M進(jìn)制復(fù)數(shù)據(jù)解調(diào),得到M進(jìn)制碼元
output_bit_stream = PtoS(received_data, M); %M進(jìn)制轉(zhuǎn)換為二進(jìn)制碼元
berMatrix(m)= sum(xor(input_bit_stream, output_bit_stream))/length(input_bit_stream); %計算誤碼率
end %信噪比變量結(jié)束M進(jìn)制轉(zhuǎn)換為二進(jìn)制碼元:
function y=PtoS(received_data, M)
%M進(jìn)制轉(zhuǎn)換為二進(jìn)制碼元
M=log2(M);
[m,n]=size(received_data);
y=zeros(1,M*n);
for k1=1: n
for k2=1: M
if(received_data(k1)>=2^(M-k2))
y(M*(k1-1)+k2)=1;
received_data(k1)=received_data(k1)-2^(M-k2);
else
y(M*(k1-1)+k2)=0;
end
end
end串并轉(zhuǎn)換:
function y=StoP(input_bit_stream ,M)
% 串并轉(zhuǎn)換
M=log2(M);
n=length(input_bit_stream);
y=zeros(1,n/M);
for k1=1: n/M
y(k1)=0;
for k2=1: M
y(k1)=y(k1)+input_bit_stream((k1-1)*M+k2)*2^(M-k2);
end
end調(diào)用函數(shù)的腳本程序如下:
clear
close all
clc
SNR=0:2:25; % 信噪比
NS = 1600; % NS:待傳送OFDM信號總個數(shù)
M = 8;% M:調(diào)制進(jìn)制
N = 60; % 子通道個數(shù)
BPS = N*log2(M); % 一個OFDM信號攜帶的比特數(shù)
carriers = (1:N ); % 子通道序數(shù)
ifftsize = 128; %FFT長度
%未加頻偏,未采用消除方法時
ep = 0 ;%歸一化頻偏
berMatrix_NOEP_Non = freqOffsetOFDM(BPS,NS,M,SNR,ifftsize,carriers,N,ep);
%加頻偏,未采用消除方法時
ep = 0.05;%歸一化頻偏
berMatrix_EP_Non = freqOffsetOFDM(BPS,NS,M,SNR,ifftsize,carriers,N,ep);
berMatrix_EP_ICI = freqOffsetOFDMICI(BPS,NS,M,SNR,ifftsize,carriers,N,ep);
N_awgn = 1;
berMatrix_EP_SL = freqOffsetOFDMMSL(BPS,NS,M,SNR,ifftsize,carriers,N,ep,N_awgn);
N_awgn = 10;
berMatrix_EP_MSL = freqOffsetOFDMMSL(BPS,NS,M,SNR,ifftsize,carriers,N,ep,N_awgn);
% 固定頻偏下,不同算法 誤碼率-信噪比曲線
figure
plot(SNR, berMatrix_NOEP_Non,'-k' )
hold on
plot(SNR, berMatrix_EP_Non ,'.-r')
plot(SNR, berMatrix_EP_ICI ,'--g')
plot(SNR, berMatrix_EP_SL ,'-m')
plot(SNR, berMatrix_EP_MSL ,'-c')
set(gca,'YScale','log')
legend('未加頻偏','無頻偏估計','加頻偏估計','SL','MSL');
grid on
xlabel( 'SNR(dB)')
ylabel('BER')
誤碼率-信噪比曲線
人工智能算法 信號處理 數(shù)值計算 通信系統(tǒng) 項目合作可私信
總結(jié)
以上是生活随笔為你收集整理的ofdm解调算法_OFDM系统中固定频偏算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openlayers地图旋转_OpenL
- 下一篇: 中国56个少数民族服饰图片及介绍,超级大