2017-06-21 181 views
0

我有一个MATLAB脚本来计算信号的DFT并绘制它:FFT结果Matlab的VS NumPy的(蟒蛇):不一样的结果

(数据可以发现here

clc; clear; close all; 

fid = fopen('s.txt'); 
txt = textscan(fid,'%f'); 

s = cell2mat(txt); 

nFFT = 100; 
fs = 24000; 
deltaF = fs/nFFT; 
FFFT = [0:nFFT/2-1]*deltaF; 
win = hann(length(s)); 

sw = s.*win; 
FFT = fft(sw, nFFT)/length(s); 
FFT = [FFT(1); 2*FFT(2:nFFT/2)]; 
absFFT = 20*log10(abs(FFT)); 

plot(FFFT, absFFT) 
grid on 

我试图将它翻译成Python,并且无法获得相同的结果。

import numpy as np 
from matplotlib import pyplot as pl 

x = np.genfromtxt("s.txt", delimiter=' ') 

nfft = 100 
fs = 24000 
deltaF = fs/nfft; 
ffft = [n * deltaF for n in range(nfft/2-1)] 
ffft = np.array(ffft) 
window = np.hanning(len(x)) 

xw = np.multiply(x, window) 
fft = np.fft.fft(xw, nfft)/len(x) 
fft = fft[0]+ [2*fft[1:nfft/2]] 
fftabs = 20*np.log10(np.absolute(fft)) 

pl.figure() 
pl.plot(ffft, np.transpose(fftabs)) 
pl.grid() 

我得到(Matlab的左侧,Pyhton右侧)的地块:

enter image description here

我在做什么错?

+0

也许不是你的主要问题,但你的窗口函数应该与FFT的大小相同,即nfft,而不是len(x)(适用于MATLAB和Python代码)。 –

+0

@Paul R有趣,我在哪里可以找到更多关于这方面的信息? – hibol

+0

StackOverflow涵盖了窗口函数和FFT,其中有很多问题和答案。不过,最重要的一点是,您可以将[窗口函数](https://en.wikipedia.org/wiki/Window_function)应用于FFT的输入数据,以减少[频谱泄漏](https:// en。 wikipedia.org/wiki/Spectral_leakage)。因此这个窗口函数的大小需要与FFT的大小相匹配。 –

回答

3

两个码是在一种情况下不同您连接两个列表

FFT = [FFT(1); 2*FFT(2:nFFT/2)]; 
在其他你用载体的其余部分添加FFT的第一值的MATLAB代码

fft = fft[0]+ [2*fft[1:nfft/2]] 

'+'在这里没有连接,因为您有numpy数组

I ñ蟒蛇,它应该是:

fft = fft[0:nfft/2] 
fft[1:nfft/2] = 2*fft[1:nfft/2] 
0

我不是一个Mathlab用户,所以我不确定,但是我会询问是否可以帮助您。

在数组完成后(ffft),您调用np.array。这可能不会改变阵列的性质以及你所希望的,也许最好是尝试在里面定义它np.array(n * deltaF for n in range(nfft/2-1))我不确定格式,但你明白了。另一件事是,范围似乎并不适合我。你想要它的值为49?

另一个是fft = fft[0]+ [2*fft[1:nfft/2]]FFT = [FFT(1); 2*FFT(2:nFFT/2)];相比我不确定比较是否准确。它对我来说似乎只是一种不同类型的定义?另外,当我进行这些类型的计算时,我会打印出中间步骤,以便比较数字以查看其中断点。

希望这会有所帮助。

+0

谢谢。我改变了ffft的定义:'ffft = np.array(n * deltaF for n in range(nfft/2-1))'。不确定你提到的第二部分代码。我找到了一个解决方案,并将其发布在下面。而且我不关心我得到的积分数。我可能会用不同的值做一些测试。 – hibol

0

我发现使用np.fft.rfft代替np.fft.fft和修改代码如下这项工作:

import numpy as np 
from matplotlib import pyplot as pl 

x = np.genfromtxt("../Matlab/s.txt", delimiter=' ') 

nfft = 100 
fs = 24000 
deltaF = fs/nfft; 
ffft = np.array([n * deltaF for n in range(nfft/2+1)]) 
window = np.hanning(len(x)) 

xw = np.multiply(x, window) 
fft = np.fft.rfft(xw, nfft)/len(x) 
fftabs = 20*np.log10(np.absolute(fft)) 

pl.figure() 
pl.plot(np.transpose(ffft), fftabs) 
pl.grid() 

所得的情节: right result with Python

我可以看到第一个和最后一个点以及幅度不一样。这对我来说不是问题(我对整体形状更感兴趣),但如果有人能解释,我会很高兴。