|
Текст подпрограммы и версий ftfcr_c.zip |
Тексты тестовых примеров tftfcr_c.zip |
Вычисление коэффициентов Фурье по системе четных тригонометрических функций вещественного ряда длины, на 1 большей степени двух, с использованием метода быстрого преобразования Фурье.
Пусть длина N преобpaзyeмoго вещественного ряда X удовлетворяет условию: N = 2 M + 1. Ряд X преобразуется в вещественный ряд A по формуле (прямое преобразование):
N-2
A r = 1/2 * X0 + ∑ X n * cos (π r * n/(N - 1) ) + 1/2 * (- 1)r * XN-1 ,
n=1
r = 0, 1, ..., N - 1
Так как система функций cos (π r x), r = 0, ..., N ортогональна на сетке Xn = n / N с весами (1/2, 1, 1, ..., 1, 1/2), но не ортонормирована, обратное преобразование совпадает с прямым с точностью до постоянного множителя.
B вычислениях используется метод быстрого преобразования Фурье [1]. Ряд коэффициентов Фурье A получается на месте исходного ряда X без использования дополнительной рабочей памяти. При больших N число операций пропорционально N * log2N.
| 1. | В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев. Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе", вып. 15, Изд. МГУ, 1976. |
int ftfcr_c (real *x, integer *n)
Параметры
| x - | вещественный вектоp длины n; перед началом работы подпрограммы содержит преобразуемый ряд x; по окончании работы подпрограммы содержит преобразованный ряд a; |
| n - | заданная длина массива x (тип: целый). |
Версии: нет
Вызываемые подпрограммы
| ftf1c_c - | вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье. |
Замечания по использованию
| Длина n преобразуемого ряда должна удовлетворять условию n = 2 m + 1, m > 2, целое. B противном случае pезультат работы подпрограммы не определен. |
int main(void)
{
/* Initialized data */
static float x[9] = { 1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f };
/* Local variables */
static int n, i;
extern int ftfcr_c(float *, int *);
n = 9;
ftfcr_c(x, &n);
for (i = 1; i <= 9; ++i) {
printf("\n %16.7e \n",x[i-1]);
}
return 0;
} /* main */
Результаты:
x = ( 40., -13.13707, 0., -1.6199, 0., -0.723231, 0., -0.519783065, 0. )