Программа 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