I ein Matlab-Skript haben die DFT eines Signals und plotten es zu berechnen:FFT-Ergebnisse Matlab VS Numpy (Python): nicht die gleichen Ergebnisse
(data here gefunden werden kann)
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
Ich versuche es in Python zu übersetzen und bekomme nicht das gleiche Ergebnis.
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()
Die Plots I (Matlab auf der linken Seite, Pyhton auf der rechten Seite) erhalten:
Was mache ich falsch?
Vielleicht nicht Ihr Hauptproblem, aber Ihre Fensterfunktion sollte die gleiche Größe wie die FFT haben, d. H. Nfft, nicht len (x) (gilt sowohl für MATLAB als auch für Python-Code). –
@Paul R Interessant, wo kann ich mehr Informationen darüber finden? – hibol
Hier auf StackOverflow gibt es einige Fragen und Antworten, die Fensterfunktionen und FFTs abdecken. Die Quintessenz ist jedoch, dass Sie eine [Fensterfunktion] (https://en.wikipedia.org/wiki/Window_function) auf die Eingabedaten einer FFT anwenden, um [spektrales Lecken] zu reduzieren (https: // en. wikipedia.org/wiki/Spectral_leakage). Die Größe dieser Fensterfunktion muss daher der Größe der FFT entsprechen. –