如何绘制复数数组的实部与虚部?含离散傅里叶变换测试场景
提取DFT复数结果的实部/虚部并绘图的方法
嘿,刚好我对DFT的可视化处理很熟,这就把步骤给你理清楚!
第一步:提取复数数组的实部和虚部
不管你是用自己实现的DFT函数还是numpy自带的工具,得到的复数结果都能轻松提取实部和虚部:
情况1:用numpy数组存储DFT结果
numpy的复数数组自带real和imag属性,直接调用就行:
import numpy as np # 假设你的DFT结果存在dft_output里 real_components = dft_output.real # 提取所有元素的实部 imag_components = dft_output.imag # 提取所有元素的虚部
情况2:用普通Python列表存储复数元素
如果是自己写的DFT函数返回了普通列表,用列表推导式就能快速提取:
# 假设dft_output是普通复数列表 real_components = [num.real for num in dft_output] imag_components = [num.imag for num in dft_output]
第二步:按索引绘图(用matplotlib实现)
接下来用matplotlib把实部和虚部按索引(也就是DFT的频率点序号)画出来,这里给你两种常见的绘图方式:
方式1:实部和虚部分开画两个子图
这样看起来更清晰,能分别观察两者的分布:
import matplotlib.pyplot as plt # 生成索引数组(假设DFT结果长度为N) n = np.arange(len(dft_output)) # 创建画布和子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8)) # 画实部 ax1.plot(n, real_components, color='blue', label='DFT 实部') ax1.set_title('DFT结果的实部分布') ax1.set_xlabel('索引(频率点序号)') ax1.set_ylabel('实部幅值') ax1.legend() ax1.grid(True) # 画虚部 ax2.plot(n, imag_components, color='red', label='DFT 虚部') ax2.set_title('DFT结果的虚部分布') ax2.set_xlabel('索引(频率点序号)') ax2.set_ylabel('虚部幅值') ax2.legend() ax2.grid(True) # 调整子图间距 plt.tight_layout() plt.show()
方式2:实部和虚部画在同一张图里
如果想对比两者的变化趋势,可以放在同一坐标系:
import matplotlib.pyplot as plt n = np.arange(len(dft_output)) plt.figure(figsize=(10, 6)) plt.plot(n, real_components, color='blue', label='DFT 实部') plt.plot(n, imag_components, color='red', label='DFT 虚部') plt.title('DFT结果的实部与虚部分布') plt.xlabel('索引(频率点序号)') plt.ylabel('幅值') plt.legend() plt.grid(True) plt.show()
补充说明
对于正弦波的DFT结果,你会发现大部分实部/虚部元素都接近0(因为数值计算的浮点误差),只有对应正弦波频率的那个索引位置会有明显的峰值——这也能验证你的DFT程序是否正确哦!
内容的提问来源于stack exchange,提问作者user9361407
相关产品推荐
相关产品推荐

