Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/r_htm_p/rsa1r_p.htm
Дата изменения: Fri Dec 4 15:25:23 2015 Дата индексирования: Sun Apr 10 01:13:30 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий rsa1r_p.zip, rsa1e_p.zip |
Тексты тестовых примеров trsa1r_p.zip, trsa1e_p.zip |
Вычисление прямой и обратной дискретной периодической (круговой) свертки двух одномерных массивов вещественных чисел.
Пусть известны N значений sj = s ( tj ) функции сигнала s ( t ) на равномерной сетке tj = j Δt, j = 0, 1, 2, ..., N - 1 (где Δt - шаг сетки, а N равняется целой степени двух). Предполагается, что сигнал sj является периодическим с периодом N (отсюда, в частности, следует, что значения sj известны и для отрицательных значений j, т.е. s- j = sN - j, j = 1, 2, ..., N - 1). Значения sj задаются в вещественном одномерном массиве ARRAY_ длины N: ARRAY_ ( J ) = sj ( J = 1, 2, ..., N; j = 0, 1, 2, ..., N - 1).
Пусть известны также M значений rk = r ( tk ) импульсной функции отклика r ( t ) на той же равномерной сетке tk = k Δt, k = - (M - 1)/2, ..., 0, ..., (M - 1)/2 (где Δt - тот же шаг сетки, что и для функции сигнала, а M - нечетное натуральное число такое, что M < N). Значения rk задаются в M первых элементах одномерного вещественного массива RESP длины N следующим образом:
RESP(1) = r0 RESP( I ) = rk , I = 2, 3, ..., (M+1)/2 ; k = 1, 2, ..., (M-1)/2 RESP( I ) = rk , I = (M+3)/2, ..., M ; k = (M-1)/2, ..., - 1
Подпрограмма RSA1R имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме ( IREG = 1) выполняется прямая дискретная периодическая свертка массивов ARRAY_ и RESP (L = 1, 2, ..., N):
N (r*s)L = ∑ ARRAY_(L - J) × RESP( J ) j =1
где * - знак свертки, а
× - знак умножения.
Предварительно в массив RESP добавляются нули следующим образом:
RESP( I ) = RESP( I ) , I = 1, 2, ..., (M+1)/2 RESP( I ) = 0.0 , I = (M+3)/2, ..., N - (M-1)/2 RESP(N+1-I ) = RESP(M+1-I ) , I = 1, 2, ..., (M-1)/2
Для вычисления указанной свертки используется быстрое дискретное преобразование Фурье в соответствии с теоремой о дискретной периодической (круговой) свертке. Полученные значения (r * s)L помещаются в первых N компонентах массива ANS.
Во втором режиме ( IREG = - 1) выполняется восстановление значений sj функции сигнала по известным значениям rk импульсной функции ответа, задаваемым в массиве RESP, и значениям соответствующей свертки, задаваемым в массиве ARRAY_. Полученные значения sj помещаются в первых N элементах массива ANS.
Р.Отнес, Л.Эноксон. Прикладной анализ временных рядов. Изд - во "Мир", 1982.
procedure RSA1R(var ARRAY_ :Array of Real; var N :Integer; var RESP :Array of Real; M :Integer; var ANS :Array of Complex; var FFT :Array of Complex; IREG :Integer; var IFLAG :Integer);
Параметры
ARRAY_ - | вещественный одномерный массив длины N, содержащий либо значения sj ( IREG = 1), либо значения свертки ( IREG = - 1); |
N - | длина массива ARRAY, равная целой степени двух (тип: целый); |
RESP - | вещественный одномерный массив длины N, в первых M компонентах которого задаются значения rk; |
M - | количество заданных значений rk (тип: целый); |
ANS - | вещественный одномерный массив длины 2N, в первых N элементах которого в результате работы подпрограммы размещаются либо компоненты вектора свертки (IREG = 1), либо восстановленные значения sj (IREG = - 1); |
FFT - | комплексный одномерный массив длины N, используемый в подпрограмме в качестве рабочего; |
IREG - | задает режим работы подпрограммы (тип: целый); при этом: |
IREG= 1 - | когда вычисляется свертка; |
IREG= -1 - | когда восстанавливается функция сигнала sj |
IFLAG - | целая переменная, служащая для сообщения о характере окончания работы подпрограммы во втором режиме ( IREG = - 1); при этом: |
IFLAG=0 - | когда восстановлены все значения sj; |
IFLAG=I - | когда I - ая компонента преобразования Фурье импульсной функции отклика rk равна нулю; это означает, что значение sI не может быть восстановлено из - за потери информации в векторе свертки; значения sj в этом случае подпрограммой не восстанавливаются. |
Версии
RSA1E - | вычисление прямой и обратной дискретной периодической (круговой) свертки двух одномерных массивов вещественных чисел в режиме расширенной (Extended) точности; при этом параметры ARRAY_, RESP и ANS должны иметь тип Extended, параметр FFT - тип Complex * 16 (это означает, что данная версия существует только для тех компиляторов, входной язык которых допускает комплексные данные расширенной (Extended) точности). |
Вызываемые подпрограммы
FTA2R - FTA2E | одновременное выполнение прямого быстрого дискретного преобразования Фурье двух одномерных массивов вещественных чисел, каждый из которых имеет длину N, равной целой степени двух, в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах RSA1R и RSA1E соответственно. |
FTA3R - FTA3E | выполнение прямого и обратного быстрых преобразований Фурье одномерного массива вещественных чисел длины 2N, где N равняется целой степени двух, в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах RSA1R и RSA1E соответственно. |
Замечания по использованию
В подпрограммах RSA1R и RSA1E проверка того, что значение N должно быть целой степенью двух, а M должно быть нечетным числом, меньшим N, не производится. |
Unit TRSA1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, RSA1R_p; function TRSA1R: String; implementation function TRSA1R: String; var N,M,_i,IFLAG :Integer; RESP :Array [0..15] of Real; ANS :Array [0..31] of Real; FFT :Array [0..15] of Complex; const ARRАY_ :Array [0..15] of Real = ( 0.0,0.0,0.5,0.0,0.0,-0.5,0.0,0.0,0.5,0.5,0.5, 0.5,0.5,0.0,0.0,0.0 ); begin Result := ''; { результат функции } N := 16; M := 3; RESP[0] := 0.7; RESP[1] := 0.4; RESP[2] := 0.4; RSA1R(ARRAY_,N,RESP,M,ANS,FFT,1,IFLAG); Result := Result + Format('%5d ',[IFLAG]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 31 do begin Result := Result + Format('%20.16f ',[ANS[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TRSA1R',Result); { вывод результатов в файл TRSA1R.res } exit; end; end. Результаты: ANS = (- 0.596046E - 7, 0.2, 0.35, 0.2, - 0.2, - 0.35, - 0.2, 0.2, 0.55, 0.75, 0.75, 0.75, 0.55, 0.2, - 0.745058E - 8, 0.521541E - 07)