Дискретне перетворення Фур'є (ДПФ, англ. Discrete Fourier Transform) — це математична процедура, що використовується для визначення гармонічного, або частотного, складу дискретних сигналів. ДПФ є однією з найбільш розповсюджених і потужних процедур цифрової обробки сигналів. ДПФ дозволяє аналізувати, перетворювати і синтезувати сигнали такими способами, які неможливі при неперервній (аналоговій) обробці.
Формули перетворень
Витоком ДПФ є неперервне перетворення Фур'є
, яке визначається:

Експоненціальна форма:

Тригонометрична форма:

Позначення:
—
-ий компонент ДПФ, тобто
,
— індекс ДПФ в частотній області,
,
— послідовність вхідних відліків,
,
— часовий індекс вхідних відліків,
,
— кількість відліків вхідної послідовності і кількість частотних відліків результату ДПФ.
Якщо представити довільний відлік ДПФ
як суму дійсних і уявних частин:
з кутом
,
то амплітуда
обчислюється:

Фазовий кут
,
, обчислюється так:

Потужність відліків
, яка називається спектром потужності, являє собою амплітуду, піднесену до квадрату:

Властивості
- Симетрія

- Лінійність
Якщо вхідна послідовність
має ДПФ
, а інша вхідна послідовність
має ДПФ
, то ДПФ суми цих послідовностей
рівна: 
- Зсув в часі

Приклад обчислення
У цьому прикладі ДПФ застосовується до послідовності довжиною
, а саме, до вхідного вектора
Обчислимо ДПФ
за допомогою експоненциальної форми:
що дає
Приклад програми
Нижче подано приклад функції обчислення ДПФ на мові програмування C#
// Структура комлексних чисел
public struct Complex
{
public double Re;
public double Im;
public Complex(double Re, double Im)
{
this.Re = Re;
this.Im = Im;
}
}
public double Sqr(double x)
{
return x*x;
}
// x - послідовність вхідних відліків
// X - послідовність вихідних відліків
// AS - спектр амплітуд
// FS - спектр фаз
// PS - спектр потужностей
// N - кількість відліків
public void DFT(double[] x, ref Complex[] X, ref double[] AS, ref double[] FS, ref double[] PS, int N)
{
Complex S = new Complex();
Complex[] XC = new Complex[N];
int k, n;
for (k = 0; k < N; k++)
{
S.Re = 0.0;
S.Im = 0.0;
for (n = 0; n < N; n++)
{
S.Re += x[n] * Math.Cos(2 * Math.PI * k * n / N);
S.Im -= x[n] * Math.Sin(2 * Math.PI * k * n / N);
}
X[k].Re = S.Re;
X[k].Im = S.Im;
}
for (k = 0; k < N; k++)
{
AS[k] = Math.Sqrt(Sqr(X[k].Re) + Sqr(X[k].Im)) / (N / 2);
PS[k] = X[k].Re * X[k].Re + X[k].Im * X[k].Im;
if (Math.Abs(X[k].Re) < 1e-5)
{
if (X[k].Im > 1e-5)
FS[k] = 90;
if (Math.Abs(X[k].Im) < 1e-5)
FS[k] = 0;
if ((X[k].Im < 0) && (Math.Abs(X[k].Im) > 1e-5))
FS[k] = -90;
}
else
FS[k] = Math.Atan2(X[k].Im, X[k].Re) * 180.0 / Math.PI;
}
}
Див. також
Джерела
Посилання