You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB矩形脉冲FFT脚本转Python后输出异常,求问题排查

问题描述

我正在完成一项作业,将实现矩形脉冲FFT的MATLAB脚本转换为Python代码,但Python输出却呈现为水平直线,和MATLAB中的预期波形不符。原MATLAB脚本对矩形脉冲进行FFT并应用不同低通滤波,以下是原MATLAB代码、转换后的Python代码,请问哪里出错了?

原MATLAB代码

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()

错误原因及修正方案

核心问题:索引规则与循环逻辑错位

MATLAB采用1-based索引,Python采用0-based索引,两者的索引逻辑完全不匹配,加上循环范围错误,导致输出异常:

  1. 矩形脉冲位置偏移:MATLAB中j=45:55对应第45到55行(共11个点),但Python中range(45,56)是索引45到55,实际对应原MATLAB的第46到56行,脉冲位置整体偏移。
  2. 滤波窗口中心错误:MATLAB中频谱经fftshift后中心在第50/51位(1-based),对应Python的第49位(0-based),但你仍用50作为中心计算滤波窗口,导致窗口位置完全错位。
  3. 循环次数多一次:MATLAB外层循环是j=1:4(4次循环),Python中range(0,5)会执行5次,其中j=0时滤波窗口仅保留一个点,输出自然是水平直线。
  4. 滤波数组未重置:ffrect在循环中未每次初始化,前一次循环的残留值会干扰后续滤波计算。

修正后的Python代码

import numpy as np
import matplotlib.pyplot as plt

# 创建矩形脉冲:0-based索引44到54,对应MATLAB的45到55位置
rect = np.zeros((100, 1))
for j in range(44, 55):
    rect[j, 0] = 1

frect = np.fft.fft(rect)
frect = np.fft.fftshift(frect)

# 对应MATLAB的j=1到4,共4次循环
for j in range(1, 5):
    # 基于0-based索引计算滤波窗口,中心为49
    klimlow = 49 - j * 10
    klimhigh = 49 + j * 10

    # 每次循环重置ffrect,避免残留值干扰
    ffrect = np.zeros((100, 1))
    for k in range(100):
        if klimlow <= k <= klimhigh:
            ffrect[k, 0] = frect[k, 0]
        else:
            ffrect[k, 0] = 0

    rrect = np.fft.ifft(np.fft.ifftshift(ffrect))
    
    plt.figure()
    plt.plot(np.real(rrect))
    plt.ylim([-0.2, 1.5])

plt.show()

关键修正点

  • 矩形脉冲索引改为range(44,55),对齐MATLAB的脉冲位置
  • 外层循环改为range(1,5),和MATLAB循环次数保持一致
  • 滤波窗口中心改为49(0-based),修正频谱窗口的位置
  • 每次循环重置ffrect,确保每次滤波都基于原始频谱计算

内容的提问来源于stack exchange,提问作者elmisterioso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:58:10