FAST Fourier transformation with NumPy I; 快速傅立葉轉換 I
產生一個1000個點的頻率爲5Hz的sine波矩陣,並利用傅立葉轉換轉換值域
Example Code
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.fftpack import fft, ifft
- def GenSin(x,Hz):
- return np.sin(2*np.pi*Hz*x)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N)
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5)
- xf = np.abs(fft(dataY))
- plt.figure(1);
- plt.subplot(211);
- plt.xlabel('s')
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212);
- freq = np.fft.fftfreq(N, d=1/1000)
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.xlabel('Hz')
- plt.subplots_adjust(hspace=0.3, left=0.1, right=0.95, bottom=0.1, top=0.95)
- plt.show()
Note and Comments
- import numpy as np 讀入numpy函式庫並命名為np
- import matplotlib.pyplot as plt 讀入matplotlib.pyplot函式庫並命名為plt
- from scipy.fftpack import fft, ifft 使用scipy中的fft函數庫
- def GenSin(x,Hz): 定義Sine函數, 兩個參數分別為x軸的數值與頻率
- return np.sin(2*np.pi*Hz*x)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N) # 産生一千個數值爲零的點
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5) #將sine wave波型填入dataY中
- xf = np.abs(fft(dataY)) #將dataY做傅立葉轉換
- plt.figure(1);
- plt.subplot(211); #切換到産生1行2列的圖中的第1個附圖
- plt.xlabel('s')
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212); #切換到産生1行2列的圖中的第2個附圖
- freq = np.fft.fftfreq(N, d=1/1000) #利用 np中的fftfreq(N,d)函數產生頻域的X軸(頻率)數值, 其中N是值域的取樣數目, D是取樣週期間隔
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.xlabel('Hz')
- plt.subplots_adjust(hspace=0.3, left=0.1, right=0.95, bottom=0.1, top=0.95)
- plt.show()繪圖
result
FAST Fourier transformation with NumPy I; 快速傅立葉轉換 I
產生一個1000個點並帶誤差值(正負0.5)的sine波矩陣,並利用傅立葉轉換轉換值域
Example Code
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.fftpack import fft, ifft
- def GenSin(a,Hz):
- return np.sin(2*np.pi*Hz*a)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N)
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5) + 1.0*(np.random.rand(1)-0.5)
- xf = np.abs(fft(dataY))
- plt.figure(1);
- plt.subplot(211);
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212);
- freq = np.fft.fftfreq(N, d=1/1000)
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.show()
Note and Comments
- import numpy as np 讀入numpy函式庫並命名為np
- import matplotlib.pyplot as plt 讀入matplotlib.pyplot函式庫並命名為plt
- from scipy.fftpack import fft, ifft 使用scipy中的fft函數庫
- def GenSin(x,Hz): 定義Sine函數, 兩個參數分別為x軸的數值與頻率
- return np.sin(2*np.pi*Hz*x)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N) # 産生一千個數值爲零的點
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5) + 1.0*(np.random.rand(1)-0.5) #將sine wave波型填入dataY中 並加入一個數值範圍在正負0.05的隨機誤差
- xf = np.abs(fft(dataY)) #將dataY做傅立葉轉換
- plt.figure(1);
- plt.subplot(211); #切換到産生1行2列的圖中的第1個附圖
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212); #切換到産生1行2列的圖中的第2個附圖
- freq = np.fft.fftfreq(N, d=1/1000) #利用 np中的fftfreq(N,d)函數產生頻域的X軸(頻率)數值, 其中N是值域的取樣數目, D是取樣週期間隔
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.show()繪圖
result
產生一個1000個點的頻率爲5Hz與15MHz疊加的的sine波矩陣,並利用傅立葉轉換轉換值域
Example Code
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.fftpack import fft, ifft
- def GenSin(x,Hz):
- return np.sin(2*np.pi*Hz*x)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N)
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5) + GenSin(dataX[i],15)
- xf = np.abs(fft(dataY))
- plt.figure(1);
- plt.subplot(211);
- plt.xlabel('s')
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212);
- freq = np.fft.fftfreq(N, d=1/1000)
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.xlabel('Hz')
- plt.subplots_adjust(hspace=0.3, left=0.1, right=0.95, bottom=0.1, top=0.95)
- plt.show()
Note and Comments
- import numpy as np 讀入numpy函式庫並命名為np
- import matplotlib.pyplot as plt 讀入matplotlib.pyplot函式庫並命名為plt
- from scipy.fftpack import fft, ifft 使用scipy中的fft函數庫
- def GenSin(x,Hz): 定義Sine函數, 兩個參數分別為x軸的數值與頻率
- return np.sin(2*np.pi*Hz*x)
- N=1000 #sampling data points
- dataX = np.linspace(0, 1, N) # sampling time = 1/N
- dataY = np.zeros(N) # 産生一千個數值爲零的點
- for i in range(0,N):
- dataY[i] = GenSin(dataX[i],5) + GenSin(dataX[i],15) #將sine wave波型填入dataY中
- xf = np.abs(fft(dataY)) #將dataY做傅立葉轉換
- plt.figure(1);
- plt.subplot(211); #切換到産生1行2列的圖中的第1個附圖
- plt.xlabel('s')
- plt.plot(dataX, dataY, marker=".", linestyle='-',color='#0F0F0F')
- plt.subplot(212); #切換到産生1行2列的圖中的第2個附圖
- freq = np.fft.fftfreq(N, d=1/1000) #利用 np中的fftfreq(N,d)函數產生頻域的X軸(頻率)數值, 其中N是值域的取樣數目, D是取樣週期間隔
- plt.plot(freq[0:N//25], xf[0:N//25],'g-' );
- plt.xlabel('Hz')
- plt.subplots_adjust(hspace=0.3, left=0.1, right=0.95, bottom=0.1, top=0.95)
- plt.show()繪圖
result