作者wallace061 (煩阿)
看板comm_and_RF
標題[問題] OFDM同步
時間Fri Jul 21 13:53:03 2006
請問各位大大...有沒有人有模擬過下面這篇paper...
J.J. van de Beek, M. Sandell and P. O. Borjesson,
“ML estimation of time and frequency offset in OFDM systems,”
IEEE Trans. Signal Processing, vol. 45, no. 7, pp. 1800-1805, July 1997.
我在寫程式時把雜訊和頻率偏移都設為0...可是估測出來還是有錯誤...
可是找了半天也找不出錯誤...可不可以請有寫過的大大幫我找一下錯誤...
下面是我的程式碼...
clear;
clc;
format long g
N=256; % The size of an OFDM symbol
CP=15; % Cyclic prefix interval
timer=100;%10^6; % Per SNR runs times
packetnum=3;
snr_db=0:10; % SNR range
MSE_ML=zeros(1,length(snr_db)); % Mean-square error in ML algorithm
MSE_NA=zeros(1,length(snr_db)); % Mean-square error in new algorithm
freq_offset=0;%0.25; % frequency offset
range=(N/2)+CP+1:(N)+(N/2)+(2*CP); % Observation interval
Pos=(N/2); % The actual symbol timing in observation interval
for snr=1:length(snr_db)
for ttt=1:timer
%%% TX %%%
clear data_tx;
clear out_ifft;
clear ps_out;
data_tx=sign(unidrnd(2,packetnum,N)-1.5); % BPSK signal generator
out_ifft(1,:)=sqrt(N)*ifft(data_tx(1,:));
out_ifft(2,:)=sqrt(N)*ifft(data_tx(2,:));
out_ifft(3,:)=sqrt(N)*ifft(data_tx(3,:));
ps_out=[out_ifft(1,N-CP+1:N),out_ifft(1,:),out_ifft(2,N-CP+1:N),
out_ifft(2,:),out_ifft(3,N-CP+1:N),out_ifft(3,:)]; % Transmitted signal
%%% Channel %%%
clear tx_power;
clear noise_std;
clear rx1;
clear noise;
tx_power=sum(ps_out.*conj(ps_out))/length(ps_out); % transmitted power
noise_std=sqrt(tx_power/(2*10^(snr_db(snr)/10))); % noise standard deviation
%%% Frequency offset %%%
rx1=ps_out;
noise=noise_std*(randn(1,length(rx1))+(j*randn(1,length(rx1))));
clear freq_time;
clear rx;
freq_time=1:length(rx1);
rx=rx1.*exp(j*((2*pi*freq_offset*mod(freq_time,N+CP))/N));%+noise; % Received signal
LO=snr/(snr+1);
%%% RX %%%
clear symboltiming;
clear NL;
clear Distance;
[NL]=NewAlgorithm(N,CP,rx,snr);
[rrr,symboltiming]=max(NL(range));
a(snr,ttt)=symboltiming;
Distance=abs(Pos-symboltiming);
MSE_NA(snr)=MSE_NA(snr)+Distance^2;
clear SymbolTiming;
clear RL;
clear Dis;
[RL]=ML(N,CP,rx,snr);
[ggg,SymbolTiming]=max(RL(range));
b(snr,ttt)=SymbolTiming;
Dis=abs(Pos-SymbolTiming);
MSE_ML(snr)=MSE_ML(snr)+Dis^2;
end
tim=round(clock);
snr_db(snr);
MSE_NA(snr)=MSE_NA(snr)/timer
MSE_ML(snr)=MSE_ML(snr)/timer
end
tim=round(clock)
figure
semilogy(snr_db,MSE_NA,'-g*',snr_db,MSE_ML,'-ro')
legend('NA(CP=15)','ML(CP=15)')
xlabel('SNR(dB)')
ylabel('Mean-squared error')
grid
======================================================
下面是NewAlgorithm 和 ML兩個function 的程式
function [refer_line]=NewAlgorithm(N,CP,rx,snr)
LO=snr/(snr+1);
for n=1:length(rx)-N-CP % time offset
r(n)=(1/(1+LO))*sum(conj(rx(n+(2*CP)+2:n+(N/2)+CP)).*
conj((rx(n+N:(-1):n+(N/2)+CP+2))))+
(1/(1+(2*LO)))*(sum(rx(n+1:n+CP).*conj(rx(n+N+1:n+N+CP)))+
sum(conj(rx(n+CP+2:n+(2*CP)+1)).*conj(rx(n+N+CP:(-1):n+N+1))));
IO1(n)=sum(abs(rx(n+(2*CP)+2:n+(N/2)+CP)).^2)+
sum(abs(rx(n+(N/2)+CP+2:n+N)).^2);
r1(n)=real(1/(1+(2*LO))*sum(conj(rx(n+1:n+CP)).*
conj(rx(n+(2*CP)+1:(-1):n+CP+2))));
IO2(n)=sum(abs(rx(n+1:n+CP)).^2)+sum(abs(rx(n+CP+2:n+(2*CP)+1)).^2)+
sum(abs(rx(n+N+1:n+N+CP)).^2);
refer_line=abs(r(n))+r1(n)-((LO/(2*(1+LO)))*IO1(n))-
((LO/(1+(2*LO)))*IO2(n));
end
function [refer_line]=ML(N,CP,rx,snr)
LO=snr/(snr+1);
for n=1:(length(rx)-N-CP)
R(n)=sum(rx(n+1:n+CP).*conj(rx(n+N+1:n+N+CP)));
IO(n)=(1/2)*(sum(abs(rx(n+1:n+CP)).^2)+sum(abs(rx(n+N+1:n+N+CP)).^2));
refer_line=abs(R(n))-(LO*IO(n));
end
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.22.16.42
1F:→ sexyman:找錯應該要自己來吧, 不會找錯怎麼寫程式 59.112.6.205 07/22 23:36
2F:推 JamesHone:你可以一個個function block來測試140.118.122.148 08/02 17:50
3F:→ JamesHone:測完一個接上另外一個,這是最快的方式了140.118.122.148 08/02 17:52
4F:→ JamesHone:要把debug學會,求人不如求己!!140.118.122.148 08/02 17:54