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

Ivan55

Участник
  • Публикаций

    212
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Ivan55

  • Звание
    Местный

Контакты

  • Сайт
    http://
  • ICQ
    0
  1. Я умножал на Nfft/sqrt(nCar) собственно вы про это и говорите, но амплитуда для qpsk получилась если брать по модулю то от нуля до четырёх, для более высоких уровней модуляции соответственно выше, например кам-64 там от нуля где-то до семнадцати... Должен быть ещё коэфициентикнормировки для модуляции, попробовал функцию modnorm(qam, 'avpow',1) получил от нуля до 2-3 не зависимо от уровня модуляции
  2. Всем привет, есть вопрос Формирую офдм сигнал случайный поток данных модулирую например qpsk, расставляю поднесущие и делаю обратное фурье. Получаю что модуль амплитуды офдм сигнала во временной области очень маленький, а хотелось бы его иметь от нуля до единицы. На что нужно пронормировать? Должен быть какой-то коэффициент зависящий от количества поднесущих и уровня модуляции
  3. Синхронизация OFDM

    Добрый день! Есть вот такой вот алгоритм DDECS06_poster_A4.pdf объясните для чего нужен пункт 3.5. на что он влияет? на чем отразится его исключение из алгоритма?
  4. MMSE equalizer OFDM

    Добрый день! Подскажите откуда брать кореляционную матрицу канала(ну или импульсную характеристику) и дисперсию шума для реализации данного метода может у кого нибудь есть кусочек кода по оценке данных параметров?
  5. Цитата(Tpeck @ Apr 5 2018, 11:59) Не удачное соотношение частот. Там только две точки получается (постоянка и значение частоты), а остальные нули. А Log от нуля, плохо выглядит Вы правы кажись начинаю догонять)))
  6. Доброго времени суток! Написал простую программу которая генерит синус косинус и переводит в fixedpoin строю спектр синуса косинуса в плавающей точке все класно спектры совпадают все красиво строю спектры синуса косинуса в fixedpoint: во первых он не строит, ругается на fixedpoint, это ладно... перевожу в double ругаться перестает, но спектр все равно не строит, выдает нули не понятно... убираю с конца два отсчета и тогда он строит спектр... че к чему, не понятно... при этом сами спектры не такие какие должны быть, во первых спектры синуса и косинуса почемуто разные, во вторых полка шума не соответствует той которая должна быть при заданной разрядности, да и изменение разрядности на нее почемуто не влияет скорее всего это из за того что приходится выкидывать последние два отсчета, но если не выкидывать то спектр почемуто не строится Помогите разобраться буду благодарен CODEFclc = 500e6; NFFT = 2^15; Fout = 1000*Fclc/NFFT; % Частота выходного сигнала T = 1/Fclc; t1 = (1:NFFT)*T; x1 = cos(2*pi*Fout*t1); x2 = sin(2*pi*Fout*t1); xf1 = fi(x1, 1, 18, 16); xf2 = fi(x2, 1, 18, 16); figure(1) periodogram(double(x1(1:end))); figure(2) periodogram(double(xf1(1:end-2)));
  7. Добрый день! Помогите найти ошибку если кто знает https://electronix.ru/forum/index.php?showtopic=145929 тему создал в другой ветке Заранее спасибо
  8. Добрый день! Написал модулятор, написал тест к нему все работает перевел на фиксид поинт но он почему то не работает переводил автоматически через fixed point convert вот исходники [attachment=111244:New_Folder__1_.rar] там в тесте signal_mod1 = quadr(signal, fc, t); signal_mod2 = quadr_wrapper_fixpt(signal,fc,t); соответственно модулятор с плаввающей точкой и на fixed point
  9. Препод всетаки уперся и хочет чтоб было без double A = int32(randi(1000,5,5)); D = double(A); B = inv(D); Но блин я даже не знаю что делать матлаб ругаетя на все на det на lu Что делать? как найти обратную?
  10. Цитата(blackfin @ Dec 9 2017, 18:29) Дождаться, когда MATLAB начнет поддерживать инструкции AVX-512, ну и купить правильный процессор.. улыбнуло ну а если серьезно то я толком ничего не нашел кроме алгоритма Штрассена, но его видимо надо реализовывыть на С++ и подключать к матлабу как MEX с чем я слабо знаком, может есть еще варианты менее извратные чем описал я и вы)))
  11. Цитата(blackfin @ Dec 9 2017, 17:48) Преобразовать в double, найти обратную, масштабировать, преобразовать в int? То есть: A = randi(1000,5,5); D = double(A); B = inv(D); Кстати, элементы матрицы В будут очень очень малыми числами, так что смысл подобных вычислений весьма загадочен. впринципе вариант) спасибо смысл действительно загадочен... есть еще более загадочный вопрос))) как ускорить вычисление произведения матриц большой размерности в матлаб, так чтобы это выполнялось быстрее чем просто А*В
  12. Цитата(blackfin @ Dec 9 2017, 17:20) B = 1.0/A; умножте B на А вы не получите единичную матрицу, а это значит что В не обратная к А Вы получите матрицу состоящую из единиц да и вообще если опустить пока проблему с int32 и запустить вот такой код CODEA = randi(10, 5, 5); B = inv(A); E = A.*B; то у меня в результате почемуто не получается Е = [1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1] Цитата(Ivan55 @ Dec 9 2017, 17:27) CODEA = randi(10, 5, 5); B = inv(A); E = A.*B; то у меня в результате почемуто не получается Е = [1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1] извиняюсь точка не нужна тогда все норм CODEA = randi(10, 5, 5); B = inv(A); E = A*B; В итоге Е - единичная матрица Остается вопрос что делать когда матрица задана в формате int32
  13. Добрый вечер! Есть проблема матлаб выдает ошибку при поиске обратной матрицы заданной в формате int32 CODEA = int32(randi(1000, 2000, 2000)); % Ищем обратную матрицу B = inv(A); Ошибка: Undefined function 'inv' for input arguments of type 'int32'. Error in InversMatrix (line 6) B = inv(A); Что можно сделать? как это обойти?
  14. Синхронизация Park

    Цитата(KalashKS @ Jul 14 2017, 14:32) Уберите защитный интервал из обучающей оследовательности. Он вам дает лишний пик в метрике. При ее использовании для обнаружения он будет мешаться. да я в курсе. Но без защитного интервала там вобще два побочных пика получается Вот в статье Парка[attachment=108002:10.1109_...3.812181.pdf] у него тоже этот пик тока с другой стороны, видимо потому что суммирование в другом порядке делал отсюда я и предположил что префикс нужен А в жизни преамбулы разве без защитного передают?
  15. Синхронизация Park

    Если быть точнее то я щас делаю вот, так CODEclear all; clc; close all; flTimeShift = 1; % 1 - с уходом времени; 0 - без ухода времени flChann = 0; % 1 - с каналом; 0 - без канала %choose SNR level in dB SNR=-5:10; %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 = 500; %frequency offset nSTOs=50; CFO=0.4; Fs = 11.2e6; % Частота дискретизации сигнала Tofdm = Nofdm/Fs; % Длительность OFDM сигнала в сек ppm = 50*10^-6; % Стабильность тактового гененратора Nppm = Fs*ppm; % Уход в отсчетах в сек %% Канал 1 % PathDelays = [0 50e-9 110e-9 170e-9 290e-9 310e-9]; % задержки лучей % U = [0 -3 -10 -18 -26 -32]; % Fd= [4.6 23 139]; % Доплеровское смещение в Гц %% Канал 2 % PathDelays = [0 110e-9 190e-9 410e-9]; % задержки лучей % U = [0 -9.7 -19.2 -22.8]; % Fd= [4.6 23 139]; % Доплеровское смещение в Гц %% Канал 3 PathDelays = [0 310e-9 710e-9 1090e-9 1730e-9 2510e-9]; % задержки лучей U = [0 -1.0 -9.0 -10.0 -15.0 -20.0]; Fd= [4.6 23 139]; % Доплеровское смещение в Гц %% preamble Minn 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_GI=[tx_signal_noGI(1,N_FFT-N_GI+1:N_FFT) tx_signal_noGI]; tx_signal=repmat(tx_signal_GI,1,Nsym); %% Модель канала OutChan = complex(zeros(Nsym*N_FFT,1),zeros(Nsym*N_FFT,1)); rand('seed',0); if flChann == 1 tic %T = [0 PathDelays(OptChan)]; %U = [0 0]; T = PathDelays; chan = rayleighchan(1/Fs,Fd(3)/2,T,U); chan.DopplerSpectrum=doppler.ajakes; %flat ajakes chan.ResetBeforeFiltering=0; OutChan=filter(chan,tx_signal); t = toc; fprintf('Сигнал искажен каналом...\n Время выполнения %4.2f секунд\n', t); else OutChan = tx_signal; end %% Добавление смещение частоты и времени tic; delay(1,1) = Nppm*Tofdm; L = Nofdm; for n = 2:Nsym delay(1,n) = delay(1,n-1) + Nppm*Tofdm; int_delay = fix(delay); fract_delay = delay - int_delay; end MaxDelay = fix(max(int_delay)); OutChan(1,end:end+MaxDelay) = 0; buff_delay = complex(zeros(1, 2*L), zeros(1, 2*L)); if flTimeShift == 1 for n = 1:Nsym buff_delay = circshift(buff_delay, [0 -(L+int_delay(1,n))]); buff_delay(1,L-int_delay(1,n)+1:end) = OutChan(1,(n-1)*L+1:n*L+int_delay(1,n)); re_buff_delay = sig_delay(real(buff_delay),1/Fs,fract_delay(1,n)/Fs); im_buff_delay = sig_delay(imag(buff_delay),1/Fs,fract_delay(1,n)/Fs); buff_delay = re_buff_delay + 1i*im_buff_delay; y_STO(1,(n-1)*L+1:n*L) = buff_delay(1,L+1:2*L); end else y_STO = OutChan; end if nSTOs>=0, y_STO=[y_STO(1,nSTOs+1:end) zeros(1,nSTOs)]; else y_STO=[zeros(1,-nSTOs) y_STO(1,1:end+nSTOs)]; end nn=0:length(y_STO)-1; y_CFO_STO = y_STO.*exp(1i*2*pi*CFO*nn/N_FFT); t = toc; fprintf('Осуществлен сдвиг времени и частоты сигнала...\n Время выполнения %4.2f секунд\n', t); %% buff = []; for k = 1:length(SNR) recvd_signal=awgn(y_CFO_STO, SNR(k), 'measured', 'dB'); for n = 1:Nsym %% Len_all=N_FFT; % recvd_signal_zeropad=[zeros(1,Len_all) recvd_signal(1,(n-1)*Nofdm+1:n*Nofdm) zeros(1,Len_all) zeros(1,Len_all)]; for d=1:length(recvd_signal_zeropad)-Len_all-1 P_Park(d)=sum(recvd_signal_zeropad(d+(1:N_FFT/2)).*fliplr(recvd_signal_zeropad(d+N_FFT/2+(1:N_FFT/2)))); %fliplr E_Park(d)=sum(abs(recvd_signal_zeropad(d+(1:N_FFT))).^2); Q_Park(d)=sum(conj(recvd_signal_zeropad(d+(1:N_FFT/2))).*fliplr(recvd_signal_zeropad(d+N_FFT/2+(1:N_FFT/2)))); end Park_metric=(abs(P_Park).^2)./(E_Park).^2; buff = [buff Park_metric]; plot(Park_metric/max(Park_metric)) [~, maxipos1]=max(Park_metric-N_GI); t_est_Park(1,n)=Nofdm - maxipos1; FreqOffset(1,n) = angle(Q_Park(maxipos1-N_GI))/pi; end mse_CFO(k) = sqrt(sum(abs(FreqOffset - CFO).^2)/Nsym) if flTimeShift == 1 mse_STO(k) = sqrt(sum(abs(diff(t_est_Park - nSTOs) - diff(int_delay(1,)).^2)/Nsym) % else mse_STO(k) = sqrt(sum(abs(t_est_Park - nSTOs).^2)/Nsym) end end CODEfunction sig_d = sig_delay(sig,T,dt) % Задержка сигнала по времени % sig - отсчеты сигнала %T - шаг дискретизации %dt - задержка по времени %sig_d - задержанный сигнал if dt==0 sig_d=sig; return end N=numel(sig); sig_d(1:N)=0; a=fix(dt/T); b=dt/T-a; x=-b; y0=0;y1=0;y2=0;y3=0; for m=1:N if m-a-2>0 y0=sig(m-a-2); end if m-a-1>0 y1=sig(m-a-1); end if m-a>0 y2=sig(m-a); end if (m-a+1>0)&&(m-a+1<=N) y3=sig(m-a+1); end a3=(y3-y0)/6+(y1-y2)/2; a1=(y3-y1)/2-a3; a2=y3-y2-a1-a3; a0=y2; sig_d(m)=((a3*x+a2)*x+a1)*x+a0; end end но чет у меня какие-то сомнения в адекватности модели