среда, 26 ноября 2014 г.

Пример ДПФ

Рассмотрим пример умножения тригонометрической функции на комплексную экспоненту.
Рассмотрим сначала функцию косинуса:
Возьмем N = 16, тогда n = [-8, 8). Целое число "4" показывает сколько полных периодов тригонометрической функции лежит в N отсчетах. Спектр такого сигнала:
Спектр симметричен относительно середины и принимает ненулевые значения в точке +- 4. Почему так получается легче всего продемонстрировать в показательной форме, используя формулу Эйлера:

Видно, что косинус представляется двумя комплексными экспонентами с половинной амплитудой и частотами альфа и минус альфа. Для синуса можно проделать те же действия, изменив аргумент на 
Теперь умножим косинус на комплексную экспоненту той же частоты: 

 Получим спектр копию исходного, сдвинутого влево:
При этом видно, что правый пик сдвинулся на нуль. Если перемножить косинус в показательной форме на комплексную экспоненту с одинаковыми частотами, то получится:
Появилось постоянное смещение, равно 1/2. Значение амплитуды получается умножением N = 16 на постоянную составляющую. Так же стоит отметить, что спектр периодичен, потому что 

Рассмотрим пример. Посчитаем 16 точечное ДПФ входной последовательности вида: 
Представим этот сигнал с частой дискретизации 8 кГц, тогда:



При n = 0..15 вычисленные значения:
xin1
[ 1.     0.707  0.    -0.707 -1.    -0.707 -0.     0.707  1.     0.707  
0.    -0.707 -1.    -0.707 -0.     0.707]

xin2
[-0.354 -0.354  0.354  0.354 -0.354 -0.354  0.354  0.354 -0.354 -0.354
  0.354  0.354 -0.354 -0.354  0.354  0.354]

xin
[ 0.646  0.354  0.354 -0.354 -1.354 -1.061  0.354  1.061  0.646  0.354
  0.354 -0.354 -1.354 -1.061  0.354  1.061]

График входного сигнала

Так я считаю ДПФ на Python:

X = np.array([])

for k in range(N):
    csin = np.exp(-1j*2*np.pi*k*n/N)
    X = np.append(X, sum(xin*csin))


X
[ 0.0000+0.j      0.0000+0.j      8.0000+0.j      0.0000+0.j
 -2.8284+2.8284j  0.0000+0.j      0.0000+0.j      0.0000+0.j      0.0000+0.j
  0.0000+0.j      0.0000+0.j      0.0000+0.j     -2.8284-2.8284j
  0.0000+0.j      8.0000+0.j      0.0000+0.j    ]

abs(X)
[ 0.  0.  8.  0.  4.  0.  0.  0.  0.  0.  0.  0.  4.  0.  8.  0.]

180.0*np.angle(X)/np.pi
[   0.    0.    0.    0.  135.    0.    0.    0.    0.    0.    0.    0.
 -135.    0.    0.    0.]