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

BPSK матлаб модулятор демодулятор

Далее вся обработка осуществляется на нулевой частоте, в комплексном виде, с малым количеством отсчётов на символьный интервал.

Да. Где-то я это понимаю. В частности про малое количество отсчетов.

Но тем не менее для моделирования должна сложиться четкая картинка компонентов и их соединения. Схема Костаса эту картинку дает.

всё равно никакого Костаса у вас не будет в итоге, потому что ФАПЧ медленно настраивается.

Как-же тогда быть? Никакой другой схемы кроме Костаса пока не встречал...

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

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


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

Как-же тогда быть? Никакой другой схемы кроме Костаса пока не встречал...

 

Можно почитать для начала RF Architectures and Digital Signal Processing Aspects of Digital Wireless Transceivers - Nezami.

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


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

Если посчитать за какое время сработает петля Костаса, например, при доплере 150 Гц (в воде это движение ~2 м/сек) (несущая 100 кГц) то получится, что для полной синхронизации потребуется время равное 150 символам (битам). Это если шаг изменения частоты NCO будет 1 Гц.

150 бит это ~18 байт преамбулы. Если длительность одного символа 4 периода несущей то это 40 мкс. Всего 150*40 = 6000 мкс. Тоесть полная подстройка произойдет за 6 мс. Это вполне нормально. Но в реальности наверняка шаг подстройки будет меньше чем 1 Гц, например 0.5 Гц. Ну тогда полная синхронизация наступит через 12 мс. Тоже вроде неплохо. Далее пойдет синхросимвол и данные.

Для случая с несущей в 100 кГц вроде неплохо.

 

 

 

Можно почитать для начала RF Architectures and Digital Signal Processing Aspects of Digital Wireless Transceivers - Nezami.

Уже читаю. Глава 5.

Думаю для начала всеравно нужно построить петлю Костаса. Приступать сразу к FeedForward наверное неправильно. Ведь так?

 

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


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

VCO получает сигал ошибки в качестве контрольного, зачем перестраивать фиксированным шагом? Вам и предлагают ПИ звено поставить чтобы шаг сам нашелся какой нужно для оптимальной настройки.

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


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

VCO получает сигал ошибки в качестве контрольного, зачем перестраивать фиксированным шагом? Вам и предлагают ПИ звено поставить чтобы шаг сам нашелся какой нужно для оптимальной настройки.

Об этом постоянно думаю. В смысле о самонастраиваемом шаге.

Что такое ПИ звено?

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

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


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

Что такое ПИ звено?

 

https://ru.wikipedia.org/wiki/%D0%9F%D0%98%...%82%D0%BE%D1%80

 

ПИ это тоже самое,только без "Д".

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


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

Уже читаю. Глава 5.

Думаю для начала всеравно нужно построить петлю Костаса.

 

Это ещё месяц назад надо было сделать, в симулинке изучить все возможные воздействия и сочетания параметров, непонятно чего тянете, стройте уже. Такими темпами и 5 лет не хватит, на то, что на самом деле надо сделать для вашей задачи.

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


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

Это ещё месяц назад надо было сделать, в симулинке изучить все возможные воздействия и сочетания параметров, непонятно чего тянете, стройте уже. Такими темпами и 5 лет не хватит, на то, что на самом деле надо сделать для вашей задачи.

Ok. Попробую. В простейшем виде.

Сформировал BPSK сигнал post-39850-1522150170_thumb.jpg

Я так понимаю сигнал необходимо оцифровать для того, чтобы потом умножать на сигнал формируемый Discrete-Time VCO.

Сделал примерно так post-39850-1522151714_thumb.jpg

Ход верный или ерунда?

На FPGA я делал-бы именно так...

 

 

 

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


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

Ok. Попробую. В простейшем виде.

Сформировал BPSK сигнал post-39850-1522150170_thumb.jpg

Я так понимаю сигнал необходимо оцифровать для того, чтобы потом умножать на сигнал формируемый Discrete-Time VCO.

Сделал примерно так post-39850-1522151714_thumb.jpg

Ход верный или ерунда?

На FPGA я делал-бы именно так...

 

Не нужно моделировать сигнал на несущей, этим вы только замедляете модель, увеличивая количество отсчётов, необходимое для представления сигнала на несущей. Ни о какой оцифровке на данном этапе думать не нужно, и про FPGA тоже. Работайте с комплексными сигналами. В общем примеры я выкладывал, смотрите как там сделано.

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


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

Не нужно моделировать сигнал на несущей, этим вы только замедляете модель, увеличивая количество отсчётов, необходимое для представления сигнала на несущей. Ни о какой оцифровке на данном этапе думать не нужно, и про FPGA тоже. Работайте с комплексными сигналами. В общем примеры я выкладывал, смотрите как там сделано.

Рад-бы. Но мой уровень симулинк не позволяет сходу это сделать.

Ваш пример для меня сложен. А примеры имеющиеся в сети на мой взгляд бестолковые. Их даже в качестве рыбы нельзя использовать. Оторванные от реального железа.

Поскольку в симулинк я вообще не умею работать то он вызывает некоторое отторжение.

Петлю ФАПЧ попробую сделать в классическом матлабе.

%% 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?

 

 

 

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


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

Нужно взять исходный бинарный сигнал, умножить его на синус и косинус частоты Допплера без всяких несущих. Все, получили I и Q. Это сигнал идущий на схему вращающую созвездие. Костас или не Костас - это как захочется.

 

Чтобы визуально увидеть созвездие нужно построить график I(Q). Для нулевого Допплера и в отсутствии шума и прочих искажений это будут 2 точки. При добавлении Допплера это будет окружность. Задача ФАПЧ вернуть эти точки на исходное место и следить, чтобы они там и остались.

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

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


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

Нужно взять исходный бинарный сигнал, умножить его на синус и косинус частоты Допплера без всяких несущих. Все, получили I и Q. Это сигнал идущий на схему вращающую созвездие. Костас или не Костас - это как захочется.

 

Чтобы визуально увидеть созвездие нужно построить график I(Q). Для нулевого Допплера и в отсутствии шума и прочих искажений это будут 2 точки. При добавлении Допплера это будет окружность. Задача ФАПЧ вернуть эти точки на исходное место и следить, чтобы они там и остались.

Понял. Спасибо.

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


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

Не получается.

Пытаюсь сформировать синфазную и квадратурную составляющую модулирующего сигнала.

%% 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;

Получается ерунда.

У Вас похоже это работает

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

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

 

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


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

Для отладки синхронизации не нужна несущая, ее можно добавить в самом конце.

 

Вот как будут выглядеть I и Q компоненты идеального сигнала после всех переносов частоты.

 

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

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


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

Для отладки синхронизации не нужна несущая, ее можно добавить в самом конце.

Вот как будут выглядеть I и Q компоненты идеального сигнала после всех переносов частоты.

Спасибо. Попробую разобраться.

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


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

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

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

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

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

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

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

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

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

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