SciPy - FFTpack

Fourier Transformationđược tính toán trên một tín hiệu miền thời gian để kiểm tra hành vi của nó trong miền tần số. Phép biến đổi Fourier được ứng dụng trong các lĩnh vực như xử lý tín hiệu và nhiễu, xử lý hình ảnh, xử lý tín hiệu âm thanh, v.v. SciPy cung cấp mô-đun fftpack, cho phép người dùng tính toán các phép biến đổi Fourier nhanh chóng.

Sau đây là một ví dụ về một hàm sin, sẽ được sử dụng để tính toán biến đổi Fourier bằng cách sử dụng mô-đun fftpack.

Biến đổi Fourier nhanh

Hãy để chúng tôi hiểu chi tiết về biến đổi Fourier nhanh là gì.

Biến đổi Fourier rời rạc một chiều

FFT y [k] độ dài N của dãy-N độ dài x [n] được tính bằng fft () và phép biến đổi nghịch đảo được tính bằng ifft (). Chúng ta hãy xem xét ví dụ sau

#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

Chương trình trên sẽ tạo ra kết quả sau.

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

Hãy để chúng tôi xem xét một ví dụ khác

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

yinv = ifft(y)

print yinv

Chương trình trên sẽ tạo ra kết quả sau.

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

Các scipy.fftpackcho phép tính toán các phép biến đổi Fourier nhanh chóng. Như một minh họa, tín hiệu đầu vào (nhiễu) có thể trông như sau:

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

Chúng tôi đang tạo ra một tín hiệu với bước thời gian là 0,02 giây. Câu lệnh cuối cùng in ra kích thước của tín hiệu sig. Kết quả sẽ như sau:

1000

Chúng tôi không biết tần số tín hiệu; chúng ta chỉ biết bước thời gian lấy mẫu của tín hiệu sig. Tín hiệu được cho là đến từ một hàm thực, vì vậy biến đổi Fourier sẽ là đối xứng. Cácscipy.fftpack.fftfreq() hàm sẽ tạo ra các tần số lấy mẫu và scipy.fftpack.fft() sẽ tính toán biến đổi Fourier nhanh.

Hãy để chúng tôi hiểu điều này với sự trợ giúp của một ví dụ.

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

Chương trình trên sẽ tạo ra kết quả sau.

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

Biến đổi Cosine rời rạc

A Discrete Cosine Transform (DCT)biểu diễn một chuỗi hữu hạn các điểm dữ liệu dưới dạng tổng các hàm cosin dao động ở các tần số khác nhau. SciPy cung cấp một DCT với chức năngdct và một IDCT tương ứng với chức năng idct. Chúng ta hãy xem xét ví dụ sau.

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

Chương trình trên sẽ tạo ra kết quả sau.

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

Phép biến đổi cosin rời rạc nghịch đảo tái tạo lại một chuỗi từ các hệ số biến đổi cosin rời rạc (DCT) của nó. Hàm idct là nghịch đảo của hàm dct. Hãy để chúng tôi hiểu điều này với ví dụ sau.

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

Chương trình trên sẽ tạo ra kết quả sau.

array([ 39.15085889, -20.14213562, -6.45392043, 7.13341236,
8.14213562, -3.83035081])