<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用遞迴方法
from math import log, ceil, cos, sin, pi import matplotlib.pyplot as plt import numpy as np # 這兩行程式碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def fft(x, N=None): # DIT-FFT 函數說明 # x: 時域序列 # N: N點DFT, 理論上N=2**M # 返回值為序列x的DFT if N is None: N = len(x) elif N < len(x): N = len(x) if N == 2: return [x[0]+x[1], x[0]-x[1]] # 補0使得N=2**M M = ceil(log(N, 2)) N = 2**M x = x + [0] * (N-len(x)) # 遞迴地計算偶數項和奇數項的DFT X1 = fft(x[0::2]) X2 = fft(x[1::2]) X = [0] * N for i in range(N//2): # 蝶形計算 tmp = (cos(2*pi/N*i)-1j*sin(2*pi/N*i))*X2[i] X[i] = X1[i] + tmp X[i+N//2] = X1[i] - tmp return X if __name__ == '__main__': x = [1]*10 y = fft(x, 1024) # print(y) z = [abs(i) for i in y] # print(z) plt.plot(np.arange(len(z))*2/len(z), z, label='10點矩形窗函數的FFT') plt.title("幅度譜") plt.xlabel(r'單位:$pi$') plt.ylabel(r'$|H(jomega)|$') plt.grid(linestyle="-.") plt.legend() plt.show()
使用迴圈,流式計算(極大地節省了記憶體)
from math import log, ceil, cos, sin, pi import matplotlib.pyplot as plt import numpy as np # 這兩行程式碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def fft(x, N=None): # DIT-FFT 函數說明 # x: 時域序列 # N: N點DFT, 理論上N=2**M # 返回值為序列x的DFT """ 採用流式計算方法,只用了一個N(N=2**M)點的陣列記憶體 """ if N is None: N = len(x) elif N < len(x): N = len(x) # 補0使得:N=2**M M = ceil(log(N, 2)) N = 2**M x = x + [0] * (N-len(x)) fm = "{:0"+f"{M}"+"b}" X = [0] * N for i in range(N//2): index1 = eval('0b'+fm.format(i*2)[::-1]) index2 = eval('0b'+fm.format(i*2+1)[::-1]) X[2*i] = x[index1] + x[index2] X[2*i+1] = x[index1] - x[index2] for i in range(1, M): # 第i步表示將2**i點DFT合成2**(i+1)點的DFT # 蝶形寬度width width = 2**i """ 將X(k)序列進行分組,每組2**(i+1)個點, 便於將每組中兩組2**i點DFT合成一組2**(i+1)點的DFT """ # num=2*width=2**(i+1), 表示每組點數 num = 2*width # 組數groups groups = N//num for j in range(groups): # 對每組將2**i點DFT合成2**(i+1)=num點的DFT for k in range(num//2): # 旋轉因子 W = cos(2*pi/num*k) - 1j * sin(2*pi/num*k) # 第j組第k個 index = j*num + k tmp = W * X[index+width] # 每個蝶形一次複數乘法 X[index], X[index+width] = X[index]+tmp, X[index]-tmp return X if __name__ == '__main__': x = [1]*10 y = fft(x, 1024) # print(y) z = [abs(i) for i in y] # print(z) plt.plot(np.arange(len(z))*2/len(z), z, label='10點矩形窗函數的FFT') plt.title("幅度譜") plt.xlabel(r'單位:$pi$') plt.ylabel(r'$|H(jomega)|$') plt.grid(linestyle="-.") plt.legend() plt.show()
執行結果:
# 說明:建議使用第二種方法實現FFT。第一種遞迴的方法在遞迴呼叫時也需要一定的成本,且使用的記憶體較大;而第二種方法只使用了一個N(N=2**M)點的陣列進行計算,記憶體可重用。
import numpy as np from numpy.fft import fft, ifft # from scipy.fftpack import fft, ifft import matplotlib.pyplot as plt # 這兩行程式碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False if __name__ == '__main__': x = 2*np.sin(np.pi/2*np.arange(100))+np.sin(np.pi/5*np.arange(100)) z = [abs(i) for i in fft(x, 2048)] # print(z) L = len(z) plt.plot((np.arange(L)*2/L)[:L//2], z[:L//2], label='兩個不同頻率正弦訊號相加的DFT') plt.title("幅度譜") plt.xlabel('$pi$') plt.ylabel('$|H(jomega)|$') plt.grid(linestyle="-.") plt.legend() plt.show() print('max(abs(ifft(fft(x))-x)) = ', end='') print(max(abs(ifft(fft(x))-x)))
執行結果:
max(abs(ifft(fft(x))-x)) = 9.01467522361575e-16
以上就是基於Python實現DIT-FFT演演算法的詳細內容,更多關於Python DIT-FFT演演算法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45