Дискретне перетворення Фур'є

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

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

Формули перетворень

Витоком ДПФ є неперервне перетворення Фур'є X(f) , яке визначається:

X(f)=+x(t)ej2πftdt

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

X(m)=n=0N1x(n)ej2πnm/N

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

X(m)=n=0N1x(n)(cos(2πnm/N)jsin(2πnm/N))

Позначення:

  • X(m) — m-ий компонент ДПФ, тобто X(0),X(1),X(2),...,
  • m — індекс ДПФ в частотній області, m=0,1,2,3,...,N1,
  • x(n) — послідовність вхідних відліків, x(0),x(1),x(2),...,
  • n — часовий індекс вхідних відліків, n=0,1,2,3,...,N1,
  • N — кількість відліків вхідної послідовності і кількість частотних відліків результату ДПФ.

Якщо представити довільний відлік ДПФ X(m) як суму дійсних і уявних частин:

X(m)=Xre(m)+jXim(m)=Xmag з кутом Xϕ(m),

то амплітуда X(m) обчислюється:

Xmag(m)=|X(m)|=Xre(m)2+Xim(m)2

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

Xϕ(m)=tan1(Xim(m)/Xmag(m))

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

XPS(m)=Xmag(m)2=Xre(m)2+Xim(m)2

Властивості

  1. Симетрія
    X(Nm)=n=0N1x(n)ej2πnm/N
  2. Лінійність
    Якщо вхідна послідовність x1(n) має ДПФ X1(m), а інша вхідна послідовність x2(n) має ДПФ X2(m), то ДПФ суми цих послідовностей xsum(n)=x1(n)+x2(n) рівна: Xsum(m)=X1(m)+X2(m)
  3. Зсув в часі
    Xshifted(m)=ej2πkm/NX(m)

Приклад обчислення

У цьому прикладі ДПФ застосовується до послідовності довжиною N=4, а саме, до вхідного вектора

𝐱=(x0x1x2x3)=(12ii1+2i).

Обчислимо ДПФ 𝐱 за допомогою експоненциальної форми:

X0=ei2π00/41+ei2π01/4(2i)+ei2π02/4(i)+ei2π03/4(1+2i)=2 X1=ei2π10/41+ei2π11/4(2i)+ei2π12/4(i)+ei2π13/4(1+2i)=22i X2=ei2π20/41+ei2π21/4(2i)+ei2π22/4(i)+ei2π23/4(1+2i)=2i X3=ei2π30/41+ei2π31/4(2i)+ei2π32/4(i)+ei2π33/4(1+2i)=4+4i

що дає 𝐗=(X0X1X2X3)=(222i2i4+4i).

Приклад програми

Нижче подано приклад функції обчислення ДПФ на мові програмування 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;
      }
}

Див. також

Джерела

Посилання