摘要:
目前只实现了基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 *