Numpy fft 函数给出的输出不同于使用公式计算的 dft
Numpy fft function giving output different from the dft calculated using formula
我正在尝试在 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 图:
我做错了什么?
如果不下载您的数据文件,我推测它有 100 多个样本。如果是,那么
np.fft.fft(xn, n=100, axis=0)
截断前 100 个样本并计算这些样本的 FFT。也就是说,它计算的内容与您的代码不同。
当我使用 xn = np.random.randn(100)
和 运行 您的代码时,Xk
和 Xk1
在 1e-13
左右之前都是相同的。这表明您的代码是正确的。
要使用 FFT 算法仅计算 k
值的子集,请先计算完整变换,然后丢弃不需要的值。例如:
Xk1 = np.fft.fft(xn, axis=0)
Xk1 = np.fft.fftshift(Xk1)
Xk1 = Xk1[(N//2 - 50):(N//2 + 50)]
我正在尝试在 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 图:
我做错了什么?
如果不下载您的数据文件,我推测它有 100 多个样本。如果是,那么
np.fft.fft(xn, n=100, axis=0)
截断前 100 个样本并计算这些样本的 FFT。也就是说,它计算的内容与您的代码不同。
当我使用 xn = np.random.randn(100)
和 运行 您的代码时,Xk
和 Xk1
在 1e-13
左右之前都是相同的。这表明您的代码是正确的。
要使用 FFT 算法仅计算 k
值的子集,请先计算完整变换,然后丢弃不需要的值。例如:
Xk1 = np.fft.fft(xn, axis=0)
Xk1 = np.fft.fftshift(Xk1)
Xk1 = Xk1[(N//2 - 50):(N//2 + 50)]