最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python實現(xiàn)DIT-FFT算法

 更新時間:2022年10月20日 14:48:02   作者:weixin_51613747  
FFT(Fast Fourier Transformation)是離散傅氏變換(DFT)的快速算法。即為快速傅氏變換。本文將用Python語言實現(xiàn)DIT-FFT算法,感興趣的可以了解一下

自己寫函數(shù)實現(xiàn)FFT

使用遞歸方法

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 函數(shù)說明
    # x: 時域序列
    # N: N點(diǎ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]]
    
    # 補(bǔ)0使得N=2**M
    M = ceil(log(N, 2))
    N = 2**M
    x = x + [0] * (N-len(x))
    
    # 遞歸地計算偶數(shù)項和奇數(shù)項的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點(diǎn)矩形窗函數(shù)的FFT')
    plt.title("幅度譜")
    plt.xlabel(r'單位:$\pi$')
    plt.ylabel(r'$|H(j\omega)|$')
    plt.grid(linestyle="-.")
    plt.legend()
    plt.show()

使用循環(huán),流式計算(極大地節(jié)省了內(nèi)存)

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 函數(shù)說明
    # x: 時域序列
    # N: N點(diǎn)DFT, 理論上N=2**M
    # 返回值為序列x的DFT
    """
    采用流式計算方法,只用了一個N(N=2**M)點(diǎn)的數(shù)組內(nèi)存
    """
    if N is None:
        N = len(x)
    elif N < len(x):
        N = len(x)
    
    # 補(bǔ)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點(diǎn)DFT合成2**(i+1)點(diǎn)的DFT
        # 蝶形寬度width
        width = 2**i
        
        """
        將X(k)序列進(jìn)行分組,每組2**(i+1)個點(diǎn),
        便于將每組中兩組2**i點(diǎn)DFT合成一組2**(i+1)點(diǎn)的DFT
        """
        # num=2*width=2**(i+1), 表示每組點(diǎn)數(shù)
        num = 2*width
        # 組數(shù)groups
        groups = N//num
        
        for j in range(groups):
            # 對每組將2**i點(diǎn)DFT合成2**(i+1)=num點(diǎn)的DFT
            for k in range(num//2):
                # 旋轉(zhuǎn)因子
                W = cos(2*pi/num*k) - 1j * sin(2*pi/num*k)
                # 第j組第k個
                index = j*num + k
                tmp = W * X[index+width]    # 每個蝶形一次復(fù)數(shù)乘法
                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點(diǎn)矩形窗函數(shù)的FFT')
    plt.title("幅度譜")
    plt.xlabel(r'單位:$\pi$')
    plt.ylabel(r'$|H(j\omega)|$')
    plt.grid(linestyle="-.")
    plt.legend()
    plt.show()

運(yùn)行結(jié)果:

# 說明:建議使用第二種方法實現(xiàn)FFT。第一種遞歸的方法在遞歸調(diào)用時也需要一定的成本,且使用的內(nèi)存較大;而第二種方法只使用了一個N(N=2**M)點(diǎn)的數(shù)組進(jìn)行計算,內(nèi)存可重用。

使用python的第三方庫進(jìn)行FFT

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(j\omega)|$')
    plt.grid(linestyle="-.")
    plt.legend()
    plt.show()
    
    print('max(abs(ifft(fft(x))-x)) = ', end='')
    print(max(abs(ifft(fft(x))-x)))

運(yùn)行結(jié)果:

max(abs(ifft(fft(x))-x)) = 9.01467522361575e-16

以上就是基于Python實現(xiàn)DIT-FFT算法的詳細(xì)內(nèi)容,更多關(guān)于Python DIT-FFT算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python字典使用技巧詳解

    Python字典使用技巧詳解

    Python 中字典和集合也是非常相近的概念,而且從外觀看上去,也有那么一絲絲的相似。本文將從字典基本知識入手,為你展開字典類型數(shù)據(jù)的各個知識點(diǎn),需要的可以參考一下
    2022-11-11
  • Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性

    Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性

    這篇文章主要給大家介紹了關(guān)于Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python實現(xiàn)多維數(shù)據(jù)分析的示例詳解

    Python實現(xiàn)多維數(shù)據(jù)分析的示例詳解

    多維數(shù)據(jù)分析是對數(shù)據(jù)的信息分析,它考慮了許多關(guān)系,這篇文章主要為大家詳細(xì)介紹了一些使用Python分析多維/多變量數(shù)據(jù)的基本技術(shù),希望對大家有所幫助
    2023-11-11
  • Python實現(xiàn)視頻下載與合成的示例代碼

    Python實現(xiàn)視頻下載與合成的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Python是如何實現(xiàn)視頻的下載以及合成的,文中的實現(xiàn)步驟講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-04-04
  • Python制作簡單的剪刀石頭布游戲

    Python制作簡單的剪刀石頭布游戲

    這篇文章主要介紹了Python制作剪刀石頭布游戲的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python腳本在Appium庫上對移動應(yīng)用實現(xiàn)自動化測試

    Python腳本在Appium庫上對移動應(yīng)用實現(xiàn)自動化測試

    這篇文章主要介紹了使用Python的Appium庫對移動應(yīng)用實現(xiàn)自動化測試的教程,屬于Python腳本的一個自動化應(yīng)用,需要的朋友可以參考下
    2015-04-04
  • 深入理解Python虛擬機(jī)之進(jìn)程、線程和協(xié)程區(qū)別詳解

    深入理解Python虛擬機(jī)之進(jìn)程、線程和協(xié)程區(qū)別詳解

    在本篇文章當(dāng)中深入分析在 Python 當(dāng)中 進(jìn)程、線程和協(xié)程的區(qū)別,這三個概念會讓人非常迷惑,如果沒有深入了解這三者的實現(xiàn)原理,只是看一些文字說明,也很難理解,在本篇文章當(dāng)中我們將通過分析部分源代碼來詳細(xì)分析一下這三者根本的區(qū)別是什么,需要的朋友可以參考下
    2023-10-10
  • TensorFlow學(xué)習(xí)之分布式的TensorFlow運(yùn)行環(huán)境

    TensorFlow學(xué)習(xí)之分布式的TensorFlow運(yùn)行環(huán)境

    這篇文章主要了TensorFlow學(xué)習(xí)之分布式的TensorFlow運(yùn)行環(huán)境的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • anaconda中Conda創(chuàng)建虛擬環(huán)境的實現(xiàn)步驟

    anaconda中Conda創(chuàng)建虛擬環(huán)境的實現(xiàn)步驟

    在Anaconda中,可以使用conda命令來創(chuàng)建和管理虛擬環(huán)境,本文主要介紹了anaconda中Conda創(chuàng)建虛擬環(huán)境的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Django實現(xiàn)內(nèi)容緩存實例方法

    Django實現(xiàn)內(nèi)容緩存實例方法

    在本篇文章里小編給大家整理了關(guān)于Django實現(xiàn)內(nèi)容緩存實例方法,有需要的朋友們可以跟著學(xué)習(xí)下。
    2020-06-06

最新評論

万宁市| 长沙市| 贵港市| 永兴县| 镇康县| 改则县| 彝良县| 江川县| 淳化县| 承德市| 德兴市| 东至县| 浙江省| 扶余县| 清原| 固原市| 子洲县| 台山市| 济南市| 磐安县| 凉山| 湖州市| 连江县| 台中县| 双牌县| 南汇区| 柳林县| 波密县| 金坛市| 平武县| 化隆| 黄龙县| 枞阳县| 江口县| 桦南县| 嘉黎县| 迁安市| 信阳市| 东城区| 四平市| 泗阳县|