Python 时域FFT

Python 时域FFT,python,numpy,matplotlib,fft,Python,Numpy,Matplotlib,Fft,我有下面的方波函数,只关注从-p0到p0的一个周期。 当我执行fft时,我很难理解到底发生了什么,我如何知道使用什么频率 我用手计算了我的fft,应该类似于我在底部的函数。 我做错了什么 import numpy as np import matplotlib.pyplot as plt from numpy.fft import fft,fftfreq,ifft ###################TIME/MOMENTUM DOMAIN######################## sa

我有下面的方波函数,只关注从-p0到p0的一个周期。 当我执行fft时,我很难理解到底发生了什么,我如何知道使用什么频率

我用手计算了我的fft,应该类似于我在底部的函数。 我做错了什么

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft,fftfreq,ifft
###################TIME/MOMENTUM DOMAIN########################
sample_rate = 1024
N = 2*sample_rate

p0 = 2
t = np.linspace(-p0,p0,N)
y = np.zeros_like(t)
y[(t>-p0)*(t<p0)] = np.sqrt(1/(2*p0)) 

#################Frequency/Position Domain#####################
frequency = np.linspace (0.0, 512, int (N/2)) #creates all the neccessary frequencies
fft_values = fft(y)
yf = 2/N * np.abs (fft_values [0:np.int (N/2)])
plt.plot(frequency,yf)
plt.show()




##############Calculated FFT########################
x = np.linspace(-p0,p0,1000)
y = [((np.sqrt(1/(np.pi*p0)))*np.sin(p0*t))/t for t in x]

将numpy导入为np
将matplotlib.pyplot作为plt导入
从numpy.fft导入fft、fftfreq、ifft
###################时间/动量域########################
采样率=1024
N=2*采样率
p0=2
t=np.linspace(-p0,p0,N)
y=np.类零(t)

y[(t>-p0)*(t你的问题我不太清楚。但看起来你试图比较
FFT
的实际和理论方面

让我们举一个简单的例子来理解这一点。我们有函数x1(t)=cos(2pi(0.5)t)*w(t),10毫秒的窗口是0.5kHz的余弦。它看起来是这样的

#如果需要安装此库,只需执行pip Install pip Install scikit dsp comm即可
#导入必要的库
%pylab内联
将sk_dsp_comm.sigsys作为ss导入
导入scipy.signal作为信号
从IPython.display导入图像,SVG
#笔记本电脑配置
pylab.rcParams['savefig.dpi']=100#默认值72
%config InlineBackend.figure_formats=['svg']#svg内联查看
fs=4#采样率,单位为kHz
t=arange(-5,5,1/fs)
tau=1
f1=0.5;#频率分量,单位为[kHz]
ω=2*pi*f1;
x1=cos(ω*t);
图(figsize=(6,5))
子地块(211)
图(t,x1.实,'b')
网格()
ylim([-1.1,1.1])
xlim([-5,5])
标题(r“10毫秒窗口上的0.5KHz余弦”)
xlabel(r'时间(毫秒)'
ylabel(r'$x_0(t)$);
#FT精确图
f、 X1=不锈钢英尺约值(X1,t,2000)
小批(212)
图(f,abs(X1),‘b’)
#绘图(f,角度(X0))
网格()
xlim([-2,2])
标题(r‘10ms窗口上0.5KHz余弦的频谱幅值’)
xlabel(r'频率(kHz)'
ylabel(r'$| X_0e(f)|$);
紧凑的布局()

现在用0.5kHz余弦的20ms窗口绘制相同的函数

t=arange(-10,10,1/fs)
x2=cos(ω*t);
子地块(211)
图(t,x2.实,'b')
网格()
ylim([-1.1,1.1])
xlim([-10,10])
标题(r“20ms窗口上的0.5KHz余弦”)
xlabel(r'时间(毫秒)'
ylabel(r'$x_0(t)$);
#FT精确图
f、 X2=不锈钢英尺约(X2,t,2000)
小批(212)
图(f,abs(X2),‘b’)
#绘图(f,角度(X0))
网格()
xlim([-2,2])
标题(r‘20ms窗口上0.5KHz余弦的频谱幅度’)
xlabel(r'频率(kHz)'
ylabel(r'$| X_0e(f)|$);
紧凑的布局()

现在,让我们介绍DFT中的采样率和2000点

fs=4#以kHz为单位的采样率
W=5
t=arange(-5,5,1/fs)
x4=W/pi*sinc(W/pi*t)
图(figsize=(6,2))
图(t,x4,'b')
网格()
#ylim([-1.1,1.1])
xlim([-5,5])
标题(r'时域:$x_4(t),\W=5$Hz')
xlabel(r'时间's')
ylabel(r'$x_4(t)$);
f、 X4=不锈钢英尺约(X4,t,2000)
图(figsize=(6,2))
图(f,abs(X4),‘b’)
网格()
标题(r'频域:$X_4(f)$')
xlim([-1,1])
xlabel(r'频率(Hz)')
ylabel(r'$| X|u 4(f)|$);
图(figsize=(6,2))
图(f,20*log10(abs(X4)),'b')
网格()
标题(r'频域:$X_4(f)$,单位为dB')
ylim([-50,5])
xlim([-1,1])
xlabel(r'频率(Hz)')
ylabel(r'$| X|u 4(f)$(dB)');

现在总结一下,这是一个简单的例子,用这种方式表示单正弦及其FFT

从scipy导入fftpack
N=10
t=np.linspace(0,1500)
x=np.sin(49*np.pi*t)
X=fftpack.fft(X)
f、 (ax0,ax1)=plt.子批次(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(0190);


更多详细信息,请点击此处。

@duke201718:如果我误解了你的问题,请告诉我。