L4=0;
L5=0;
L6=0;
L7=0;
CALL psp;
CALL corel;
CALL fft_s;
CALL fsp_;
M1=1;
M3=0;
M4=0;
M5=1;
I4=^ps;
{Основной оптимизационный цикл}
DO mc_1 UNTIL CE;
AX0=PM(I4,M4);
AR=-AX0;
PM(I4,M4)=AR;
{Осуществление коррекции АКФ }
SI=AR;
SR=LSHIFT SI BY 1(LO);
MY0=SR0;
AX0=I4; { Указатель на номер измененного элемента }
AY0=N_div_2;
AR=AX0-AY0;
IF LT JUMP mj_0;
Cntr=I4;
JUMP mj_1;
mj_0 : AX0=N;
AY0=I4;
AF=AY0-AX0;
AR=AF+1;
Cntr=AR;
mj_1 : SR0=Cntr;
AX0=I4;
AY1=N;
DO mc_0 UNTIL CE;
AY0=Cntr;
AR=SR0-AY0, SR1=DM(I0,M3);
I0=AR;
AR=AX0+AY0;
AX1=AR;
AR=AX1-AY1;
IF LT JUMP mj_2;
AF=AX0-AY0;
AR=PASS AF;
I5=AR;
AR=AF-1;
IF GE JUMP mj_3 ;
JUMP mc_0;
mj_2 : I5=AX1;
MX0=PM(I5,M4);
MR=MX0*MY0(UU);
AY0=MR0;
AR=SR1+AY0;
JUMP mc_0;
mj_3 : MX0=PM(I5,M4);
MR=MX0*MY0(UU);
AY0=MR0;
AR=SR1+AY0;
mc_0 : DM(I0,M3)=AR;
{Поиск максимального элемента массива значеий боковых
выбросов АКФ}
I0=^akf;
AX0=0;
Cntr=N;
DO mj_4 UNTIL CE;
AR=DM(I0,M1);
AF=ABS AR;
AY0=AR ;
AF=AX0-AF;
IF GE JUMP mj_4;
AX0=AY0 ;
mj_4 : NOP;
{ В регистре AX0 - искомый максимум }
DM(R_max_i)=AX0;
CALL fsp_adj; {Коррекция спектральной плотности мощности, выходной параметр - переменная dli_f (память программ)}
AX0=DM(dl_f);
AY0=DM(dli_f);
AR=AX0-AY0;
MX0=AR;
MY0=DM(k_alf1);
AX0=DM(R_max);
MR=MX0*MY0(UU);
AY0=DM(R_max_i);
AR=AX0-AY0;
MX0=AR;
MY0=DM(k_alf2);
MR=MR+MX0*MY0(UU);
AY0=0x3FFF;
AR=MR0-AY0;
IF GE JUMP mc_1;
AX0=PM(I4,M4);
AR=-AX0;
PM(I4,M4)=AR;
mc_1 : MODIFY(I4,M5);
{ Последовательность сформирована и передается во внешнее устройство - подпрограмма "sprt"}
CALL sprt;
.ENDMOD;
======================================================
Подпрограмма формирования псевдослучайной последовательности.
Время выполнения: 13×N + 9
.MODULE PSP;
.ENTRY psp;
.CONST N=93;
.VAR/DM ps[N];
psp :
MY1=25; { Cтаршая половина k1 }
MY0=26125; { Младшая половина k1}
SR1=0;
SR0=0;
L0=0;
AX0=1;
M0=1;
Cntr=N;
I0=^ps;
DO mk0 UNTIL CE;
MR=SR0*MY1(UU); { k1(hi) * x(lo) }
MR=MR+SR1*MY0(UU);
AR=MR1;
MR1=MR0;
MR2=AR;
MR0=H#FFFE; { k2=32767 }
MR=MR+SR0*MY0(UU);
SR=ASHIFT MR2 BY 15 ( HI );
SR=SR OR LSHIFT MR1 BY -1 ( HI );
SR=SR OR LSHIFT MR0 BY -1 ( LO );
AR= ABS SR1;
IF NEG AR=-AX0;
IF POS AR=PASS AX0;
mk0 : DM(I0,M0)=AR;
RTS;
.ENDMOD;
======================================================
Подпрограмма вычисления автокорреляционной функции.
Время выполнения: 18 + 2×N + (N-1)×(N+9)
.MODULE AKF_i_R_max;
.ENTRY corel;
.EXTERNAL R_max, N, ps, psp_ , akf;
corel : M6=1;
I7=^R_max;
M7=0;
M0=1;
M2=0x3FFF;
I1=^ps;
I0=I1;
Cntr=DM(N);
I5=^ps+1;
I6=^akf;
I4=^psp_;
MR2=DM(N);
PM(I6,M6)=MR2;
DO trans UNTIL CE;
AY0=DM(I0,M0);
trans : PM(I4,M6)=AX0;
Cntr=MR2;
DO ext UNTIL CE;
I0=I1;
I4=I5;
Cntr=I2;
MR=0, MY0=PM(I4,M6), MX0=DM(I0,M0);
DO ext_1 UNTIL CE;
ext_1: MR=MR+MX0*MY0(UU),MY0=PM(I4,M6), MX0=DM(I0,M0);
MY0=PM(I5,M6), MX0=DM(I2,M0);
AR=MR0-AY0;
IF GE AR=PASS MR0;
AR=AY0;
DM(I7,M7)=AR; {ЕСЛИ ТЕКУЩЕЕ ЗНАЧЕНИЕ R_max МЕНЬШЕ}
ext: PM(I6,M6)=MR0;{ВЫБРАННОГО ТО R_max <-- ЭТО ЗНАЧЕНИЕ}
RTS;
.ENDMOD;
======================================================
Подпрограмма вычисления спектра.
Время выполнения: 13 + 6×NG + nfft
.MODULE SPEKTR;
.ENTRY fft_s;
.EXTERNAL twid_real, twid_imag, in_real, in_imag, NG, NG_div_2;
.EXTERNAL fft;
fft_s: I1=^in_real;
Cntr=NG ;
DO ex_0 UNTIL CE;
ex0: DM(I1,M1)=L0;
I0=^ps ;
I1=^in_real ;
I2=^in_imag ;
Cntr=NG ;
AY0=8400H;
AY1=0400H;
DO Pr_i UNTIL CE;
AX0=DM(I0,M0);
AR=AY1 ;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.