我正在做一项作业,将 Matlab 脚本转换为 fft 矩形脉冲到 python。然而python中的输出出乎意料的是一条水平直线。
原始脚本使用不同的低通滤波器对矩形脉冲执行 fft。
rect=zeros(100,1);
ffrect=zeros(100,1);
for j=45:55
rect(j,1)=1;
end
frect=fft(rect);
frect=fftshift(frect);
for j = 1:4
klimlow=50-j*10
klimhigh=50+j*10
for k=1:100
if (k < klimlow) | (k > klimhigh)
ffrect(k,1) = 0;
else
ffrect(k,1)=frect(k,1);
end
end
rrect=ifft(ifftshift(ffrect));
plot(real(rrect))
ylim([-0.2 1.5])
foo=input('Press RETURN to proceed to the next rectangle pulse');
end
我尝试将脚本转换为Python:
import numpy as np
import matplotlib.pyplot as plt
rect = np.zeros((100, 1))
ffrect = np.zeros((100, 1))
for j in range(45, 56):
rect[j, 0] = 1
frect = np.fft.fft(rect)
frect = np.fft.fftshift(frect)
for j in range(0, 5):
klimlow = 50 - j * 10
klimhigh = 50 + j * 10
for k in range(100):
if (k < klimlow) or (k > klimhigh):
ffrect[k, 0] = 0
else:
ffrect[k, 0] = frect[k, 0]
rrect = np.fft.ifft(np.fft.ifftshift(ffrect))
plt.figure()
plt.plot(np.real(rrect))
plt.ylim([-0.2, 1.5])
plt.show()
知道我做错了什么吗?
当您在 python 中将
rect
定义为 np.zeros((n,m))
时,您会在每一行中创建 n
数组。这归根结底是如何在 python 中定义数组的。
要解决您的问题,您需要考虑一些事情。首先,您必须像这样创建矩形,以确保矩形确实是一维的:
rect = np.zeros(100)
或者,您可以按现在的方式调用它,但您需要将其展平:
rect = np.zeros((100,1))
rect = rect.flatten()
第二,不是很重要,但对眼睛和解释器来说都更好: frect 需要定义为一个复杂的数组,而不是一个浮点数。
ffrect = np.zeros(100, dtype = complex)
另外,为什么使用 for 循环来索引元素 45 到 56?只需使用这个:
rect[45:56] = 1
之后,就做你正在做的事情:
frect = np.fft.fft(rect)
frect = np.fft.fftshift(frect)
for j in range(1, 5):
klimlow = 50 - j * 10
klimhigh = 50 + j * 10
for k in range(100):
if (k < klimlow) or (k > klimhigh):
ffrect[k] = 0
else:
ffrect[k] = frect[k]
rrect = np.fft.ifft(np.fft.ifftshift(ffrect))
plt.plot(np.real(rrect), label = "FFT of j = "+str(j))
fig.canvas.draw()
plt.show()
plt.grid()
plt.legend()