Biến đổi Fourier là một cách mạnh mẽ để xem dữ liệu từ một góc độ hoàn toàn khác. Từ miền thời gian sang miền tần số. Nhưng hoạt động mạnh mẽ này có vẻ đáng sợ với các phương trình toán học của nó
Chuyển sóng miền thời gian sang miền tần số
Từ miền thời gian sang miền tần số, còn được gọi là Biến đổi Fourier rời rạc chuyển tiếp hoặc DFT
Hình ảnh bên dưới là một hình ảnh tốt để minh họa Biến đổi Fourier. phân hủy một sóng phức tạp thành nhiều hình sin thông thường
Hình ảnh từ wiki
Dưới đây là hình ảnh động hoàn chỉnh giải thích điều gì sẽ xảy ra khi chuyển đổi dữ liệu sóng miền thời gian sang chế độ xem miền tần số
Gif từ wiki
Ta có thể dễ dàng thao tác dữ liệu trong miền tần số chẳng hạn. loại bỏ sóng nhiễu. Sau đó, chúng ta có thể sử dụng phương trình nghịch đảo này để chuyển đổi dữ liệu miền tần số trở lại sóng miền thời gian
Nghịch đảo miền thời gian từ miền tần số, còn được gọi là Biến đổi Fourier rời rạc nghịch đảo hoặc IDFT
Hãy tạm bỏ qua độ phức tạp của phương trình FT. Giả sử rằng chúng ta đã hoàn toàn hiểu ý nghĩa của các phương trình toán học và hãy sử dụng Biến đổi Fourier để thực hiện một số công việc thực tế trong Python
Cách tốt nhất để hiểu bất cứ điều gì là sử dụng nó, giống như cách tốt nhất để học bơi là bị ướt bằng cách lặn xuống nước
Trộn dữ liệu sạch với tiếng ồnTạo hai sóng hình sin và hợp nhất chúng thành một sóng hình sin, sau đó cố tình làm ô nhiễm sóng sạch bằng dữ liệu được tạo từ ________ 20
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [16,10]
plt.rcParams.update[{'font.size':18}]#Create a simple signal with two frequencies
data_step = 0.001
t = np.arange[start=0,stop=1,step=data_step]
f_clean = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t]
f_noise = f_clean + 2.5*np.random.randn[len[t]]plt.plot[t,f_noise,color='c',Linewidth=1.5,label='Noisy']
plt.plot[t,f_clean,color='k',Linewidth=2,label='Clean']
plt.legend[]
[Việc kết hợp hai tín hiệu để tạo thành tín hiệu thứ ba còn được gọi là tích chập hoặc tích chập tín hiệu. Đây là một chủ đề thú vị khác và ngày nay được sử dụng nhiều trong Mô hình mạng nơ-ron]
Chúng tôi có sóng với nhiễu, màu đen là sóng chúng tôi muốn, đường màu xanh lá cây là nhiễu
Sóng sạch trộn lẫn với tiếng ồn, bởi Andrew Zhu
Nếu tôi ẩn các màu trong biểu đồ, chúng tôi hầu như không thể tách nhiễu ra khỏi dữ liệu sạch. Biến đổi Fourier có thể trợ giúp ở đây, tất cả những gì chúng ta cần làm là chuyển đổi dữ liệu sang một phối cảnh khác, từ chế độ xem thời gian [trục x] sang chế độ xem tần số [trục x sẽ là tần số sóng]
Chuyển đổi từ miền thời gian sang miền tần sốBạn có thể sử dụng
from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
1 hoặc from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
2. Tôi thấy from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
2 khá tiện dụng và đầy đủ chức năng. Ở đây tôi sẽ sử dụng from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
2 trong bài viết này, nhưng đó là lựa chọn của bạn nếu bạn muốn sử dụng các mô-đun khác hoặc thậm chí bạn có thể xây dựng một mô-đun của riêng mình [xem mã sau] dựa trên công thức mà tôi đã trình bày ở phần đầufrom scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
- Trong mã, tôi sử dụng
from scipy.fft import rfft,rfftfreq
2thay vì
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]from scipy.fft import rfft,rfftfreq
3. r có nghĩa là giảm [tôi nghĩ] để chỉ các tần số dương mới được tính. Tất cả các tần số phản chiếu âm sẽ bị bỏ qua. và nó cũng nhanh hơn. xem thêm thảo luận tại đây
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]] - Kết quả
from scipy.fft import rfft,rfftfreq
4 từ hàm
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]from scipy.fft import rfft,rfftfreq
2 là một số phức, có dạng như
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]from scipy.fft import rfft,rfftfreq
6. hàm
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]from scipy.fft import rfft,rfftfreq
7 sẽ tính √[a² + b²] cho các số phức
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
Đây là chế độ xem Miền tần số kỳ diệu của các sóng ban đầu của chúng tôi. trục x biểu thị tần số
Dữ liệu miền tần số, bởi Andrew Zhu
Thứ gì đó có vẻ phức tạp trong miền thời gian giờ được chuyển đổi thành dữ liệu miền tần số rất đơn giản. Hai đỉnh biểu thị tần số của hai sóng hình sin của chúng ta. Một làn sóng là 50Hz, một làn sóng khác là 120Hz. Hãy nhìn lại mã tạo ra sóng hình sin
________số 8Các tần số khác là tiếng ồn, sẽ dễ dàng loại bỏ trong bước tiếp theo
Loại bỏ các tần số tiếng ồnVới sự trợ giúp của Numpy, chúng tôi có thể dễ dàng đặt các dữ liệu tần số đó thành 0 ngoại trừ 50Hz và 120Hz
yf_abs = np.abs[yf]
indices = yf_abs>300 # filter out those value under 300
yf_clean = indices * yf # noise frequency will be set to 0
plt.plot[xf,np.abs[yf_clean]]
Bây giờ, tất cả các tiếng ồn được loại bỏ
Mật mã
from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
0Như kết quả cho thấy, tất cả các sóng nhiễu đều bị loại bỏ
Làn sóng sạch, của Andrew ZhuQuá trình biến đổi hoạt động như thế nào
Quay lại phương trình biến đổi
Từ miền thời gian sang miền tần số, còn được gọi là Biến đổi Fourier rời rạc chuyển tiếp hoặc DFT
Tín hiệu miền thời gian ban đầu được biểu thị bằng chữ thường x. x[n] có nghĩa là điểm dữ liệu miền thời gian ở vị trí n[thời gian]. Điểm dữ liệu trong miền tần số được biểu thị bằng chữ hoa X. X[k] nghĩa là giá trị ở tần số của k
Giả sử, chúng tôi có 10 điểm dữ liệu
from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
1from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
8 phải là 10, vì vậy, phạm vi của from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
9 là 0 đến 9, 10 điểm dữ liệu. f_clean = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t]
0 đại diện cho tần số #, phạm vi của nó là từ 0 đến 9, tại sao? phạm vi của n và k
Trong một ngôn ngữ lập trình truyền thống, nó sẽ cần hai vòng lặp for, một vòng lặp cho
f_clean = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t]
0, một vòng lặp khác cho from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
9. Trong Python, bạn có thể vector hóa hoạt động với 0 vòng lặp for rõ ràng [Expressive Python]Và hỗ trợ số phức riêng của Python thật tuyệt vời. hãy xây dựng hàm Biến đổi Fourier
from scipy.fft import rfft,rfftfreq
n = len[t]
yf = rfft[f_noise]
xf = rfftfreq[n,data_step]
plt.plot[xf,np.abs[yf]]
7Chức năng này tương đối chậm so với chức năng từ
f_clean = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t]
3 hoặc f_clean = np.sin[2*np.pi*50*t] + np.sin[2*np.pi*120*t]
4, nhưng đủ tốt để hiểu chức năng FFT hoạt động như thế nào. Để triển khai nhanh hơn, hãy đọc Jake's Hiểu thuật toán FFTNhững suy nghĩ xa hơn - không phải là một bản tóm tắtÝ tưởng được trình bày từ Biến đổi Fourier thật sâu sắc. Nó nhắc nhở tôi rằng thế giới có thể không giống như những gì bạn nhìn thấy, cuộc sống mà bạn đang sống có thể có một diện mạo mới hoàn toàn khác chỉ có thể được nhìn thấy bằng một loại phép biến đổi, chẳng hạn như Biến đổi Fourier
Bạn không chỉ có thể chuyển đổi dữ liệu âm thanh mà còn cả hình ảnh, video, sóng điện từ hay thậm chí là dữ liệu giao dịch chứng khoán [sóng Kondratiev]
Biến đổi Fourier cũng có thể được giải thích bằng các vòng tạo sóng
từ wiki
Vòng tròn lớn là đất nước của chúng ta, thời đại của chúng ta. Chúng tôi với tư cách là một cá nhân là vòng tròn bên trong nhỏ bé nhỏ bé. Không có vòng tròn lớn điều khiển mọi thứ, chúng ta thực sự không thể làm được gì nhiều
Cách mạng Công nghiệp xảy ra ở Anh chứ không phải ở các nước khác không chỉ đơn giản là do việc áp dụng động cơ hơi nước, mà còn rất nhiều lý do khác. — Tại sao nước Anh công nghiệp hóa đầu tiên. đó là vòng tròn lớn chỉ tồn tại ở Anh vào thời điểm đó
Nếu đôi khi bạn giàu có hoặc rất thành công ở một nơi nào đó, có lẽ không phải tất cả là do công lao của bạn, mà phần lớn là do đất nước của bạn, những người xung quanh bạn hoặc công ty tốt mà bạn làm việc cùng. Nếu không có những vòng tròn lớn thúc đẩy bạn tiến về phía trước, bạn có thể không đạt được những gì bạn có bây giờ
Càng biết nhiều về Biến đổi Fourier, tôi càng ngạc nhiên về Joseph Fourier khi ông nghĩ ra phương trình khó tin này vào năm 1822. Anh ấy không bao giờ có thể biết rằng công việc của mình hiện đang được sử dụng ở khắp mọi nơi trong thế kỷ 21
Phụ lục — Bốn loại biến đổi FourierTất cả Biến đổi Fourier được đề cập trong bài viết này đều đề cập đến Biến đổi Fourier rời rạc
Bốn loại Biến đổi Fourier, của Andrew Zhu
Khi bạn ngồi trước máy tính và cố gắng làm điều gì đó với Biến đổi Fourier, bạn sẽ chỉ sử dụng DFT - Biến đổi đang được thảo luận trong bài viết này. Nếu bạn quyết định đắm mình trong đầm lầy toán học, đây là hai cuốn sách nên đọc
- Miền tần số và phép biến đổi Fourier. Paul W. Sách giáo khoa của Cuff từ Princeton
2. Chương 8 của cuốn sách Xử lý tín hiệu số — của Steven W. Smith họ đã cung cấp liên kết trực tuyến. DSP Ch8
Người giới thiệu- Hướng dẫn tương tác về biến đổi Fourier. https. // giải thích rõ hơn. com/articles/an-interactive-guide-to-the-fourier-transform/
- Biến đổi Fourier Với scipy. fft. Xử lý tín hiệu Python. https. //trăn thật. com/python-scipy-fft/
- Hiểu thuật toán FFT. http. //jakevdp. github. io/blog/2013/08/28/hiểu-the-fft/
- Miền tần số và phép biến đổi Fourier. https. //www. Princeton. edu/~cuff/ele201/kulkarni_text/tần suất. pdf
- Khử nhiễu dữ liệu bằng FFT [Python]. https. //www. youtube. com/watch?v=s2K1JfNR7Sc&ab_channel=SteveBrunton
- Thuật toán FFT — Từng bước đơn giản. https. //www. youtube. com/watch?v=htCj9exbGo0&ab_channel=SimonXu
Nếu bạn có bất kỳ câu hỏi nào, hãy để lại nhận xét và tôi sẽ cố gắng hết sức để trả lời, Nếu bạn phát hiện ra lỗi hoặc sai sót, đừng ngần ngại đánh dấu chúng. Đọc và hỗ trợ của bạn là vòng tròn lớn thúc đẩy tôi tiếp tục viết nhiều hơn. Cảm ơn