Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхра по методу Park
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Ivan55
Добрый день! Кто знаком с синхрой ОФДМ по тренировочной последовательности Park?

Я написал код но он выдает ерунду, в графике метрики нету явно выраженного пика, как по теории... подскажите что я делаю не так
CODE
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;
quato_a
Как я понимаю, маппером должена быть сформировна преамбула в частотной области с наличием только четных поднесущих. Таким образом, после ifft во временой области получим символ с 2-мя повторяющимися частями [A B A B]. Затем уже преобразовать его в [A B -B* A*].
KalashKS
CODE
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;
Ivan55
Цитата(KalashKS @ Nov 2 2016, 11:45) *
CODE
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
Добрый день всем! Подскажите пожалуйста как правильно измерить СКО оценки в многолучевом канале? например двух лучевом
KalashKS
Цитата(Ivan55 @ Nov 23 2016, 11:03) *
Добрый день всем! Подскажите пожалуйста как правильно измерить СКО оценки в многолучевом канале? например двух лучевой

СКО оценки чего, если не секрет?
Ivan55
Цитата(KalashKS @ Nov 23 2016, 11:11) *
СКО оценки чего, если не секрет?

СКО оценки начала OFDM символа, т.е. временная синхра, нужно оценить ее эффективность в многолучевом канале
KalashKS
Если оценивать только моделированием, то нужно обеспечить достаточный набор реализаций, чтобы учесть случайный характер канала.
Если нужна аналитическая оценка, то точно не подскажу. Можно попробовать оценить СКО для канала с АГБШ, а потом доучесть помехи по боковым лепесткам от побочных пиков как дополнительную дисперсию шума.
Ivan55
Цитата(KalashKS @ Nov 23 2016, 12:38) *
а потом доучесть помехи по боковым лепесткам от побочных пиков как дополнительную дисперсию шума.

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

к примеру у нас есть два луча сигнал переходит с луча на луч и время начала символа соответсвено скачет в зависимости от того какой щас луч преобладает
Получается что измеряется СКО оценки+ СКО перехода с луча на луч, но ведь это не корректно... прием ведь мы ведем по тому лучу который щас преобладает
petrov
Цитата(Ivan55 @ Nov 23 2016, 13:01) *
к примеру у нас есть два луча сигнал переходит с луча на луч и время начала символа соответсвено скачет в зависимости от того какой щас луч преобладает
Получается что измеряется СКО оценки+ СКО перехода с луча на луч, но ведь это не корректно... прием ведь мы ведем по тому лучу который щас преобладает


Не ведём, не должно ничего скакать, канал никогда резко не меняется, никаких привязок к преобладающим лучам.
Ivan55
Цитата(petrov @ Nov 23 2016, 13:48) *
Не ведём, не должно ничего скакать, канал никогда резко не меняется, никаких привязок к преобладающим лучам.


ну да резко он не меняется, но вот максимум метрики меняется резко, т.е. в 2х лучевом метрика имеет два пика, по максимуму определяют начало символа, эти два пика медленно плавают по амплитуде и то один становится максимальным то другой... таким образом у меня максимум то 100 отсчет то 196 отсчет, СКО уже под сотню получается
плавности нету, например 100 101 102 ... и уплыл на 196
petrov
Цитата(Ivan55 @ Nov 23 2016, 13:53) *
ну да резко он не меняется, но вот максимум метрики меняется резко, т.е. в 2х лучевом метрика имеет два пика, по максимуму определяют начало символа, эти два пика медленно плавают по амплитуде и то один становится максимальным то другой... таким образом у меня максимум то 100 отсчет то 196 отсчет, СКО уже под сотню получается
плавности нету, например 100 101 102 ... и уплыл на 196


Синхра негодная. ИМХО
Ivan55
Цитата(petrov @ Nov 23 2016, 14:18) *
Синхра негодная. ИМХО

да все они не айс))))))))
petrov
Цитата(Ivan55 @ Nov 23 2016, 14:20) *
да все они не айс))))))))


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

вот мой код:
CODE
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) но правильного результата что то что это не дает
Ivan55
Цитата(Ivan55 @ Dec 14 2016, 19:18) *
кто знает как в методе Parka правильно делается оценка сдвига частоты

вот мой код:
CODE
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) но правильного результата что то что это не дает


Разобрался) всем спасибо!))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.