Программа 26.5

 

2000 'ПОДПРОГРАММА ВЫЧИСЛЕНИЯ НОВЫХ КОЭФФИЦИЕНТОВ РЕКУРСИИ
2010 'Переменные входа программы: A[ ], B[ ], DELTA, MU
2020 'Переменные выхода программы: A[ ], B[ ], EOLD, ENEW
2030 '
2040 GOSUB 3000               'НАЙТИ ТЕКУЩУЮ ОШИБКУ
2050 EOLD = ER                'хранит текущую ошибку в переменной EOLD
2060 '
2070 'НАЙТИ НАКЛОНЫ ОШИБОК
2080 FOR P% = 0 TO NP%        'цикл по каждому коэффициенту "a"
2090 A[P%] = A[P%] + DELTA    'прибавить небольшое приращение к коэффициенту
2100 GOSUB 3000               'найти ошибку с изменением
2110 SA[P%] = (ER-EOLD)/DELTA 'вычислить наклон ошибки и сохранить в SA[ ]
2120 A[P%] = A[P%] – DELTA    'вернуть коэффициент к первоначальному значению
2130 NEXT P%
2140 '
2150 FOR P% = 1 TO NP%        'повторить процесс для каждого коэффициента "b"
2160 B[P%] = B[P%] + DELTA
2170 GOSUB 3000
2180 SB[P%] = (ER-EOLD)/DELTA   'вычислить наклон ошибки, сохранить в SB[ ]
2190 B[P%] = B[P%] - DELTA
2200 NEXT P%
2210 '                          'ВЫЧИСЛИТЬ НОВЫЕ КОЭФФИЦИЕНТЫ
2220 FOR P% = 0 TO NP%          'цикл по каждому коэффициенту
2230 A[P%] = A[P%] - SA[P%] * MU 'изменить коэффициенты в направлении «спуска»
2240 B[P%] = B[P%] - SB[P%] * MU
2250 NEXT P%
2260 '
2270 GOSUB 3000                 'НАЙТИ НОВУЮ ОШИБКУ
2280 ENEW = ER                  'запомнить новую ошибку в переменной ENEW
2290 '
2300 RETURN

3000 'ПОДПРОГРАММА ВЫЧИСЛЕНИЯ ОШИБКИ В ЧАСТОТНОЙ ОБЛАСТИ
3010 'Переменные входа программы: A[ ], B[ ], T[ ]
3020 'Переменная выхода программы: ER
3030 '
3040 FOR I% = 0 TO N%-1         'ЗАГРУЗИТЬ СДВИНУТЫЕ ИМПУЛЬСЫ В IMX[ ]
3050 REX[I%] = 0
3060 IMX[I%] = 0
3070 NEXT I%
3080 IMX[12] = 1
3090 '                          'ВЫЧИСЛИТЬ ИМПУЛЬСНУЮ ХАРАКТЕРИСТИКУ
3100 FOR I% = 12 TO N%-1
3110 FOR J% = 0 TO NP%
3120 REX[I%] = REX[I%] + A[J%] * IMX[I%-J%] + B[J%] * REX[I%-J%]
3130 NEXT J%
3140 NEXT I%
3150 IMX[12] = 0
3160 '                          'ВЫЧИСЛИТЬ БПФ
3170 GOSUB 1000                 'Программа 12.3 использует REX[ ], IMX[ ], N%
3180 '
3190 '                          'НАЙТИ ОШИБКУ В ЧАСТОТНОЙ ОБЛАСТИ
3200 ER = 0                     'обнулить ЕR и использовать как аккумулятор
3210 FOR I% = 0 TO N%/2         'цикл по каждой положительной частоте
3220 MAG = SQR(REX[I%]^2 + IMX[I%]^2)'преобразование прямоугольного в полярное
3230 ER = ER + ( MAG - T[I%] )^2     'вычисление и накопление квадрата ошибки
3240 NEXT I%
3250 ER = SQR( ER/(N%/2+1) )         'конец вычисления ошибки ER
3260 '
3270 RETURN