Python 中矩形脉冲的 FFT

问题描述 投票:0回答:1

我正在做一项作业,将 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

第一次循环迭代的正确且预期的输出如下所示: Output in Matlab

我尝试将脚本转换为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()

但是输出看起来像这样: Output in python

知道我做错了什么吗?

python matlab fft pulse
1个回答
0
投票

当您在 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()

您将得到以下内容:

© www.soinside.com 2019 - 2024. All rights reserved.