Учебники

SciPy — FFTpack

Преобразование Фурье вычисляется на сигнале временной области, чтобы проверить его поведение в частотной области. Преобразование Фурье находит свое применение в таких дисциплинах, как обработка сигналов и шумов, обработка изображений, обработка аудиосигналов и т. Д. SciPy предлагает модуль fftpack, который позволяет пользователю быстро вычислять преобразования Фурье.

Ниже приведен пример функции синуса, которая будет использоваться для вычисления преобразования Фурье с использованием модуля fftpack.

Быстрое преобразование Фурье

Давайте разберемся, что такое быстрое преобразование Фурье.

Одномерное дискретное преобразование Фурье

БПФ y [k] длины N последовательности длина-N x [n] вычисляется с помощью функции fft (), а обратное преобразование вычисляется с использованием ifft (). Давайте рассмотрим следующий пример

#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft

#create an array with random n numbers
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])

#Applying the fft function
y = fft(x)
print y

Вышеуказанная программа сгенерирует следующий вывод.

[ 4.50000000+0.j           2.08155948-1.65109876j   -1.83155948+1.60822041j
 -1.83155948-1.60822041j   2.08155948+1.65109876j ]

Давайте посмотрим на другой пример

#FFT is already in the workspace, using the same workspace to for inverse transform

yinv = ifft(y)

print yinv

Вышеуказанная программа сгенерирует следующий вывод.

[ 1.0+0.j   2.0+0.j   1.0+0.j   -1.0+0.j   1.5+0.j ]

Модуль scipy.fftpack позволяет вычислять быстрые преобразования Фурье. В качестве иллюстрации (шумный) входной сигнал может выглядеть следующим образом:

import numpy as np
time_step = 0.02
period = 5.
time_vec = np.arange(0, 20, time_step)
sig = np.sin(2 * np.pi / period * time_vec) + 0.5 *np.random.randn(time_vec.size)
print sig.size

Мы создаем сигнал с шагом по времени 0,02 секунды. Последний оператор печатает размер сигнала sig. Вывод будет следующим:

1000

Мы не знаем частоту сигнала; мы знаем только шаг времени выборки сигнала sig. Предполагается, что сигнал исходит от реальной функции, поэтому преобразование Фурье будет симметричным. Функция scipy.fftpack.fftfreq () сгенерирует частоты дискретизации, а scipy.fftpack.fft () вычислит быстрое преобразование Фурье.

Позвольте нам понять это с помощью примера.

from scipy import fftpack
sample_freq = fftpack.fftfreq(sig.size, d = time_step)
sig_fft = fftpack.fft(sig)
print sig_fft

Вышеуказанная программа сгенерирует следующий вывод.

array([ 
   25.45122234 +0.00000000e+00j,   6.29800973 +2.20269471e+00j,
   11.52137858 -2.00515732e+01j,   1.08111300 +1.35488579e+01j,
   …….])

Дискретное косинусное преобразование

Дискретное косинусное преобразование (DCT) выражает конечную последовательность точек данных в виде суммы косинусных функций, колеблющихся на разных частотах. SciPy предоставляет DCT с функцией dct и соответствующий IDCT с функцией idct . Давайте рассмотрим следующий пример.

from scipy.fftpack import dct
print dct(np.array([4., 3., 5., 10., 5., 3.]))

Вышеуказанная программа сгенерирует следующий вывод.

array([ 60.,  -3.48476592,  -13.85640646,  11.3137085,  6.,  -6.31319305])

Обратное дискретное косинусное преобразование восстанавливает последовательность из ее коэффициентов дискретного косинусного преобразования (DCT). Функция idct является обратной функцией dct. Давайте поймем это на следующем примере.

from scipy.fftpack import dct
print idct(np.array([4., 3., 5., 10., 5., 3.]))

Вышеуказанная программа сгенерирует следующий вывод.