Thuật toán FFT Python

Phân tích Fourier là một phương pháp biểu diễn hàm dưới dạng tổng của các thành phần tuần hoàn và để khôi phục tín hiệu từ các thành phần đó. Khi cả hàm và phép biến đổi Fourier của nó được thay thế bằng các phép đối rời rạc, nó được gọi là phép biến đổi Fourier rời rạc [DFT]. DFT đã trở thành nền tảng chính của điện toán số một phần là do thuật toán rất nhanh để tính toán nó, được gọi là Biến đổi Fourier nhanh [FFT], đã được Gauss [1805] biết đến và được đưa ra ánh sáng ở dạng hiện tại bởi Cooley và . Báo chí và cộng sự. cung cấp phần giới thiệu dễ tiếp cận về phân tích Fourier và các ứng dụng của nó

FFT y[k] có độ dài \[N\] có độ dài- \ sequence x[n] is defined as

\[y[k] = \sum_{n=0}^{N-1} e^{-2 \pi j \frac{k n}{N} } x[n] \, ,\]

và phép biến đổi nghịch đảo được định nghĩa như sau

\[x[n] = \frac{1}{N} \sum_{k=0}^{N-1} e^{2 \pi j \frac{k n}{N} } y[k] \,. \]

Các phép biến đổi này có thể được tính bằng và , tương ứng, như minh họa trong ví dụ sau

>>> from scipy.fft import fft, ifft
>>> import numpy as np
>>> x = np.array[[1.0, 2.0, 1.0, -1.0, 1.5]]
>>> y = fft[x]
>>> y
array[[ 4.5       +0.j        ,  2.08155948-1.65109876j,
       -1.83155948+1.60822041j, -1.83155948-1.60822041j,
        2.08155948+1.65109876j]]
>>> yinv = ifft[y]
>>> yinv
array[[ 1.0+0.j,  2.0+0.j,  1.0+0.j, -1.0+0.j,  1.5+0.j]]

Từ định nghĩa của FFT có thể thấy rằng

\[y[0] = \sum_{n=0}^{N-1} x[n] \,. \]

trong ví dụ

>>> np.sum[x]
4.5

tương ứng với \[y[0]\] . Đối với N chẵn, các phần tử \[y[1]. y[N/2-1]\] chứa các số hạng có tần suất dương và các phần tử \[y[N/2]. y[N-1]\] chứa các thuật ngữ có tần suất âm, theo thứ tự tần suất âm giảm dần. Đối với N lẻ, các phần tử \[y[1]. y[[N-1]/2]\] chứa các số hạng tần số dương và các phần tử \[y[[N+1]/ . y[N-1]\] chứa các thuật ngữ có tần suất âm, theo thứ tự tần suất âm giảm dần.

Trong trường hợp dãy x có giá trị thực, các giá trị của \[y[n]\] cho tần số dương là liên hợp . Thông thường, chỉ FFT tương ứng với tần số dương được vẽ. \[y[n]\] for negative frequencies [because the spectrum is symmetric]. Typically, only the FFT corresponding to positive frequencies is plotted.

Ví dụ vẽ đồ thị FFT của tổng hai sin

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 2.0/N * np.abs[yf[0:N//2]]]
>>> plt.grid[]
>>> plt.show[]

Tín hiệu đầu vào FFT vốn đã bị cắt bớt. Việc cắt bớt này có thể được mô hình hóa như phép nhân của một tín hiệu vô hạn với hàm cửa sổ hình chữ nhật. Trong miền phổ, phép nhân này trở thành tích chập của phổ tín hiệu với phổ hàm cửa sổ, có dạng \[\sin[x]/x\] . Sự tích chập này là nguyên nhân của một hiệu ứng gọi là rò rỉ quang phổ [xem ]. Tạo cửa sổ tín hiệu bằng chức năng cửa sổ chuyên dụng giúp giảm thiểu rò rỉ quang phổ. Ví dụ bên dưới sử dụng cửa sổ Blackman từ scipy. tín hiệu và hiển thị hiệu ứng của cửa sổ [thành phần 0 của FFT đã bị cắt bớt nhằm mục đích minh họa].

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> from scipy.signal import blackman
>>> w = blackman[N]
>>> ywf = fft[y*w]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.semilogy[xf[1:N//2], 2.0/N * np.abs[yf[1:N//2]], '-b']
>>> plt.semilogy[xf[1:N//2], 2.0/N * np.abs[ywf[1:N//2]], '-r']
>>> plt.legend[['FFT', 'FFT w. window']]
>>> plt.grid[]
>>> plt.show[]

Trường hợp dãy x có giá trị phức thì phổ không còn đối xứng. Để đơn giản hóa việc làm việc với các hàm FFT, scipy cung cấp hai hàm trợ giúp sau

Hàm trả về các điểm tần số mẫu FFT

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]

Theo tinh thần tương tự, chức năng này cho phép hoán đổi nửa dưới và nửa trên của vectơ để nó trở nên phù hợp để hiển thị

>>> from scipy.fft import fftshift
>>> x = np.arange[8]
>>> fftshift[x]
array[[4, 5, 6, 7, 0, 1, 2, 3]]

Ví dụ dưới đây vẽ biểu đồ FFT của hai cấp số nhân phức tạp;

>>> from scipy.fft import fft, fftfreq, fftshift
>>> import numpy as np
>>> # number of signal points
>>> N = 400
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.exp[50.0 * 1.j * 2.0*np.pi*x] + 0.5*np.exp[-80.0 * 1.j * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T]
>>> xf = fftshift[xf]
>>> yplot = fftshift[yf]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 1.0/N * np.abs[yplot]]
>>> plt.grid[]
>>> plt.show[]

Hàm tính toán FFT của một chuỗi thực và xuất các hệ số FFT phức tạp \[y[n]\] chỉ cho một nửa . Các thành phần tần số âm còn lại được ngụ ý bởi tính đối xứng Hermiti của FFT đối với đầu vào thực [

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> from scipy.signal import blackman
>>> w = blackman[N]
>>> ywf = fft[y*w]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.semilogy[xf[1:N//2], 2.0/N * np.abs[yf[1:N//2]], '-b']
>>> plt.semilogy[xf[1:N//2], 2.0/N * np.abs[ywf[1:N//2]], '-r']
>>> plt.legend[['FFT', 'FFT w. window']]
>>> plt.grid[]
>>> plt.show[]
1]. Trường hợp N chẵn. \[[Re[y[0]] + 0j, y[1],. , Re[y[N/2]] + 0j]\] ; . , y[N/2]\] \[[Re[y[0]] + 0j, y[1], ..., y[N/2]\] . Các thuật ngữ được hiển thị rõ ràng như \[Re[y[k]] + 0j\] bị hạn chế là hoàn toàn thực vì, theo tính chất ẩn sĩ, chúng .

Hàm tương ứng tính toán IFFT của các hệ số FFT với thứ tự đặc biệt này

________số 8

Lưu ý rằng các tín hiệu có độ dài lẻ và chẵn có cùng hình dạng. Theo mặc định, giả sử tín hiệu đầu ra phải có độ dài bằng nhau. Và như vậy đối với các tín hiệu lẻ sẽ cho kết quả sai

>>> irfft[yr]
array[[ 1.70788987,  2.40843925, -0.37366961,  0.75734049]]

Để khôi phục tín hiệu có độ dài lẻ ban đầu, chúng ta phải chuyển hình dạng đầu ra theo tham số n

>>> np.sum[x]
4.5
0

Các chức năng và cung cấp 2-D FFT và IFFT tương ứng. Tương tự và cung cấp ND FFT và IFFT tương ứng

Đối với các tín hiệu đầu vào thực, tương tự như , chúng ta có các hàm và đối với các phép biến đổi thực 2-D;

Ví dụ bên dưới minh họa một IFFT 2-D và biểu thị các tín hiệu miền thời gian [2-D] kết quả

>>> np.sum[x]
4.5
0

SciPy cung cấp DCT có chức năng và IDCT tương ứng có chức năng. Có 8 loại DCT , ; . “The” DCT thường đề cập đến DCT loại 2 và “the” DCT nghịch đảo thường đề cập đến DCT loại 3. Ngoài ra, các hệ số DCT có thể được chuẩn hóa theo cách khác [đối với hầu hết các loại, scipy cung cấp

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
6 và
>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
7]. Hai tham số của lệnh gọi hàm dct/idct cho phép thiết lập loại DCT và chuẩn hóa hệ số

Đối với mảng một chiều x, dct[x, norm=’ortho’] bằng MATLAB dct[x]

SciPy sử dụng định nghĩa sau về DCT-I không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = x_0 + [-1]^k x_{N-1} + 2\sum_{n=1}^{N-2} x[n] \cos\left[\frac{\pi . \]

Lưu ý rằng DCT-I chỉ được hỗ trợ cho kích thước đầu vào > 1

SciPy sử dụng định nghĩa sau về DCT-II không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = 2 \sum_{n=0}^{N-1} x[n] \cos \left[{\pi[2n+1]k \over 2N} \right] \qquad 0 \ . \]

Trong trường hợp DCT được chuẩn hóa [

>>> from scipy.fft import fftshift
>>> x = np.arange[8]
>>> fftshift[x]
array[[4, 5, 6, 7, 0, 1, 2, 3]]
0], hệ số DCT \[y[k]\] được nhân với hệ số tỷ lệ .

\[\begin{split}f = \begin{cases} \sqrt{1/[4N]}, & \text{if $k = 0$} \\ \sqrt{1/[2N]}, & \text . \end{split}\]

Trong trường hợp này, “các hàm cơ sở” DCT \[\phi_k[n] = 2 f \cos \left[{\pi[2n+1]k \over . become orthonormal:

\[\sum_{n=0}^{N-1} \phi_k[n] \phi_l[n] = \delta_{lk}. \]

SciPy sử dụng định nghĩa sau về DCT-III không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = x_0 + 2 \sum_{n=1}^{N-1} x[n] \cos\left[{\pi n[2k+1] \over 2N}\right] \qquad

hoặc, cho

>>> from scipy.fft import fftshift
>>> x = np.arange[8]
>>> fftshift[x]
array[[4, 5, 6, 7, 0, 1, 2, 3]]
0

\[y[k] = {x_0\over\sqrt{N}} + {2\over\sqrt{N}} \sum_{n=1}^{N-1} x[n] \cos\left[ . \]

SciPy sử dụng định nghĩa sau về DCT-IV không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = 2 \sum_{n=0}^{N-1} x[n] \cos\left[{\pi [2n+1][2k+1] \over 4N}\right]

hoặc, cho

>>> from scipy.fft import fftshift
>>> x = np.arange[8]
>>> fftshift[x]
array[[4, 5, 6, 7, 0, 1, 2, 3]]
0

\[y[k] = \sqrt{2\over N}\sum_{n=0}^{N-1} x[n] \cos\left[{\pi [2n+1][2k+1]

DCT-III [không chuẩn hóa] là nghịch đảo của DCT-II [không chuẩn hóa], lên đến hệ số 2N. DCT-III trực giao chính xác là nghịch đảo của DCT-II trực giao. Hàm thực hiện ánh xạ giữa các loại DCT và IDCT, cũng như chuẩn hóa chính xác

Ví dụ sau đây cho thấy mối quan hệ giữa DCT và IDCT đối với các loại và chuẩn hóa khác nhau

>>> np.sum[x]
4.5
1

DCT-II và DCT-III là nghịch đảo của nhau, vì vậy đối với phép biến đổi trực giao, chúng tôi quay trở lại tín hiệu ban đầu

>>> np.sum[x]
4.5
2

Tuy nhiên, thực hiện tương tự theo chuẩn hóa mặc định, chúng tôi chọn một hệ số tỷ lệ bổ sung là \[2N=10\] kể từ chuyển tiếp .

>>> np.sum[x]
4.5
3

Vì lý do này, chúng ta nên sử dụng hàm sử dụng cùng loại cho cả hai, cho kết quả chuẩn hóa chính xác

>>> np.sum[x]
4.5
4

Có thể thấy các kết quả tương tự đối với DCT-I, kết quả này ngược lại với hệ số của \[2[N-1]\].

>>> np.sum[x]
4.5
5

Và đối với DCT-IV, cũng là nghịch đảo của chính nó với hệ số \[2N\] .

>>> np.sum[x]
4.5
6

DCT thể hiện “thuộc tính nén năng lượng”, nghĩa là đối với nhiều tín hiệu, chỉ một vài hệ số DCT đầu tiên có cường độ đáng kể. Loại bỏ các hệ số khác dẫn đến một lỗi tái tạo nhỏ, một thực tế được khai thác trong quá trình nén tín hiệu bị mất [e. g. nén JPEG]

Ví dụ dưới đây cho thấy tín hiệu x và hai lần tái tạo [ \[x_{20}\]\[x_{15}\]] from the signal’s DCT coefficients. The signal \[x_{20}\] được tạo lại từ 20 hệ số DCT đầu tiên, \[x_{ . Có thể thấy sai số tương đối khi sử dụng 20 hệ số vẫn rất nhỏ [~0. 1%], nhưng cung cấp tỷ lệ nén gấp năm lần. is reconstructed from the first 15 DCT coefficients. It can be seen that the relative error of using 20 coefficients is still very small [~0.1%], but provides a five-fold compression rate.

>>> np.sum[x]
4.5
7

SciPy cung cấp DST với chức năng và IDST tương ứng với chức năng

Về mặt lý thuyết, có 8 loại DST cho các kết hợp khác nhau của các điều kiện biên chẵn/lẻ và độ lệch biên, chỉ 4 loại đầu tiên được triển khai trong scipy

DST-I giả sử đầu vào là số lẻ khoảng n=-1 và n=N. SciPy sử dụng định nghĩa sau về DST-I không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = 2\sum_{n=0}^{N-1} x[n] \sin\left[ \pi {[n+1] [k+1]}\over{N+1 . \]

Cũng lưu ý rằng DST-I chỉ được hỗ trợ cho kích thước đầu vào > 1. DST-I [không chuẩn hóa] là nghịch đảo của chính nó, lên đến hệ số 2[N+1]

DST-II giả sử đầu vào là số lẻ khoảng n=-1/2 và chẵn khoảng n=N. SciPy sử dụng định nghĩa sau về DST-II không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = 2 \sum_{n=0}^{N-1} x[n] \sin\left[ {\pi [n+1/2][k+1]} \over N \ . \]

DST-III giả sử đầu vào là số lẻ khoảng n=-1 và chẵn khoảng n=N-1. SciPy sử dụng định nghĩa sau về DST-III không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = [-1]^k x[N-1] + 2 \sum_{n=0}^{N-2} x[n] \sin \left[ {\pi [n+1] . \]

SciPy sử dụng định nghĩa sau về DST-IV không chuẩn hóa [

>>> from scipy.fft import fftfreq
>>> freq = fftfreq[8, 0.125]
>>> freq
array[[ 0., 1., 2., 3., -4., -3., -2., -1.]]
8]

\[y[k] = 2 \sum_{n=0}^{N-1} x[n] \sin\left[{\pi [2n+1][2k+1] \over 4N}\right]

hoặc, cho

>>> from scipy.fft import fftshift
>>> x = np.arange[8]
>>> fftshift[x]
array[[4, 5, 6, 7, 0, 1, 2, 3]]
0

\[y[k] = \sqrt{2\over N}\sum_{n=0}^{N-1} x[n] \sin\left[{\pi [2n+1][2k+1]

Ví dụ sau đây cho thấy mối quan hệ giữa DST và IDST đối với các loại và chuẩn hóa khác nhau

>>> np.sum[x]
4.5
8

DST-II và DST-III là nghịch đảo của nhau, vì vậy đối với phép biến đổi trực giao, chúng tôi quay trở lại tín hiệu ban đầu

>>> np.sum[x]
4.5
9

Tuy nhiên, thực hiện tương tự theo chuẩn hóa mặc định, chúng tôi chọn một hệ số tỷ lệ bổ sung là \[2N=10\] kể từ chuyển tiếp .

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 2.0/N * np.abs[yf[0:N//2]]]
>>> plt.grid[]
>>> plt.show[]
0

Vì lý do này, chúng ta nên sử dụng hàm sử dụng cùng loại cho cả hai, cho kết quả chuẩn hóa chính xác

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 2.0/N * np.abs[yf[0:N//2]]]
>>> plt.grid[]
>>> plt.show[]
1

Có thể thấy các kết quả tương tự đối với DST-I, kết quả này ngược lại với hệ số của \[2[N-1]\].

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 2.0/N * np.abs[yf[0:N//2]]]
>>> plt.grid[]
>>> plt.show[]
2

Và đối với DST-IV, cũng là nghịch đảo của chính nó với hệ số \[2N\] .

>>> from scipy.fft import fft, fftfreq
>>> import numpy as np
>>> # Number of sample points
>>> N = 600
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.sin[50.0 * 2.0*np.pi*x] + 0.5*np.sin[80.0 * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T][:N//2]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 2.0/N * np.abs[yf[0:N//2]]]
>>> plt.grid[]
>>> plt.show[]
3

SciPy cung cấp các chức năng

>>> from scipy.fft import fft, fftfreq, fftshift
>>> import numpy as np
>>> # number of signal points
>>> N = 400
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.exp[50.0 * 1.j * 2.0*np.pi*x] + 0.5*np.exp[-80.0 * 1.j * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T]
>>> xf = fftshift[xf]
>>> yplot = fftshift[yf]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 1.0/N * np.abs[yplot]]
>>> plt.grid[]
>>> plt.show[]
5 và
>>> from scipy.fft import fft, fftfreq, fftshift
>>> import numpy as np
>>> # number of signal points
>>> N = 400
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.exp[50.0 * 1.j * 2.0*np.pi*x] + 0.5*np.exp[-80.0 * 1.j * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T]
>>> xf = fftshift[xf]
>>> yplot = fftshift[yf]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 1.0/N * np.abs[yplot]]
>>> plt.grid[]
>>> plt.show[]
6 để thực hiện Biến đổi Hankel Nhanh [FHT] và nghịch đảo của nó [IFHT] trên các mảng đầu vào có khoảng cách logarit

FHT là phiên bản rời rạc của biến đổi Hankel liên tục được xác định bởi

\[A[k] = \int_{0}^{\infty} \. a[r] \, J_{\mu}[kr] \, k \, dr \;,\]

với \[J_{\mu}\] hàm Bessel của bậc \[\ . Dưới sự thay đổi của các biến . Under a change of variables \[r \to \log r\] , \[k \to \log, this becomes

\[A[e^{\log k}] = \int_{0}^{\infty} \. a[e^{\log r}] \, J_{\mu}[e^{\log k + \log r}] \, e^{\log k + \log r} \, d{\log r

đó là một tích chập trong không gian logarit. Thuật toán FHT sử dụng FFT để thực hiện tích chập này trên dữ liệu đầu vào rời rạc

Phải cẩn thận để giảm thiểu đổ chuông số do tính chất vòng tròn của tích chập FFT. Để đảm bảo rằng điều kiện đổ chuông thấp được giữ, mảng đầu ra có thể được dịch chuyển một chút bằng một phần bù được tính bằng hàm

>>> from scipy.fft import fft, fftfreq, fftshift
>>> import numpy as np
>>> # number of signal points
>>> N = 400
>>> # sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace[0.0, N*T, N, endpoint=False]
>>> y = np.exp[50.0 * 1.j * 2.0*np.pi*x] + 0.5*np.exp[-80.0 * 1.j * 2.0*np.pi*x]
>>> yf = fft[y]
>>> xf = fftfreq[N, T]
>>> xf = fftshift[xf]
>>> yplot = fftshift[yf]
>>> import matplotlib.pyplot as plt
>>> plt.plot[xf, 1.0/N * np.abs[yplot]]
>>> plt.grid[]
>>> plt.show[]
7

[]

Cooley, James W. , và John W. Tukey, 1965, “Một thuật toán để tính toán bằng máy các chuỗi Fourier phức,” Math. máy tính. 19. 297-301

[]

Nhấn, W. , Teukolsky, S. , Vetterline, W. T. , và Flannery, B. P. , 2007, Công thức số. Nghệ thuật tính toán khoa học, ch. 12-13. đại học Cambridge. Báo chí, Cambridge, Vương quốc Anh

[ Mak ] [,]

J. Makhoul, 1980, ‘A Fast Cosine Transform in One and Two Dimensions’, IEEE Transactions on acoustics, speech and signal processing vol. 28[1], trang. 27-34, DOI. 10. 1109/TASSP. 1980. 1163351

[ Ham00 ] [,]

A. J. S. Hamilton, 2000, “Các chế độ không tương quan của phổ công suất phi tuyến tính”, MNRAS, 312, 257. DOI. 10. 1046/j. 1365-8711. 2000. 03071. x

Làm cách nào để triển khai FFT trong Python?

VÍ DỤ. Sử dụng hàm fft và ifft từ scipy để tính phổ biên độ FFT và FFT nghịch đảo để thu được tín hiệu ban đầu . Vẽ cả hai kết quả. Thời gian hàm fft sử dụng tín hiệu độ dài 2000 này. Bây giờ chúng ta có thể thấy rằng các hàm fft tích hợp nhanh hơn và dễ sử dụng hơn nhiều, đặc biệt là đối với phiên bản scipy.

Python FFT hoạt động như thế nào?

Hàm nhận một tần số, freq và sau đó trả về các giá trị x và y mà bạn sẽ sử dụng để vẽ biểu đồ sóng . Các tọa độ x của sóng hình sin cách đều nhau giữa 0 và DURATION , vì vậy mã sử dụng linspace[] của NumPy để tạo chúng. Nó nhận một giá trị bắt đầu, một giá trị kết thúc và số lượng mẫu để tạo.

Thuật toán FFT là gì?

Biến đổi Fourier nhanh [FFT] là thuật toán tính toán biến đổi Fourier rời rạc [DFT] của một chuỗi hoặc nghịch đảo của nó [IDFT]. Fourier analysis converts a signal from its original domain [often time or space] to a representation in the frequency domain and vice versa.

Python biến đổi Fourier nhanh là gì?

Đây là thuật toán đóng vai trò rất quan trọng trong việc tính toán Biến đổi Fourier rời rạc của một dãy . Nó chuyển đổi tín hiệu không gian hoặc thời gian thành tín hiệu của miền tần số. Tín hiệu DFT được tạo bằng cách phân phối các chuỗi giá trị cho các thành phần tần số khác nhau.

Chủ Đề