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索引,两者的索引逻辑完全不匹配,加上循环范围错误,导致输出异常:
- 矩形脉冲位置偏移:MATLAB中
j=45:55对应第45到55行(共11个点),但Python中range(45,56)是索引45到55,实际对应原MATLAB的第46到56行,脉冲位置整体偏移。 - 滤波窗口中心错误:MATLAB中频谱经
fftshift后中心在第50/51位(1-based),对应Python的第49位(0-based),但你仍用50作为中心计算滤波窗口,导致窗口位置完全错位。 - 循环次数多一次:MATLAB外层循环是
j=1:4(4次循环),Python中range(0,5)会执行5次,其中j=0时滤波窗口仅保留一个点,输出自然是水平直线。 - 滤波数组未重置:
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
相关产品推荐
相关产品推荐

