使用Manim绘制傅里叶变换调用fft()时遇TypeError报错求助
问题解决:Manim中调用FFT出现TypeError
错误根源
你遇到的TypeError: 'module' object is not callable是因为**np.fft是numpy的子模块,不是可调用函数**,正确的快速傅里叶变换函数是np.fft.fft(),直接调用模块会触发该错误。
修复后的完整代码
from manim import * import numpy as np class sampling(Scene): def construct(self): # 生成时间序列 t = np.arange(-2*PI, 2*PI, 0.01) sr = len(t)/(4*PI) # 采样率 # 直接用numpy生成正弦信号(替代循环append,更高效) x = np.sin(t) # 正确调用FFT函数 X = np.fft.fft(x) N = len(X) n = np.arange(N) T = N/sr freq = n/T # 取FFT结果的前半部分(避免对称重复) freq_half = freq[:N//2] X_amp = np.abs(X/N)[:N//2] # 创建坐标系并绘制频谱图 plane2 = NumberPlane(x_range=[0, 1], y_range=[0, 0.6], x_length=6, y_length=3).add_coordinates() # 使用plot_line_graph绘制离散数据(plot方法适用于连续函数) plane2_graph = plane2.plot_line_graph(x_values=freq_half, y_values=X_amp, color=GOLD_C) self.add(plane2, plane2_graph)
其他关键修复点
- 信号生成优化:用
np.sin(t)替代循环append列表,直接生成numpy数组,计算效率更高且符合numpy的使用习惯。 - 绘图方法修正:
NumberPlane.plot适用于绘制连续函数(比如lambda表达式),如果要绘制离散的FFT结果,应该用plot_line_graph并传入x/y值数组。 - 频谱截断:FFT结果是对称的,只取前半部分即可展示完整的频谱信息,避免重复绘制冗余数据。
内容的提问来源于stack exchange,提问作者Egyptian man.
相关产品推荐
相关产品推荐

