|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/ft_htm_c/fta5r_c.htm
Дата изменения: Fri Nov 27 14:08:46 2015 Дата индексирования: Sun Apr 10 01:59:21 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий fta5r_c.zip , fta5d_c.zip |
Тексты тестовых примеров tfta5r_c.zip , tfta5d_c.zip |
Выполнение прямого и обратного быстрых дискретных косинус - преобразований Фурье одномерного массива вещественных чисел длины n, равной степени двух.
Пусть известны значения f j = f ( t j ) вещественной функции f (t) на равномерной сетке t j = j δt, j = 0, 1, 2, ..., N - 1 (где δt - шаг сетки, а N равняется целой степени двух), заданные в виде одномерного массива вещественных чисел ARRAY длины N.
Подпрограмма fta5r_c имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме ( IREG = 1) выполняется прямое быстрое дискретное косинус - преобразование Фурье заданного массива ARRAY, состоящее в получении N вещественных чисел Fk (k = 0, 1, 2, ..., N - 1) из чисел f j по формуле:
N-1
Fk = ∑ f j cos(π j k / N) .
j =1
В этом режиме подпрограмма fta5r_c из исходного массива ARRAY строит вспомогательный вещественный массив Y длины N, компоненты которого yj ( j = 0, 1, 2, .., N - 1) определяются формулами:
y 0 = f 0
y j = 0.5 ( f j + f N-j ) - sin( j π / N ) ( f j - f N-j ) , j > 0 .
В результате применения к полученному массиву Y подпрограммы fta3r_c строится комплексный массив длины N/2 с вещественными Rk и мнимыми Ik (k = 0, 1, 2, ..., N/2 - 1) частями. Компоненты искомого массива определяются через Rk и Ik следующим образом:
N-1
F1 = ∑ f j cos ( j π / N )
j= 0
F2k = Rk , F2k+1 = F2k-1 + Ik , k = 0, 1, 2, ..., N/2-1
Вычисленные значения Fk располагаются в том же массиве ARRAY.
Во втором режиме ( IREG = - 1) выполняется обратное быстрое дискретное косинус - преобразование Фурье, состоящее в восстановлении из значений Fk (k = 0, 1, 2, ..., N - 1), заданных в виде одномерного массива вещественных чисел ARRAY длины N, значений f j ( j = 0, 1, 2, ..., N - 1), которые располагаются в том же массиве array_c. Для этого строится массив f m ( m = 0, 1, 2, ..., N - 1) по следующей формуле:
N-1
f m = ∑ Fk cos ( π k m / N ) .
k =0
Между значениями f m и f m существуют соотношения:
f 0 = N f0 + ∑ f j
по нечетным j
(1) f m = (N/2) f m + ∑ f j , m - нечетные
по четным j
f m = (N/2) f m + ∑ f j , m - четные , m ≠ 0
по нечетным j
Неизвестные суммы в правых частях этих соотношений определяются следующим образом:
N-1
C1 ≡ ∑ f m = (N/2) ( f 0 + ∑ f j )
j =0
по четным m
N-1
C2 ≡ ∑ f m = (N/2) ∑ f j
j =0
по нечетным m
Отсюда следует, что
(N/2) f 0 = C1 - C2 .
Поэтому
∑ f j = f 0 - 2 ( C1 - C2 )
по нечетным j
∑ f j = (2/N) C2 - ∑ f j
по четным j по нечетным j
Зная эти суммы, восстанавливаемые значения f j вычисляются из соотношений (1).
Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Изд - во "Наука", 1987.
int fta5r_c (real *array, integer *n, integer *ireg)
Параметры
| array - | вещественный одномерный массив длины n, содержащий в случае прямого преобразования ( ireg = 1) на входе значения f j и на выходе значения fk, а в случае обратного преобразования ( ireg = - 1) - на входе значения fk и на выходе значения f j; |
| n - | длина массива array, равная целой степени двух (тип: целый) |
| ireg - | задает режим работы подпрограммы (тип: целый); при этом: |
| ireg= 1 - | когда выполняется прямое преобразование; |
| ireg= -1 - | когда выполняется обратное преобразование. |
Версии
| fta5d_c - | выполнение прямого и обратного быстрых дискретных косинус - преобразований Фурье одномерного массива вещественных чисел длины n, равной степени двух, в режиме удвоенной точности; при этом параметр array должен иметь тип double. |
Вызываемые подпрограммы
|
fta3r_c - fta3d_c | выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива вещественных чисел длины 2n, где n равняется целой степени двух, в режимах одинарной и удвоенной точности; используются в подпрограммах fta5r_c и fta5d_c соответственно. |
Замечания по использованию
| В подпрограммах fta5r_c и fta5d_c проверка того, что значение n должно быть целой степенью двух, не производится. |
int main(void)
{
/* Initialized data */
static float array[8] = { 1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f };
/* Local variables */
extern int fta5r_c(float *, int *, int *);
static int n;
static int c__1 = 1;
static int c_n1 = -1;
n = 8;
fta5r_c(array, &n, &c__1);
printf("\n %15.6e %15.6e %15.6e %15.6e ",
array[0],array[1],array[2],array[3]);
printf("\n %15.6e %15.6e %15.6e %15.6e \n",
array[4],array[5],array[6],array[7]);
fta5r_c(array, &n, &c_n1);
printf("\n %15.6e %15.6e %15.6e %15.6e ",
array[0],array[1],array[2],array[3]);
printf("\n %15.6e %15.6e %15.6e %15.6e \n",
array[4],array[5],array[6],array[7]);
return 0;
} /* main */
Результаты:
а) в случае прямого преобразования:
array = (36, - 8.13707, - 4, 3.38009, - 4, 4.27677, - 4, 4.48022)
б) в случае обратного преобразования:
array = (1, 2, 3, 4, 5, 6, 7, 8)