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