|
|
  |
BPSK матлаб модулятор демодулятор |
|
|
|
Mar 26 2018, 19:54
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(petrov @ Mar 26 2018, 22:15)  Далее вся обработка осуществляется на нулевой частоте, в комплексном виде, с малым количеством отсчётов на символьный интервал. Да. Где-то я это понимаю. В частности про малое количество отсчетов. Но тем не менее для моделирования должна сложиться четкая картинка компонентов и их соединения. Схема Костаса эту картинку дает. Цитата всё равно никакого Костаса у вас не будет в итоге, потому что ФАПЧ медленно настраивается. Как-же тогда быть? Никакой другой схемы кроме Костаса пока не встречал...
Сообщение отредактировал Acvarif - Mar 27 2018, 04:44
|
|
|
|
|
Mar 27 2018, 07:41
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Если посчитать за какое время сработает петля Костаса, например, при доплере 150 Гц (в воде это движение ~2 м/сек) (несущая 100 кГц) то получится, что для полной синхронизации потребуется время равное 150 символам (битам). Это если шаг изменения частоты NCO будет 1 Гц. 150 бит это ~18 байт преамбулы. Если длительность одного символа 4 периода несущей то это 40 мкс. Всего 150*40 = 6000 мкс. Тоесть полная подстройка произойдет за 6 мс. Это вполне нормально. Но в реальности наверняка шаг подстройки будет меньше чем 1 Гц, например 0.5 Гц. Ну тогда полная синхронизация наступит через 12 мс. Тоже вроде неплохо. Далее пойдет синхросимвол и данные. Для случая с несущей в 100 кГц вроде неплохо. Цитата(petrov @ Mar 27 2018, 09:54)  Можно почитать для начала RF Architectures and Digital Signal Processing Aspects of Digital Wireless Transceivers - Nezami. Уже читаю. Глава 5. Думаю для начала всеравно нужно построить петлю Костаса. Приступать сразу к FeedForward наверное неправильно. Ведь так?
|
|
|
|
|
Mar 27 2018, 07:47
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(ataradov @ Mar 27 2018, 10:43)  VCO получает сигал ошибки в качестве контрольного, зачем перестраивать фиксированным шагом? Вам и предлагают ПИ звено поставить чтобы шаг сам нашелся какой нужно для оптимальной настройки. Об этом постоянно думаю. В смысле о самонастраиваемом шаге. Что такое ПИ звено?
Сообщение отредактировал Acvarif - Mar 27 2018, 07:48
|
|
|
|
|
Mar 27 2018, 12:03
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(petrov @ Mar 27 2018, 11:21)  Это ещё месяц назад надо было сделать, в симулинке изучить все возможные воздействия и сочетания параметров, непонятно чего тянете, стройте уже. Такими темпами и 5 лет не хватит, на то, что на самом деле надо сделать для вашей задачи. Ok. Попробую. В простейшем виде. Сформировал BPSK сигнал
Я так понимаю сигнал необходимо оцифровать для того, чтобы потом умножать на сигнал формируемый Discrete-Time VCO. Сделал примерно так
Ход верный или ерунда? На FPGA я делал-бы именно так...
|
|
|
|
|
Mar 27 2018, 12:19
|
Гуру
     
Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937

|
Цитата(Acvarif @ Mar 27 2018, 15:03)  Ok. Попробую. В простейшем виде. Сформировал BPSK сигнал
Я так понимаю сигнал необходимо оцифровать для того, чтобы потом умножать на сигнал формируемый Discrete-Time VCO. Сделал примерно так
Ход верный или ерунда? На FPGA я делал-бы именно так... Не нужно моделировать сигнал на несущей, этим вы только замедляете модель, увеличивая количество отсчётов, необходимое для представления сигнала на несущей. Ни о какой оцифровке на данном этапе думать не нужно, и про FPGA тоже. Работайте с комплексными сигналами. В общем примеры я выкладывал, смотрите как там сделано.
|
|
|
|
|
Mar 28 2018, 05:33
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(petrov @ Mar 27 2018, 15:19)  Не нужно моделировать сигнал на несущей, этим вы только замедляете модель, увеличивая количество отсчётов, необходимое для представления сигнала на несущей. Ни о какой оцифровке на данном этапе думать не нужно, и про FPGA тоже. Работайте с комплексными сигналами. В общем примеры я выкладывал, смотрите как там сделано. Рад-бы. Но мой уровень симулинк не позволяет сходу это сделать. Ваш пример для меня сложен. А примеры имеющиеся в сети на мой взгляд бестолковые. Их даже в качестве рыбы нельзя использовать. Оторванные от реального железа. Поскольку в симулинк я вообще не умею работать то он вызывает некоторое отторжение. Петлю ФАПЧ попробую сделать в классическом матлабе. CODE %% BPSK модель % Количество бит данных N = 4; % Данные data = [1 0 1 0]; %data = randi(1,N); pData = data*2 - 1; % Несущая частота (100 кГц) fn= 100000; % частота выборок fns = fn*10; % Период выборки Tns = 1/fns; % Период несущей Tn = 1/fn; % Количество периодов несущей на бит-символ M = 4; % Длина пакета данных n = M*length(data); % Текущее время tn = 0:Tns:n*Tn; % Несущая в пакете car = sin(2*pi*fn*tn);
%% Преобразование данных в прямоугольные импульсы tpn = 0:Tns:Tn*M; exdata = []; for (i = 1:length(data)) for(j = 1:length(tpn) - 1) exdata = [exdata pData(i)]; end end exdata = [exdata 0];
%% Модуляция % Перенос exdata на несущую mSig = exdata.*car; Теория говорит, что mSig по сути комплексный сигнал. Но в демодуляторе нужно использовать только реальную его часть, которую затем в петле ФАПЧ нужно умножать на комплексную экспоненту. Какой выглядит в коде реальная часть mSig?
|
|
|
|
|
Mar 30 2018, 05:13
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Не получается. Пытаюсь сформировать синфазную и квадратурную составляющую модулирующего сигнала. CODE %% BPSK модель % Количество бит данных N = 4; % Данные data = [1 0 1 0]; %data = randi(1,N); pData = data*2 - 1; % Несущая частота (100 кГц) fn = 100000; % Доплер fd = 100; % частота выборок fns = fn*8; % Период выборки Tns = 1/fns; % Период несущей Tn = 1/fn; % Количество периодов несущей на бит-символ M = 4; % Длина пакета данных n = M*length(data); % Текущее время tn = 0:Tns:n*Tn; % Несущая в пакете car_sin = sin(2*pi*fn*tn); car_cos = cos(2*pi*fn*tn);
%% Преобразование данных в прямоугольные импульсы tpn_i = 0:Tns:Tn*M; exdata_i = []; for (i = 1:length(data)) for(j = 1:length(tpn_i) - 1) exdata_i = [exdata_i pData(i)]; end end exdata_i = [exdata_i 0];
tpn_q = 0:Tns:Tn*M; exdata_q = []; for (i = 1:length(data)) for(j = 1:length(tpn_q) - 1) % exdata_q = [exdata_q pData(i)]; if (length(tpn_q) == 17) exdata_q = [exdata_q 1]; else exdata_q = [exdata_q -1]; end end
end exdata_q = [exdata_q 0];
%% Модуляция % Перенос exdata на несущую mSig_i = exdata_i.*car_cos; mSig_q = exdata_q.*car_sin;
%%
figure; plot(exdata_i, 'r-', 'LineWidth', 4); hold on; grid on; plot(exdata_q, 'b-', 'LineWidth', 4); hold on; plot(car_sin, 'g-'); hold on hold off; Получается ерунда. У Вас похоже это работает CODE clear all; Br = 117.1875*10^3; Fd = Br*8;
Fif = 20*10^6; Fdif = 60*10^6; Fdopl = 100;
%% === TRANSMITTER === M = pngen(5); %M = 0.5; D = rand(1, 200*8) > 0.5; %D = [1 0 1 0]; CRC = zeros(1, 16); for i=1:length(D), CRC(16) = xor(CRC(16), D(i)); CRC = [CRC(2:16) CRC(1)]; end; FILL = ones(1, 200)*0.5; DATA = [dec2bin(length(D)/8, 11)=='1' D CRC]; packet = [FILL M M diff_enc([0 DATA]) FILL]*2-1;
% redescr Ndkr = Fd/Br; pkt = packet(ceil(0.01:1/Ndkr:length(packet)));
hch = firls(31, [0 .24 .3 .5]*2, [1 1 0 0]); pktf = filter(hch, [1], pkt);
% upsample t1 = upsample4(pktf, 31); t2 = upsample4(t1, 31); pktfu = upsample4(t2, 31)';
% -> IF l = length(pktfu); s = sin(2*pi*(Fif+Fdopl)*(0:1/Fdif:l/Fdif)); c = cos(2*pi*(Fif+Fdopl)*(0:1/Fdif:l/Fdif)); pkts = pktfu.*s(1:l); pktc = pktfu.*c(1:l);
%% === TRANSMIT LINE === Ir = awgn(awgn(pkts, 0.05), 0.01); Qr = awgn(awgn(pktc, 0.05), 0.01);
%% === GRAPHICS ===
figure; plot(pkts, 'g-'); grid on; hold on plot(pktc, 'r-'); hold on
figure; plot(Ir, 'g-'); grid on; hold on plot(Qr, 'r-'); hold on plot(pktfu, 'r-'); hold on
figure; plot(pkt, 'g-'); grid on; hold on
clc; % Переданные данные %pkt
Но там слишком большое количество данных. Сложно рассмотреть подробности.
|
|
|
|
|
Mar 30 2018, 05:28
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
Для отладки синхронизации не нужна несущая, ее можно добавить в самом конце. Вот как будут выглядеть I и Q компоненты идеального сигнала после всех переносов частоты. CODE clear all; Br = 400e3; Fd = Br*8;
Fdopl = 100;
D = (rand(1, 10000) > 0.5) * 2 - 1; % redescr Ndkr = Fd/Br; pkt = D(ceil(0.01:1/Ndkr:length(D))); l = length(pkt);
s = sin(2*pi*Fdopl*(0:1/Fd:l/Fd)); c = cos(2*pi*Fdopl*(0:1/Fd:l/Fd));
I = s(1:l) .* pkt; Q = c(1:l) .* pkt;
figure; hold on; plot(I); plot(Q, 'r'); figure; hold on; plot(I, Q, '*'); Начинайте с этого кода и добавляйте схемы, которые восстановят этот сигнал. Если запустить с Fdopl = 0, то на второй картинке будет 2 звездочки. Это идеальный конечный результат. Если запустить Fdopl = 100, то будет окружность, образованная вращением этих звездочек. Задача ФАПЧ вернуть звездочки на место и поддерживать их там. Как только заработает с идеальным сигналом, то нужно будет обрезать ему полосу и добавить шум. И отлаживать это. И только после этого можно смотреть на несущие, если сильно хочется.
Сообщение отредактировал ataradov - Mar 30 2018, 05:31
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|