快速傅里叶变化的实现-蝶形运算

本文详细介绍了基2快速傅里叶变换(FFT)的实现过程,包括数据重组、蝶形运算和基2 FFT的优化。作者通过对比DFT与FFT的时间复杂度,展示了FFT在计算效率上的优势,并探讨了非2的n次方长度数据处理方法,以及未来可能的优化方向,如旋转因子的实现。
摘要由CSDN通过智能技术生成

摘要:

目前只实现了基2的算法,当数据长度不是2的n次方时,我用截断和补零两种实现方式,补零的操作起码在频谱上没看出太大的差异,但直接截断的操作相当于加了矩形窗,所以对最终频谱的代码存在异常;

基2的推导:

【这里有图】【等我把笔记本从公司拿回来拍个照再上传(上班时间推得)】

蝶形运算的过程:

这里给出第一列排序的推导,如果想不明白为什么这样做,不妨试试将这个图上的结果倒着看,是不是就豁然开朗,守得云开见月明了~~
在这里插入图片描述
这个图网上搜一下蝶形运算一大堆,我放上这么丑的图,完全是为了自己以后看的时候能记得!图上还有圈出来一大堆东西是写代码实现的时候分析的~

代码实现:

数据构造:

import numpy as np
import matplotlib.pyplot as plt
import os
import math
import scipy.signal as sig

def cac_db(data):
    return 20*np.log10(abs(data))

# 构造数据
noise_data = np.random.uniform(low=-1,high=1,size=8192) + np.random.uniform(low=-1,high=1,size=8192) * 1j
flt_coef = sig.remez(150,[0,50,100,491.52],[1,0],fs=983.04)
data_org = np.convolve(noise_data,flt_coef)
plt.psd(data_org,NFFT=1024,Fs=491.52)


# 参考结果
# data_fft = np.fft.fft(data[:8192],)
# data_fft = np.roll(data_fft,len(data_fft)//2)
# plt.plot(cac_db(data_fft),'*-')
# plt.grid(True)

实现DFT的结果,从这个计算时间上可以看出来,DFT是多么的费时~

# 手写DFT
def Fun_DFT(data):
    data = np.array(data)
    data_len = data.shape[0]
    data_fft = np.zeros_like(data)
    # 循环的公共部分
    W_n = -1j * 2 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值