Формирование сигнала QPSK

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Формирование сигнала QPSK

Сообщение sandy » Пт мар 08, 2019 12:25 am

Проблема в этой строчке

Код: Выделить всё

u1(n)=u(n)*(180/pi);

и последующих сравнениях u1 с целыми числами 0, 45, 90 и так далее. Так делать нельзя. Дело в том, что расчеты выполняются с некоторой погрешностью, и даже без шума вы не получите в точности 45, 90 и так далее.
Кроме того, вы не учли, что atan2 возвращает результат в диапазоне от -pi до +pi, а не от 0 до 2*pi.
Здесь нужно было писать что-то типа

Код: Выделить всё

u1(n)=round(u(n)/pi*4);

и потом сравнивать результат с целыми числами от -4 до +4.
С уважением

Александр Сергиенко

Nguyễn Văn Dũng
Пользователь
Сообщения: 25
Зарегистрирован: Чт окт 11, 2018 6:33 am

Re: Формирование сигнала QPSK

Сообщение Nguyễn Văn Dũng » Пт мар 08, 2019 5:35 am

Большое спасибо Вам!
Я исправил и все получилось.
У меня только схема некогерентного приема надо моделировать.
Желаю Вам всего хорошего!
С уважением, Зунг.

Nguyễn Văn Dũng
Пользователь
Сообщения: 25
Зарегистрирован: Чт окт 11, 2018 6:33 am

Re: Формирование сигнала QPSK

Сообщение Nguyễn Văn Dũng » Вс мар 10, 2019 8:57 pm

Здравствуйте, Александр Сергиенко!
Мне нужна Ваша помощь!
Я переходил на схему некогерентного приема.
Как Я понимаю для когерентного приема то формировать сигнал BPSK, а для некогерентного приема надо формировать сигнал DPSK.
сигнал DPSK: первый элемент в массиве фаза=0. Если следующий элемент 0, то фаза следующей посылки изменяется на пи по сравнению с предыдущей. Если 1, то фаза остается такой же как в предыдущей.
Потом накопить сигнал с второго элемента и сравнить с порогом 0.
Так Я понимаю, но реализовать чуть затрудняюсь.
Вы можете посмотреть мой код программу? Подскажите, как поправить программу?
C уважением, Зунг.

Код: Выделить всё

clc;
close all;
clear all;
N=11;
b=[0 0 0 1 1 1 0 0 1 1 1];
for n=2:length(b)
   phi(1)=0;
   if b(n)==1
       phi(n)=phi(n-1);
   elseif b(n)==0;
       phi(n)=phi(n-1)+pi;
   end
end
A0=1;
N = 10; % длина последовательности
b = randint(1,N); % случайные данные
fc =2; % часота несущего колебания
fz = 1; % частота символов
fd = 20*fc; % чатоста дискретизации
td = 1/fd; % период дискретизации
t = 0:td:11-td; % массив времени
M = fd/fz; % количество отсчетов на бит
phi = repmat(phi,M,1); % повторяем последовательность по строкам
phi = phi(:)'; % вытягиваем по столбцам
S1 = A0.*sin(2*pi*fc*t + phi); % сигнал с БФМ

% белый гауссовский шум
sigma=0;
noise=sigma.*randn(1,length(t));

%гармоническая помеха с случайной фазой в каждом тактовом интервале
m=0;
S2 = m.*A0.*sin(2*pi*fc*t + (2*pi/360) * fix((1:numel(S1))/ 6000));

% Сумма сигнала М-ФМ + гармоническая помеха + белый гауссовский шум
S3=S1+S2+noise;

% Задержанный принимаемый сигнала на тактовой интервал сигнал Ts

S4=[zeros(1, 1 * M) S3(1 : end - 1* M)];

% перемножение принимаемого и задержанного принимаемого сигнала
S14=S1.*S4;

% создать массив (была ошибка)
S11 = reshape(S1,fd,N)';
S41 = reshape(S4,fd,N)';


% создать массив
for j=1:N.*fd;
    i=fix(j/fd)+1;
    jj=j-fix(j/fd).*fd+1;
    s11(i,jj)=S1(j);
    s41(i,jj)=S4(j);

end

%сравнить результат после интегратора с порогом

for i=1:N;
        SS(i)=0;
        for jj=1:fd;
             SS(i)=SS(i)+s11(i,jj).*s41(i,jj);
             j=(i-1).*fd+jj;
             Sp(j)=SS(i);
    end
             if SS(i)>0
        d(i)=1;
    else
        d(i)=0;
             end
   
end
error=0;
for(i=1:1:N)
    if b(i)==d(i)
    else
        error=error+1;
    end
end
error=error/N;

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Формирование сигнала QPSK

Сообщение sandy » Вт мар 12, 2019 9:04 pm

Удалите эти две строки:

Код: Выделить всё

N = 10; % длина последовательности
b = randint(1,N); % случайные данные
С уважением



Александр Сергиенко

Nguyễn Văn Dũng
Пользователь
Сообщения: 25
Зарегистрирован: Чт окт 11, 2018 6:33 am

Re: Формирование сигнала QPSK

Сообщение Nguyễn Văn Dũng » Ср мар 13, 2019 12:41 am

Александр Сергиенко!
Большое спасибо Вам за помощь!
Простите, пожалуйста!
Я не внимательно посмотрел.
Как Я понимаю, что Мы использовали задержанный сигнал для опорного сигнала.
Задержанный сигнал получил в итоге сигнал+шум. тогда шум много влияет на отношение сигнал/шум.
Если не используем фильтр, то большие вероятности ошибки.
Я писал программу для фильтра.
Вы можете подсказать, Как подбирать какие параметры фильтра, чтобы получить оптимальный фильтр максимально подавить шум.
С уважением, Зунг.

Код: Выделить всё

clc;
close all;
clear all;
N = 108000;
c = randi([0, 1], 1, N);
for n=2:length(c)
   phi(1)=0;
   if c(n)==1
       phi(n)=phi(n-1);
   elseif c(n)==0;
       phi(n)=phi(n-1)+pi;
   end
end
A0=1;
fc =10; % часота несущего колебания
fz = 1; % частота символов
fd = 20*fc; % чатоста дискретизации
td = 1/fd; % период дискретизации
t = 0 : td : N/fz-td; % массив времени
M = fd/fz; % количество отсчетов на бит
phi = repmat(phi,M,1); % повторяем последовательность по строкам
phi = phi(:)'; % вытягиваем по столбцам
S1 = A0.*sin(2*pi*fc*t + phi); % сигнал с БФМ

% белый гауссовский шум
sigma=7.07;
noise=sigma.*randn(1,length(t));

%гармоническая помеха с случайной фазой в каждом тактовом интервале
m=0;
S2 = m.*A0.*sin(2*pi*fc*t + (2*pi/360) * fix((1:numel(S1))/ 6000));

% Сумма сигнала М-ФМ + гармоническая помеха + белый гауссовский шум
S3=S1+S2+noise;

% Задержанный принимаемый сигнала на тактовой интервал сигнал Ts

S4=[zeros(1, 1 * M) S3(1 : end - 1* M)];
[b,a] = butter(2,[fc-2 fc+2]/(fd/2));
SS3 = filtfilt(b,a,S3);
S4=[zeros(1, 1 * M) SS3(1 : end - 1* M)];


% создать массив (была ошибка)
SS31 = reshape(SS3,fd,N)';
S41 = reshape(S4,fd,N)';


%сравнить результат после интегратора с порогом

for i=2:N;
        SS(i)=0;
        for jj=1:fd;
             SS(i)=SS(i)+SS31(i,jj).*S41(i,jj);
             j=(i-1).*fd+jj;
             Sp(j)=SS(i);
    end
             if SS(i)>0
        d(i)=1;
    else
        d(i)=0;
             end
   
end
error=0;
for(i=2:1:N)
    if c(i)==d(i)
    else
        error=error+1;
    end
end
error=error/(N-1);

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Формирование сигнала QPSK

Сообщение sandy » Сб мар 16, 2019 11:14 am

Вы можете подсказать, Как подбирать какие параметры фильтра, чтобы получить оптимальный фильтр максимально подавить шум.

Нет, здесь не подскажу. Если вам нужно принимать сигнал именно таким образом, экспериментируйте с параметрами фильтра. Не забудьте только, что фильтр вносит в сигнал задержку, которую нужно будет учесть.

Но имейте в виду, что подход "сначала перемножение сдвинутых копий сигнала, потом интегрирование" принципиально плох. И не только из-за возрастания шума. Главная проблема в том, что работоспособность этого метода зависит от соотношения между несущей частотой и частотой следования символов. Задайте в вашем коде, например, fc=9.5, и посмотрите, что будет. Даже без шума. Или fc=9.75, тоже будет познавательно.
С уважением



Александр Сергиенко

Nguyễn Văn Dũng
Пользователь
Сообщения: 25
Зарегистрирован: Чт окт 11, 2018 6:33 am

Re: Формирование сигнала QPSK

Сообщение Nguyễn Văn Dũng » Вс мар 17, 2019 1:15 am

Да, Александр Сергиенко!
Спасибо Вам!
Видно, что метод некогерентного приема, результаты хуже чем когерентный метод.
Но, Я думаю, что надо доказать в своей работе, почему метод когерентный метод популярен используют.
Если Мы изменяем частоту несущей, видно, что результаты другие, в моей работе тоже исследовать сканирующую помеху.Показано, что опасно когда прицельная гармоническая помеха.
Я изменил fc+0.5 fc-0.5 до fc+9.5 fc-9.5. Потом найти наименьшую вероятность ошибки, это будет оптимальный фильтр.
Хочу спросить Вас, скажите, пожалуйста!
Можно ли так делать?
С уважением, Зунг.