Рассмотрим пример умножения тригонометрической функции на комплексную экспоненту.
Рассмотрим сначала функцию косинуса:
Возьмем 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:
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.]