你的问题对我来说不是很清楚。但看起来您正在尝试比较 FFT 的实践和理论方面。
让我们举一个简单的例子来理解这一点。我们有函数 x1(t) = cos(2pi(0.5)t)*w(t),具有 0.5kHz 余弦的 10ms 窗口。它看起来像这样。
# Install this library if you needed, just do pip install pip install scikit-dsp-comm
# importing necessary libraries
%pylab inline
import sk_dsp_comm.sigsys as ss
import scipy.signal as signal
from IPython.display import Image, SVG
#Notebook configuration
pylab.rcParams['savefig.dpi'] = 100 # default 72
%config InlineBackend.figure_formats=['svg'] # SVG inline viewing
fs = 4 # sampling rate in kHz
t = arange(-5,5,1/fs)
tau = 1
f1 = 0.5; # Frequency component, in [kHz]
omega = 2*pi*f1;
x1 = cos(omega*t);
figure(figsize=(6,5))
subplot(211)
plot(t,x1.real,'b')
grid()
ylim([-1.1,1.1])
xlim([-5,5])
title(r'0.5KHz cosine over 10ms windows')
xlabel(r'Time (ms)')
ylabel(r'$x_0(t)$');
# FT Exact Plot
f,X1 = ss.ft_approx(x1,t,2000)
subplot(212)
plot(f,abs(X1),'b')
#plot(f,angle(X0))
grid()
xlim([-2,2])
title(r'Spectrum Magnitude of 0.5KHz cosine over 10ms windows')
xlabel(r'Frequency (kHz)')
ylabel(r'$|X_0e(f)|$');
tight_layout()
现在用 0.5kHz 余弦的 20 毫秒窗口绘制同样的函数
t = arange(-10,10,1/fs)
x2 = cos(omega*t);
subplot(211)
plot(t,x2.real,'b')
grid()
ylim([-1.1,1.1])
xlim([-10,10])
title(r'0.5KHz cosine over 20ms windows')
xlabel(r'Time (ms)')
ylabel(r'$x_0(t)$');
# FT Exact Plot
f,X2 = ss.ft_approx(x2,t,2000)
subplot(212)
plot(f,abs(X2),'b')
#plot(f,angle(X0))
grid()
xlim([-2,2])
title(r'Spectrum Magnitude of 0.5KHz cosine over 20ms windows')
xlabel(r'Frequency (kHz)')
ylabel(r'$|X_0e(f)|$');
tight_layout()
现在,让我们介绍一下 DFT 中的采样率和 2000 个点。
fs = 4 # sampling rate in kHz
W = 5
t = arange(-5,5,1/fs)
x4 = W/pi*sinc(W/pi*t)
figure(figsize=(6,2))
plot(t,x4,'b')
grid()
# ylim([-1.1,1.1])
xlim([-5,5])
title(r'Time Domain: $x_4(t),\ W = 5$ Hz')
xlabel(r'Time (s)')
ylabel(r'$x_4(t)$');
f,X4 = ss.ft_approx(x4,t,2000)
figure(figsize=(6,2))
plot(f,abs(X4),'b')
grid()
title(r'Frequency Domain: $X_4(f)$')
xlim([-1,1])
xlabel(r'Frequency (Hz)')
ylabel(r'$|X_4(f)|$');
figure(figsize=(6,2))
plot(f,20*log10(abs(X4)),'b')
grid()
title(r'Frequency Domain: $X_4(f)$ in dB')
ylim([-50,5])
xlim([-1,1])
xlabel(r'Frequency (Hz)')
ylabel(r'$|X_4(f)|$ (dB)');
现在总结一下,这是用这种方式表示单个正弦及其 FFT 的简单情况。
from scipy import fftpack
N = 10
t = np.linspace(0, 1, 500)
x = np.sin(49 * np.pi * t)
X = fftpack.fft(x)
f, (ax0, ax1) = plt.subplots(2, 1)
ax0.plot(x,'b');ax0.grid()
ax0.set_ylim(-1.1, 1.1)
ax1.plot(fftpack.fftfreq(len(t)), np.abs(X),'b');ax1.grid()
ax1.set_ylim(0, 190);
更多详情和Basic introduction可以在这里找到。