
本文旨在解决python中进行二维信号傅里叶变换(dft)频谱可视化时,因计算`log10(0)`导致`runtimewarning`并显示黑色图像的问题。我们将探讨两种有效的解决方案:利用numpy的条件对数计算功能,或在取对数前为频谱幅值添加一个微小常数,从而确保频谱图像的正确生成与显示。
在信号处理和图像分析中,傅里叶变换是理解信号频率成分的强大工具。当我们对二维信号(如图像)进行傅里叶变换后,通常会计算其幅值谱,并为了更好地观察动态范围,将其转换为对数尺度(通常是分贝,即 20 * log10(幅值))。然而,当信号的某些频率成分的幅值为零时,直接计算log10(0)会导致数学上的未定义行为,进而引发RuntimeWarning: divide by zero encountered in log10警告,并可能导致频谱图像显示为全黑或异常。
当使用numpy.fft.fft2计算二维离散傅里叶变换(DFT)后,我们得到的是一个复数数组。其幅值通过np.abs()获取。为了在可视化时更好地展现动态范围,我们通常会计算分贝(dB)形式的幅值谱:20 * np.log10(np.abs(dft_signal))。
问题出现在当np.abs(dft_signal)中的某个元素恰好为0时。数学上,log10(0)是负无穷大,这在数值计算中是无法直接表示的。NumPy会发出RuntimeWarning,并将这些位置的结果设为-inf(负无穷)。当matplotlib.pyplot.imshow尝试渲染一个包含-inf值的数组时,它可能会因为无法正确映射这些值而导致图像显示异常,最常见的就是全黑。对于某些特定的信号,例如由少量离散频率分量组成的信号,其DFT结果在大部分频率位置上可能为零,从而频繁触发此问题。
NumPy的log10函数提供了一个where参数,允许我们指定在哪些位置进行计算。对于不满足条件的位置,我们可以选择不进行计算,或者将其设置为特定的值。
import numpy as np # 假设 dft_signal_X 是一个二维DFT结果数组 # 例如: # dft_signal_X = np.fft.fft2(signal_function_X(n1, n2)) # 修正后的对数幅值谱计算 # 初始化一个全零数组作为输出,确保不满足条件的位置为0 magnitude_spectrum_X = np.zeros_like(dft_signal_X, dtype=float) # 仅在 np.abs(dft_signal_X) 不为零的位置计算对数 np.log10(np.abs(dft_signal_X), out=magnitude_spectrum_X, where=np.abs(dft_signal_X) != 0) # 乘以20转换为分贝 magnitude_spectrum_X = 20 * magnitude_spectrum_X
另一种更简洁且在可视化中常用的方法是在计算对数之前,为所有幅值添加一个非常小的正数(通常称为“epsilon”)。这样可以确保所有输入值都大于零,从而避免log10(0)的问题。
简小派
简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。
103
查看详情
import numpy as np # 假设 dft_signal_X 是一个二维DFT结果数组 # 例如: # dft_signal_X = np.fft.fft2(signal_function_X(n1, n2)) epsilon = 1e-10 # 定义一个非常小的常数,确保 log10 的输入不为零 # 修正后的对数幅值谱计算 magnitude_spectrum_X = 20 * np.log10(np.abs(dft_signal_X) + epsilon)
下面我们将上述解决方案(以添加微小常数为例)整合到原始代码中,并展示完整的可视化过程。为了更好地展示频谱,通常会对DFT结果进行零频率居中(np.fft.fftshift)处理。
import numpy as np
import matplotlib.pyplot as plt
# 图像尺寸
M, N = 256, 256
# 生成坐标 n1, n2
n1 = np.arange(0, M)
n2 = np.arange(0, N)
n1, n2 = np.meshgrid(n1, n2)
# 定义五种函数
def signal_function_1(n1, n2):
return np.sin(2 * np.pi * n1 / M + 3 * np.pi * n2 / N) # 归一化频率
def signal_function_2(n1, n2):
return np.sin(4 * np.pi * n1 / M) + np.cos(6 * np.pi * n2 / N) # 归一化频率
def signal_function_3(n1, n2):
Y = np.zeros((M, N), dtype=complex)
Y[0, 5] = Y[0, N-5] = 1 # 离散频率点
return np.real(np.fft.ifft2(Y))
def signal_function_4(n1, n2):
Y = np.zeros((M, N), dtype=complex)
Y[5, 0] = Y[M-5, 0] = 1 # 离散频率点
return np.real(np.fft.ifft2(Y))
def signal_function_5(n1, n2):
Y = np.zeros((M, N), dtype=complex)
Y[5, 5] = Y[M-5, N-5] = 1 # 离散频率点
return np.real(np.fft.ifft2(Y))
# 计算信号
signals = {
'1': signal_function_1(n1, n2),
'2': signal_function_2(n1, n2),
'3': signal_function_3(n1, n2),
'4': signal_function_4(n1, n2),
'5': signal_function_5(n1, n2)
}
# 计算DFT并处理对数谱
magnitude_spectrums = {}
epsilon = 1e-10 # 用于避免 log10(0)
for key, signal in signals.items():
dft_signal = np.fft.fft2(signal)
# 零频率居中,以便更好地可视化
dft_shifted = np.fft.fftshift(dft_signal)
# 使用添加微小常数的方法计算对数幅值谱
magnitude_spectrums[key] = 20 * np.log10(np.abs(dft_shifted) + epsilon)
# 可视化
plt.figure(figsize=(15, 10))
# 信号 1 和 2
plt.subplot(241), plt.imshow(signals['1'], cmap='gray'), plt.title('Signal 1')
plt.subplot(242), plt.imshow(magnitude_spectrums['1'], cmap='jet', vmin=-100, vmax=0), plt.title('Spectrum 1') # 调整vmin/vmax以更好地显示动态范围
plt.subplot(243), plt.imshow(signals['2'], cmap='gray'), plt.title('Signal 2')
plt.subplot(244), plt.imshow(magnitude_spectrums['2'], cmap='jet', vmin=-100, vmax=0), plt.title('Spectrum 2')
# 信号 3 和 4
plt.subplot(245), plt.imshow(signals['3'], cmap='gray'), plt.title('Signal 3')
plt.subplot(246), plt.imshow(magnitude_spectrums['3'], cmap='jet', vmin=-100, vmax=0), plt.title('Spectrum 3')
plt.subplot(247), plt.imshow(signals['4'], cmap='gray'), plt.title('Signal 4')
plt.subplot(248), plt.imshow(magnitude_spectrums['4'], cmap='jet', vmin=-100, vmax=0), plt.title('Spectrum 4')
plt.tight_layout()
plt.show()
# 信号 5 (单独显示,因为只有5个)
plt.figure(figsize=(8, 4))
plt.subplot(121), plt.imshow(signals['5'], cmap='gray'), plt.title('Signal 5')
plt.subplot(122), plt.imshow(magnitude_spectrums['5'], cmap='jet', vmin=-100, vmax=0), plt.title('Spectrum 5')
plt.tight_layout()
plt.show()代码改进说明:
在Python中进行二维信号的傅里叶变换频谱可视化时,正确处理log10(0)引发的RuntimeWarning是确保图像正确显示的关键。通过采用NumPy的条件对数计算功能(使用where参数并结合out参数初始化零值)或更常用的添加微小常数(epsilon)的方法,我们可以有效地避免错误,并生成清晰、准确的频谱图像。结合np.fft.fftshift和适当的imshow参数,可以进一步优化频谱的可视化效果,使其更具可读性和专业性。
以上就是Python中二维信号傅里叶变换频谱可视化:解决log10(0)引发的显示问题的详细内容,更多请关注其它相关文章!
# 工具
# cos
# red
# python
# 海外游戏网站推广
# 房山正规网站建设公司
# seo的试用期工资
# 推广词和营销词语
# 网站建设和管理申论
# 免费查询网站SEO优化报告
# 自制推广网站怎么做的呢
# 烟台品牌网站推广公司
# 竞价是属于seo还是sem
# 营销推广类手机
# 不满足
# 通常会
# 转换为
# 这在
# 设为
# 浮点
# 更好地
# 为零
# 是一个
# 将其
# igs
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达
顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南
热血江湖归来医师加点攻略
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
《大学搜题酱》官网地址登录
鸣潮历史学家灯塔位置一览
风车动漫官网首页入口登录 风车动漫在线观看正版地址
12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化
composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?
Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】
如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践
菜鸟驿站的取件码忘了怎么办 手机快速查询指南
响应式设计中动态背景颜色条的实现指南
PHP与SQL实践:高效实现数据复制与特定列值修改
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
php如何实现多域名共享session_php存储session到redis与跨域读取配置
PySimpleGUI中实现键盘按键与按钮事件绑定教程
动漫之家观看全集库 动漫之家免费资源网地址
《领英》查看屏蔽名单方法
百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置
PHP utf8_encode 字符编码转换陷阱与解决方案
12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧
小红书如何引流到私信?引流到私信有用吗?
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
PHP中实现JSON数据数组分页的教程
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
无人机考证官网 中国民航无人机考证官网登录入口
《洛克王国:世界》国家队搭配攻略
优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理
KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法
QQ邮箱手机版网页版 QQ邮箱登录入口地址
Final Cut Pro视频加EQ教程
使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程
VS Code中的Tailwind CSS IntelliSense插件使用技巧
c++中的const关键字用法大全_c++ const正确使用指南
网易云音乐闹钟铃声设置教程
如何在Golang中处理表单文件上传_Golang 表单文件上传示例
如何自定义苹果手机铃声
苹果手机聊天记录删除了如何恢复
使用TinyButStrong生成HTML并结合Dompdf创建PDF教程
《百度畅听版》关闭兴趣推荐方法
电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法
智慧职教mooc平台登录网址 智慧职教mooc官网直达
uc浏览器官网网页版使用 uc浏览器官网免费在线首页
惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置
苹果自助维修计划支持哪些设备机型
《友玩*》创建群聊方法
CSS如何控制元素外边距_margin实现布局间隔
汽水音乐网页版登录 汽水音乐网页端官方入口
2025-11-28
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。