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

下面是我的代码:
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的代码是:
Xk1 = np.fft.fftshift(np.fft.fft(xn, n=100, axis=0))但这两个结果是完全不同的,尽管它们应该是相同的。DFT图:

和FFT图:

我做错了什么?
发布于 2019-11-01 14:50:22
如果不下载您的数据文件,我假设它有超过100个样本。如果是这样,那么
np.fft.fft(xn, n=100, axis=0)截取前100个样本,并在这些样本上计算FFT。也就是说,它不会计算与您的代码相同的东西。
当我使用xn = np.random.randn(100)并运行您的代码时,Xk和Xk1在1e-13之前都是一样的。这表明您的代码是正确的。
要使用k算法仅计算FFT值的一个子集,请首先计算完整的转换,然后丢弃不需要的值。例如:
Xk1 = np.fft.fft(xn, axis=0)
Xk1 = np.fft.fftshift(Xk1)
Xk1 = Xk1[(N//2 - 50):(N//2 + 50)]https://stackoverflow.com/questions/58643571
复制相似问题