傅里叶变换 FFT python简单版本实现

本文展示了如何使用Python实现离散傅立叶变换(DFT)的简化版本,并对比了numpy库的FFT实现。通过一个示例,演示了对正弦波信号进行傅立叶变换的过程,用于理解和验证FFT的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FFT是DFT的高效版本实现,原理没什么差别,所以这里实现DFT。

  1. 首先DFT的公式为:
    在这里插入图片描述

  2. 那么我们就用python实现一下吧
    zzy_fft就是我手动实现的toy版本的fft

import numpy as np
import matplotlib.pyplot as plt


def zzy_fft(x, N):
    # 根据dft式子写的简易版本fft,只是大概验证一下他的原理
    # x是原始列表,N是列表里元素个数
    # 返回ret列表是枚举每个频率,计算得到的“质心”
    ret = []
    for k in range(1000): # k是枚举的频率
        tmp = 0 + 0j
        for n in range(N): # 欧拉公式
            # 注意sin是负号,因为dft公式里是-i
            tmp += np.complex(np.cos(2*np.pi*n*k/N) * x[n], -np.sin(2*np.pi*n*k/N) * x[n])
        ret.append(tmp)
    return ret

t = np.linspace(0, 1, 1000)
f = np.sin(30*2*np.pi*t) + np.cos(20*2*np.pi*t)

# solution 1 : zzy
y = zzy_fft(f, 1000)
y = np.fft.fftshift(y)
plt.plot(y)
plt.show()

# solution 2 : numpy
# y = np.fft.fft(f)
# y = np.fft.fftshift(y)
# freq = np.fft.fftfreq(f.shape[0], d=(t[1]-t[0]))
# freq = np.fft.fftshift(freq)
# plt.plot(freq, np.abs(y))
# plt.show()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值