обнаружитель сигнала со случайной начальной фазой
18.01.2021
Доброго времени суток!
Только начинаю работать в малаб, столкнулся с проблемой задания случайной начальной фазы для гармонического сигнала.Уже все перепробовал никак не получается реализовать. С фазой, заданной как константа проблем нет.Если есть какой-то пример кода был бы очень признателен.
Ответы
Поясните подробнее что делаете, ибо фаза это или не фаза - это дело десятое. Число случайное - это например ф-ции randn или randn или еще другие можно найти . . . А уж как вы потом это число используете в качестве фазы гармоники, или коэфициента отражения поверхности, . . . - значения не имеет. Поэтому есть предположение, что имеет значение что именно вы делаете.
Последний вот такой вариант, но phi почему то все равно 0 хотя с по-разному всегда заполняется
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/180;
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);
Не вдаваясь в подробности что вы делаете, ибо мало что понятно, . . .
- 21.6 млн отсчетов с лишним. Не многовато? Длительность при частоте 200 Гц составит более суток вроде как. Это необходимо?
- у вас несомненно t и phi имеет разную размерность, а так нельзя. Исправьте расмерности этих переменных.
для оптимальной работы обнаружителя сказали сделать большоечисло отсчетов(если делаю меньше картина не меняется)
у t и phi как японимаю одинаковая размерность
(скрины прикрепил)
если есть какой то другой вариант реализации случайной начальной фазы буду рад посмотреть)
Так если не меняется, зачем так много. Надо всегда максссссимально уменьшать все ресурсопотребления до того момента как начинает теряться точность необходимая.
Согласен, тут я чето нетуда посмотерл.
Вобще фаза у вас меняется на большом количестве это видно, хотя и весьма трудно анализировать. И все равно совершенно не ясно что делаете. Ну да ладно. Вам как надо стоб фаза менялась? непрерывно? или на каждые M?
Если задача сводится просто к генерации синусоиды со случайной начальной фазой, то это значение начальной фазы и будет константой. Просто эта константа будет принимать случайное значение каждый раз при выполнении скрипта.
Ощущение, исходя из кода @Vanchous, что нужно иметь длиннющую последовательность синусоид, каждая длиной по 200 отсчетов и имеет свою фазу.
@Vanchous
Если так, то в коде от @Marat S1 это у вас одна синусоида с заданной фазой. Можно завести еще переменную S2.
S2 = [];
И после каждого вычисления очередного значения S1 с нужной фазой добавлять его к S2:
S2 = [S2; S1];
Со случайной фазой вроде добился того что имел в виду преподаватель,спасибо большое.
Теперь появились вопросы поповоду самого обнаружителя сигнала.. Пытаюсь сделать через согласованный фильтр, не могу понялть это нормальная реакция сф ? вроде пик есть, но выглядит как то странно это.(скрин прикрепил)
подскажите пожалуйста в чем ошибка и в правильном ли направлении вообще двигаюсь?
phi = randi(180, 1, 1);
phi = deg2rad(phi);
A0=1;
f0=4; % Частота сигнала, МГц
fd = 10; % чатоста дискретизации
td = 1/fd; % период дискретизации
Noise=randn(1,25001);
figure (1); % вывод на экран изображение шума
plot (t(1:25000),Noise (1:25000));
xlabel ('Time, microsec');
ylabel ('Amplitude, V');
grid on;
title ('Noise');
% % создание сигнала с шумом
S1 = A0.*sin(2*pi*f0*t + phi)+ Noise ;
figure (2);
plot(t(1:500),S1(1:500));
grid on;
xlabel('time, microsec');
ylabel ('amplitude, V');
title('Signal')
for q=1:1:500
h_SF(q)=S1(501-q);
end
figure (3);
plot (t(1:500),h_SF(1:500));
grid on;
xlabel('frequency,MegaHz');
ylabel ('amplitude, V');
title('Impulse haracneristic')
% реакция согласованного фильтра на один ЛЧМ-импульс
ReactionSF1=filter (h_SF,1,S1)./(0.5*50*1000);
figure (4); % вывод на экран реакции
plot (t(1:1000),ReactionSF1(1:1000));
grid on;
xlabel('time');
ylabel ('amplitude');
title('Reaction for 1 imp');
% Вычисляем уровень сигнал\шум
Noise_v_kv = power (Noise,2);
z=trapz(t,Noise_v_kv); % вычисление среднеквадратичного значения шума
S_N=max(abs(S1))./sqrt(z);
disp (S_N);% сигнал\шум
%создание детектора
reaction=abs(ReactionSF1);
figure (5);
plot(t(1:1000),reaction(1:1000));
сейчас заметил, что если убираю полезный сигнал из смеси то выделяется то пик на реакции сф все равно присутствует...
Ваш скрпт даж не запустился. Выложите запускающийся файл, в виде файла?
Вопрос более конкретный: импульсную характиристику вы как находите?
Прикрепил файл.По поводу ИХ за основу брал программу обнаружителя сигнала там вот так искали ИХ (если честно тоже не очень понял как):
for q=1:1:500
h_SF(q)=S1(501-q);
end
figure (3);
plot (t(1:500),h_SF(1:500));
grid on;
xlabel('frequency,MegaHz');
ylabel ('amplitude, V');
title('Impulse haracneristic')
по поводу самой программы работает не правильно (если только шум оставляю то все равно пишет что есть сигнал, а если только полезный сигнал оставляютоон не видит его)
также если смотреть на графики то после ИХ сильно меняется амплитуда, подскажите пожалуйста почему?
https://www.youtube.com/watch?v=8GX7yADQv2M&list=PLmu_y3-DV2_kpP8oX_Uug0IbgH2T4hRPL&index=22
Вот это думаю все просто объяснит. Не могу сказать правильно у вас или нет, но правильные тенденции имеются. К сожалению нет в данный момент возможности покопаться, но вам нужна свертка вероятно, о чем и говорится в видео.