Перейти к содержанию
    

Добрый день! Кто знаком с синхрой ОФДМ по тренировочной последовательности Park?

 

Я написал код но он выдает ерунду, в графике метрики нету явно выраженного пика, как по теории... подскажите что я делаю не так

clear all; clc; close all;
%choose SNR level in dB
SNR=100;
%choose FFT length
N_FFT=1024;
%choose guard interval length as a percentage of N_FFT
NGI=1/4;
%choose number of used carriers
N_used=N_FFT/2;
N_GI=round(NGI*N_FFT);
N=N_FFT+N_GI;
Nsym = 100;
%frequency offset
nSTOs=-100;
CFO=0;

%% preamble Minn
B=4;
reS=(-1).^round(rand(1,round(N_FFT/B)));
imS=(-1).^round(rand(1,round(N_FFT/B)));
s1=reS+1i.*imS;
s2=fliplr(s1);
tx_signal_noGI=[s1 s2 conj(s1) conj(s2)];
%tx_signal=[tx_signal_noGI(:,N_FFT-N_GI+1:N_FFT) tx_signal_noGI];
tx_signal=tx_signal_noGI;
N=N_FFT+N_GI;
%% Time and frequency shift signal
if nSTOs>=0, y_STO=[tx_signal(1,nSTOs+1:end) zeros(1,nSTOs)];
else
   y_STO=[zeros(1,-nSTOs) tx_signal(1,1:end+nSTOs)]; 
end
nn=0:length(y_STO)-1; y_CFO_STO = y_STO.*exp(j*2*pi*CFO*nn/N_FFT);

%% AWGN channel
recvd_signal=awgn(y_CFO_STO, SNR, 'measured', 'dB');
%% Minn
Len_all=N_FFT; %N_FFT or length(recvd_signal);
recvd_signal_zeropad=[zeros(1,Len_all) recvd_signal zeros(1,Len_all) zeros(1,Len_all)];
for d=1:2*Len_all+Len_all/2+1,
   P_Park(d)=sum((recvd_signal_zeropad(d:d+Len_all/4)).*fliplr(recvd_signal_zeropad(d+Len_all/4:d+Len_all/2)));
   E_Park(d)=sum(abs(recvd_signal_zeropad(d:d+Len_all/2)).^2);
end;
Park_metric=(abs(P_Park).^2)./(E_Park).^2;
plot(Park_metric)
%timing estimation is
[~, maxipos1]=max(Park_metric);
t_est_Park=maxipos1-Len_all;

Изменено пользователем Ivan55

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понимаю, маппером должена быть сформировна преамбула в частотной области с наличием только четных поднесущих. Таким образом, после ifft во временой области получим символ с 2-мя повторяющимися частями [A B A B]. Затем уже преобразовать его в [A B -B* A*].

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for d=1:2*Len_all+Len_all/2+1,
P_Park(d)=sum(recvd_signal_zeropad(d+(1:Len_all/2)).*fliplr(recvd_signal_zeropad(d+Len_all/2+(1:Len_all/2))));
E_Park(d)=sum(abs(recvd_signal_zeropad(d+(1:Len_all))).^2);
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for d=1:2*Len_all+Len_all/2+1,
P_Park(d)=sum(recvd_signal_zeropad(d+(1:Len_all/2)).*fliplr(recvd_signal_zeropad(d+Len_all/2+(1:Len_all/2))));
E_Park(d)=sum(abs(recvd_signal_zeropad(d+(1:Len_all))).^2);
end;

Спасибо! Что то получилось) тока for d=1:2*Len_all+1 лишняя Len_all/2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день всем! Подскажите пожалуйста как правильно измерить СКО оценки в многолучевом канале? например двух лучевом

Изменено пользователем Ivan55

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день всем! Подскажите пожалуйста как правильно измерить СКО оценки в многолучевом канале? например двух лучевой

СКО оценки чего, если не секрет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

СКО оценки чего, если не секрет?

СКО оценки начала OFDM символа, т.е. временная синхра, нужно оценить ее эффективность в многолучевом канале

Изменено пользователем Ivan55

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если оценивать только моделированием, то нужно обеспечить достаточный набор реализаций, чтобы учесть случайный характер канала.

Если нужна аналитическая оценка, то точно не подскажу. Можно попробовать оценить СКО для канала с АГБШ, а потом доучесть помехи по боковым лепесткам от побочных пиков как дополнительную дисперсию шума.

Изменено пользователем KalashKS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а потом доучесть помехи по боковым лепесткам от побочных пиков как дополнительную дисперсию шума.

вот я тоже про это думаю, а как это сделать чет не соображу

 

к примеру у нас есть два луча сигнал переходит с луча на луч и время начала символа соответсвено скачет в зависимости от того какой щас луч преобладает

Получается что измеряется СКО оценки+ СКО перехода с луча на луч, но ведь это не корректно... прием ведь мы ведем по тому лучу который щас преобладает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

к примеру у нас есть два луча сигнал переходит с луча на луч и время начала символа соответсвено скачет в зависимости от того какой щас луч преобладает

Получается что измеряется СКО оценки+ СКО перехода с луча на луч, но ведь это не корректно... прием ведь мы ведем по тому лучу который щас преобладает

 

Не ведём, не должно ничего скакать, канал никогда резко не меняется, никаких привязок к преобладающим лучам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не ведём, не должно ничего скакать, канал никогда резко не меняется, никаких привязок к преобладающим лучам.

 

ну да резко он не меняется, но вот максимум метрики меняется резко, т.е. в 2х лучевом метрика имеет два пика, по максимуму определяют начало символа, эти два пика медленно плавают по амплитуде и то один становится максимальным то другой... таким образом у меня максимум то 100 отсчет то 196 отсчет, СКО уже под сотню получается

плавности нету, например 100 101 102 ... и уплыл на 196

Изменено пользователем Ivan55

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну да резко он не меняется, но вот максимум метрики меняется резко, т.е. в 2х лучевом метрика имеет два пика, по максимуму определяют начало символа, эти два пика медленно плавают по амплитуде и то один становится максимальным то другой... таким образом у меня максимум то 100 отсчет то 196 отсчет, СКО уже под сотню получается

плавности нету, например 100 101 102 ... и уплыл на 196

 

Синхра негодная. ИМХО

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да все они не айс))))))))

 

Берите центр масс, в многолучёвом канале нет смысла в какой-то точной синхронизации по какому-то лучу, важно чтобы не скакало и все наложения символов оставались в пределах циклического префикса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кто знает как в методе Parka правильно делается оценка сдвига частоты

 

вот мой код:

clear all; clc; close all;

%choose SNR level in dB
SNR=50:50;
%choose FFT length
N_FFT=1024;
%choose guard interval length as a percentage of N_FFT
NGI=1/4;
%choose number of used carriers
N_used=N_FFT/2;
N_GI=round(NGI*N_FFT);
Nofdm=N_FFT+N_GI;
Nsym = 100;
%frequency offset
nSTOs=0;
CFO=0.4;

%% preamble Park
B=2;
reS=(-1).^round(rand(1,round(N_used/B)));
imS=1i.*(-1).^round(rand(1,round(N_used/B)));
s1=reS+imS;
s2=fliplr(s1);
tx_signal_noGI=[s1 s2 conj(s1) conj(s2)];
tx_signal = zeros(1,Nsym*N_FFT);
tx_signal=repmat(tx_signal_noGI,1,Nsym);

%%
if nSTOs>=0, y_STO=[tx_signal(1,nSTOs+1:end) zeros(1,nSTOs)]; 
else
   y_STO=[zeros(1,-nSTOs) tx_signal(1,1:end+nSTOs)];
end

nn=0:length(y_STO)-1; y_CFO_STO = y_STO.*exp(1i*2*pi*CFO*nn/N_FFT);

%% AWGN channel
for k = 1:length(SNR)
recvd_signal=awgn(y_CFO_STO, SNR(k), 'measured', 'dB');
for n = 1:Nsym
%% Minn
Len_all=N_FFT; %N_FFT or length(recvd_signal);
recvd_signal_zeropad=[zeros(1,Len_all) recvd_signal(1,(n-1)*Len_all+1:n*Len_all) zeros(1,Len_all) zeros(1,Len_all)];
for d=1:2*Len_all+1
   P_Park(d)=sum(recvd_signal_zeropad(d+(1:Len_all/2)).*fliplr(recvd_signal_zeropad(d+Len_all/2+(1:Len_all/2))));
   E_Park(d)=sum(abs(recvd_signal_zeropad(d+(1:Len_all))).^2);
   Q_Park(d)=sum(conj(recvd_signal_zeropad(d+(1:Len_all/2))).*(recvd_signal_zeropad(d+Len_all/2+(1:Len_all/2))));
end
Park_metric=(abs(P_Park).^2)./(E_Park).^2;
plot(Park_metric/max(Park_metric))
%timing estimation is
[~, maxipos1]=max(Park_metric);
t_est_Park(1,n)=Len_all - maxipos1;
FreqOffset = angle(Q_Park(maxipos1))/pi;
end
end

 

считается корреляция

Q_Park(d)=sum(conj(recvd_signal_zeropad(d+(1:Len_all/2))).*(recvd_signal_zeropad(d+Len_all/2+(1:Len_all/2))));

 

и берется фаза в точке максимума Park_metric=(abs(P_Park).^2)./(E_Park).^2; следующим образом FreqOffset = angle(Q_Park(maxipos1))/pi;

но выдает почему то ерунду, фаза по всем точка и близко не подходит под заданное CFO=0.4;

 

причем в формуле Q_Park(d) в разных источниках пишут по разному то (1:Len_all/2) там то (1:Len_all/4) но правильного результата что то что это не дает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...