首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy fft函数给出的输出不同于使用公式计算的dft

Numpy fft函数给出的输出不同于使用公式计算的dft
EN

Stack Overflow用户
提问于 2019-10-31 20:40:50
回答 1查看 257关注 0票数 0

我正在尝试用python实现dft。我使用的是标准公式:

下面是我的代码:

代码语言:javascript
复制
k = np.array([np.arange(-50, 50)])
fs, xn = wavfile.read('voice_recording.wav')
nbits = 16
max_nbits = float(2**(nbits-1))
xn = xn / (max_nbits + 1.0)
xn = np.expand_dims(xn[:,0], axis=1)
N = len(xn)
n = np.array([np.arange(0, N)])
Xk = np.sum(xn*np.exp(((-1j*2*math.pi)/N)*np.matmul(n.T, k)), axis=0)

这里,xn是从.wav文件(voice_recording.wav)读取的音频信号。FFT的代码是:

代码语言:javascript
复制
Xk1 = np.fft.fftshift(np.fft.fft(xn, n=100, axis=0))

但这两个结果是完全不同的,尽管它们应该是相同的。DFT图:

和FFT图:

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-01 14:50:22

如果不下载您的数据文件,我假设它有超过100个样本。如果是这样,那么

代码语言:javascript
复制
np.fft.fft(xn, n=100, axis=0)

截取前100个样本,并在这些样本上计算FFT。也就是说,它不会计算与您的代码相同的东西。

当我使用xn = np.random.randn(100)并运行您的代码时,XkXk11e-13之前都是一样的。这表明您的代码是正确的。

要使用k算法仅计算FFT值的一个子集,请首先计算完整的转换,然后丢弃不需要的值。例如:

代码语言:javascript
复制
Xk1 = np.fft.fft(xn, axis=0)
Xk1 = np.fft.fftshift(Xk1)
Xk1 = Xk1[(N//2 - 50):(N//2 + 50)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58643571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档