Привет, ребятки! 
Часто при моделировании различных сигналов приходится иметь дело с различными последовательностями. Например кодами Баркера или потоками данных.
Задаются они обычно набором значений, например F = [1, -1, 1, 1, 1, -1]; Однако в жизни каждый символ представляет собой прямоугольный импульс, которые нам и нужно промоделировать.
Загвоздка в том, что в таком виде они представляют собой отдельные точки и приходится каждый символ "расширять", т.е. повторять нужное количество раз. И повезет, если на один символ будет приходится целое число отсчетов!
У меня появилось желание сделать какой-нибудь финт, чтобы можно было без особых усилий получать значения последовательностей в произвольный момент времени, без привязки к частоте дискретизации! Поэтому мое воспаленное сознание выдало такую конструкцию:
S = F( 1 + fix(t/T)*(t/T<length(F)) ) * (t/T<length(F))
где F - массив символов последовательности,
T - длительность одного символа последовательности
t - произвольный массив времени
S - значение сигнала данных в эти моменты времени
Пояснение:
Для t < T*length(F): логические множители (t/T<length(F)) равны 1 и выражение можно переписать в виде: S = F( 1 + fix(t/T) ), где fix(...) возвращает целую часть отношения t/T, а 1 прибавляется для того, что в матлабе индексация массивов начинается не с 0, а с 1.
Для t >= T*length(F), т.е. в моменты времени большие длительности всей последовательности, множитель (t/T<length(F)) равен нулю и вместе с ним значение сигнала S. При этом индекс символа равен: idx = 1 + fix(t/T).*(t/T<length(F)) = 1 + fix(t/T)*0 = 1, при этом не возникает ошибки индексации массива, т.е. в итоге получаем: S = F(1)*0 = 0;
Пример:
| Matlab M | 1
2
3
4
5
6
7
8
9
10
| clear, clc
F = [1,-1,1,-1,1,1,-1,-1]; % некоторая последовательность
Ts = 0.1; % длительность символа
t = 0:0.001:1; % массив времени
S = F( 1 + fix(t/Ts).*(t/Ts<length(F)) ).*(t/Ts<length(F)); % вычисляем сигнал
% рисуем:
plot(t, S, 'linew',2)
grid on
ylim([-1.1, 1.1]) |
|

Думаю не нужно отдельно заострять внимание на том, что для ФМ сигнала нужно сигнал данных S умножить на приращение фазы несущего колебания: Spm = sin(w*t + pi*S); , а для ЧМ - на девиацию частоты: Sfm = sin( (w + df*S).*t );
Пример:| Matlab M | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| clear, clc
F = [1,0,1,0,1,1,0,0]; % данные
Ts = 0.1; % длительность символа
t = 0:0.001:1; % массив времени
S = F( 1 + fix(t/Ts).*(t/Ts<length(F)) ).*(t/Ts<length(F));
Spm = sin( 2*pi*20*t + pi*S );
Sfm = sin( 2*pi*(20 + 20*S).*t );
% рисуем:
plot(t, S, 'b',...
t, Spm - 2, 'r',...
t, Sfm - 5, 'g', 'linew',2)
grid on
ylim([-6.5, 1.5])
legend('data','PM','FM') |
|
|