我有一個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右側)的地塊:
我在做什麼錯?
也許不是你的主要問題,但你的窗口函數應該與FFT的大小相同,即nfft,而不是len(x)(適用於MATLAB和Python代碼)。 –
@Paul R有趣,我在哪裏可以找到更多關於這方面的信息? – hibol
StackOverflow涵蓋了窗口函數和FFT,其中有很多問題和答案。不過,最重要的一點是,您可以將[窗口函數](https://en.wikipedia.org/wiki/Window_function)應用於FFT的輸入數據,以減少[頻譜泄漏](https:// en。 wikipedia.org/wiki/Spectral_leakage)。因此這個窗口函數的大小需要與FFT的大小相匹配。 –