简介这份资源围绕Wigner-Hough变换展开面向从事非平稳信号处理、时频分析与故障诊断的工程师及科研人员帮助理解如何将Wigner分布与Hough变换结合以抑制交叉项干扰并检测时频域中的显著特征。压缩包共4个文件以m脚本为主另含1个txt说明文件整体约3KB体积轻量便于快速阅读与运行验证。内容涉及Wigner分布计算、参数空间投票、峰值检测与特征回溯等关键环节可用于信号识别、瞬时变化检测等场景的算法复现与思路参考。目前已有205人学习下载适合希望深入掌握时频分析技术、提升信号识别能力的读者作为入门与实验素材。1. Wigner-Hough 变换从时频图里把斜线“捞”出来的工程做法雷达、声呐、通信侦察里经常遇到一类信号持续时间不长频率却随时间线性变化也就是线性调频LFM信号。单看时域它像一段幅度平稳的波形单看频域它是一条被展宽的谱线看不出调频斜率。真正能把这类信号讲清楚的是时频分布。Wigner-Ville 分布WVD在时频面上对 LFM 信号有很强的聚集性一条 LFM 在 WVD 上就是一条斜直线。问题也随之而来WVD 对多分量信号会产生交叉项时频面上除了真实斜线还多出一堆虚假的斜线。Hough 变换擅长从图像里检测直线把 WVD 当图像做 Hough 变换就能把斜线参数初始频率、调频斜率估计出来这就是 Wigner-Hough 变换WHT的基本思路。它适合做雷达/通信信号参数估计、多分量 LFM 检测的工程师也适合想把时频分析和直线检测串起来的学生。下面按“先立住原理、再跑通代码、最后避坑”的顺序讲清楚。2. Wigner-Ville 分布与 Hough 变换为什么这两步能接在一起2.1 WVD 对 LFM 的聚集性从哪来WVD 的定义是信号瞬时自相关函数的傅里叶变换。对解析信号 (x(t))连续形式写成[ W_x(t,f)\int_{-\infty}^{\infty} x(t\tau/2)x^*(t-\tau/2)e^{-j2\pi f\tau},d\tau ]对单分量 LFM 信号 (x(t)A\exp(j2\pi(f_0 t\frac{1}{2}kt^2)))代入后交叉项里 (t) 和 (\tau) 的二次项会相互抵消积分结果在时频面上集中到一条直线 (ff_0kt) 上。这就是 WVD 对 LFM “天生友好”的原因它不需要窗函数时频聚集性优于短时傅里叶变换STFT。代价是非线性多分量时会出现交叉项两个分量 (x_1,x_2) 会产生 (W_{x_1x_2}W_{x_1}W_{x_2}2\mathrm{Re}[W_{x_1,x_2}])最后那项就是交叉项位置在两个分量中间能量还可能超过自项。工程上处理交叉项有几条常见路子一是加平滑核变成平滑伪 WVDSPWVD牺牲一点聚集性换交叉项抑制二是先做信号分离或时频滤波三是干脆不抑制靠 Hough 变换在参数域把真实斜线和交叉项区分开。WHT 属于第三条前提是交叉项在参数域不会和真实分量完全重合。2.2 Hough 变换把直线检测变成参数投票Hough 变换的核心是把图像空间里的直线映射到参数空间做累加。直线用极坐标表示[ \rho x\cos\theta y\sin\theta ]图像里每个非零点 ((x,y))在所有可能的 (\theta) 上算出对应 (\rho)在 ((\rho,\theta)) 累加器里投票。同一条直线上的点会投到同一个 ((\rho,\theta)) 格子峰值就对应直线。放到 WVD 上(x) 是时间(y) 是频率检测出的直线斜率就是调频斜率 (k)截距对应初始频率 (f_0)。这里有个工程上必须注意的映射关系WVD 矩阵的行列方向、频率轴单位、时间轴单位都会影响 Hough 参数到物理参数的换算。我一般会在代码里显式记录时间步长 (dt) 和频率步长 (df)最后用 (k\Delta f/\Delta t) 反算而不是直接拿像素斜率当物理斜率。2.3 为什么不是直接对 STFT 做 HoughSTFT 也能得到时频图对 LFM 也是一条斜线为什么还要用 WVD因为 STFT 受窗长限制时间分辨率和频率分辨率互相牵制LFM 的斜线会被窗函数展宽成一条带Hough 投票时峰值变钝低信噪比下参数估计方差大。WVD 的斜线更细Hough 峰值更尖锐。代价是交叉项和计算量。常见做法是信噪比高、分量少时用 WVD分量多、交叉项严重时用 SPWVD 或先做时频滤波再 Hough。选型没有绝对关键看你的场景里交叉项会不会落在真实参数附近。3. 用 Python 跑通 Wigner-Hough 的最小流程3.1 生成 LFM 信号与计算 WVD先给一个能直接跑的最小例子。为了不依赖冷门工具箱WVD 用离散实现Hough 用累加器手写。实际项目里可以用现成库但手写一遍能看清参数怎么传。import numpy as np def lfm_signal(fs, T, f0, k, snr_db): 生成单分量 LFM 复信号加复高斯白噪声 t np.arange(0, T, 1/fs) s np.exp(1j * 2 * np.pi * (f0 * t 0.5 * k * t**2)) # 复噪声功率按信噪比换算 p_s np.mean(np.abs(s)**2) p_n p_s / (10**(snr_db / 10)) n np.sqrt(p_n/2) * (np.random.randn(len(t)) 1j*np.random.randn(len(t))) return t, s n def wvd_discrete(x): 离散 WVD返回 N x N 矩阵行时间列频率 N len(x) W np.zeros((N, N), dtypecomplex) for n in range(N): # 滞后 tau 的范围受边界限制 tau_max min(n, N-1-n) for tau in range(-tau_max, tau_max1): W[n, (ntau) % N] x[ntau] * np.conj(x[n-tau]) # 对每个时间切片做 FFT 得到频率维 W np.fft.fftshift(np.fft.fft(W, axis1), axes1) return W这段代码里fs是采样率T是时长f0是初始频率k是调频斜率snr_db控制信噪比。wvd_discrete里tau_max取min(n, N-1-n)是为了避免数组越界边界处自相关点数少这是离散 WVD 的固有边界效应。fftshift把零频移到中心方便后面 Hough 用频率轴。注意这个实现是 (O(N^2)) 量级N 上千就会慢实际项目里会用频域实现或降采样。3.2 把 WVD 幅度图送进 Hough 累加器WVD 是复数矩阵Hough 需要非负图像。通常取模值或模平方再做门限二值化或者直接用幅度加权投票。加权投票比硬二值化更稳低信噪比下不会因为门限选错丢点。def hough_lfm(W, dt, df, theta_num360): 对 WVD 幅度图做 Hough 变换返回累加器和参数轴 mag np.abs(W) Nt, Nf mag.shape # 时间、频率坐标网格 t_idx, f_idx np.meshgrid(np.arange(Nt), np.arange(Nf), indexingij) thetas np.linspace(-np.pi/2, np.pi/2, theta_num) # rho 范围按图像对角线长度取 rho_max int(np.ceil(np.hypot(Nt, Nf))) rho_axis np.arange(-rho_max, rho_max1) acc np.zeros((len(rho_axis), theta_num)) # 只对超过噪声底的像素投票减少计算量 thresh 0.1 * mag.max() mask mag thresh for i, theta in enumerate(thetas): rho t_idx * np.cos(theta) f_idx * np.sin(theta) rho_idx np.round(rho).astype(int) rho_max valid mask (rho_idx 0) (rho_idx len(rho_axis)) np.add.at(acc[:, i], rho_idx[valid], mag[valid]) return acc, thetas, rho_axisdt和df在这里没直接进累加器但后面换算物理参数要用。theta_num决定角度分辨率360 对多数场景够用再高只是增加计算量。thresh取最大幅度的 10% 是个经验值信号弱时可以降到 5%交叉项强时可以提到 20%。np.add.at做加权累加比np.histogram灵活能直接带幅度权重。3.3 从峰值反算调频斜率和初始频率累加器峰值位置对应 ((\rho,\theta))要换算成物理参数。时间轴索引乘 (dt) 得时间频率轴索引乘 (df) 得频率直线在时频面上的斜率就是调频斜率。def peak_to_params(acc, thetas, rho_axis, dt, df): 取累加器最大值反算 k 和 f0 idx np.unravel_index(np.argmax(acc), acc.shape) rho_peak rho_axis[idx[0]] theta_peak thetas[idx[1]] # 直线在 (t, f) 平面rho t*cos(theta) f*sin(theta) # 写成 f (-cos/sin) * t rho/sin if abs(np.sin(theta_peak)) 1e-6: return None, None k_pix -np.cos(theta_peak) / np.sin(theta_peak) # 像素斜率 f0_pix rho_peak / np.sin(theta_peak) k_phys k_pix * df / dt # 物理调频斜率 Hz/s f0_phys f0_pix * df # 物理初始频率 Hz return k_phys, f0_phys这里k_pix是像素坐标下的斜率乘df/dt才是物理斜率。f0_pix是截距乘df得初始频率。如果sin(theta)接近零说明直线接近垂直在时频面上对应频率几乎不随时间变化不是 LFM直接返回 None。实际用时还要注意频率轴是否已经 fftshift如果没 shift零频在第一个点换算要加偏移。3.4 参数怎么设采样率、窗长、门限的取舍参数作用经验取值影响fs采样率信号最高频率的 2.5~4 倍太低会混叠太高浪费算力NWVD 点数256~1024越大时频分辨率越高O(N²) 越慢theta_numHough 角度数180~720越大斜率分辨率越高累加器越大thresh投票门限最大幅度的 5%~20%太低引入噪声太高丢弱分量snr_db信噪比按实际场景低于 -5 dB 时单次 WVD 往往不够采样率我一般取信号最高频率的 3 倍左右留够余量又不至于让 N 太大。N 取 512 是个平衡点再大 Hough 累加器内存涨得快。theta_num 取 360 时斜率分辨率大约 0.5 度对多数 LFM 够用。门限是最需要调的建议先看 WVD 幅度直方图把门限设在噪声底和信号峰之间。4. 多分量与低信噪比下的翻车点Wigner-Hough 避坑清单4.1 交叉项被当成真实分量现象两个 LFM 分量时Hough 累加器出现三个以上峰值多出来的峰值对应交叉项参数估计直接错。原因WVD 是非线性变换多分量交叉项在时频面上也是斜线Hough 无法从几何上区分。解决先做 SPWVD 平滑或在 Hough 前对 WVD 做时频滤波把自项区域保留、交叉项区域压低。更稳的做法是逐分量提取检测到最强峰值后在时频面上把该直线附近区域置零再检测下一个峰值。4.2 边界效应让斜线两端“翘起来”现象WVD 矩阵两端幅度异常Hough 投票时两端点把峰值拉偏斜率估计有系统误差。原因离散 WVD 在 (n) 接近 0 或 (N-1) 时(x(n\tau)) 或 (x(n-\tau)) 越界自相关点数减少。解决计算 WVD 时只保留中间有效区域比如去掉前后各 10% 的时间点或者对信号做补零延拓让边界处也有完整自相关。我一般直接裁掉两端简单有效。4.3 频率轴没对齐导致初始频率整体偏移现象调频斜率估得准初始频率总是差一个固定值。原因WVD 做完 FFT 后零频位置取决于是否 fftshiftHough 里频率索引到物理频率的换算没加偏移。解决统一在 WVD 输出后做fftshift并记录频率轴向量freq np.fft.fftshift(np.fft.fftfreq(N, 1/fs))换算时用freq查表而不是用索引乘 df。这个坑很隐蔽因为斜率不受影响只有截距偏。4.4 低信噪比下 Hough 峰值淹没在噪声里现象snr_db 低于 -5 dB 时累加器最大值和次大值差距很小峰值位置随机跳。原因单次 WVD 的噪声方差大Hough 投票把噪声也累加进去。解决多帧非相干积累对多段信号的 WVD 幅度图叠加后再 Hough或者用 SPWVD 降方差再不行就延长观测时间让 Hough 累加器里的信号投票数增加。实测下来积累 4~8 帧能把可检测信噪比往下压 3~5 dB。4.5 计算量爆炸N 稍大就跑不动现象N 从 512 提到 1024WVD 计算时间涨 4 倍Hough 累加器内存涨 4 倍普通笔记本跑一次要几十秒。原因WVD 是 (O(N^2))Hough 是 (O(N^2 \cdot \theta_{num}))。解决先对信号降采样到刚好覆盖带宽再算 WVDHough 只对超过门限的像素投票稀疏化后计算量能降一个量级或者用频域 WVD 实现把自相关那层循环向量化。工程上没必要追求全分辨率够用就行。5. 进阶技巧用参数域峰值做分量个数估计与验证前面讲的都是“已知有 LFM估参数”。实际场景里更常见的是“不知道有几个分量”。WHT 的参数域峰值天然能用来做分量个数估计累加器里每个显著峰值对应一个候选 LFM峰值的相对高度反映分量能量。做法是先在累加器里做二维峰值检测取局部极大值再按峰值高度排序用峰值高度比或绝对门限决定保留几个。from scipy.ndimage import maximum_filter def detect_components(acc, thetas, rho_axis, dt, df, min_ratio0.3): 检测累加器里的多个峰值返回候选参数列表 # 局部极大值检测邻域大小按角度和 rho 分辨率取 local_max maximum_filter(acc, size(5, 5)) peaks (acc local_max) (acc min_ratio * acc.max()) rho_idx, theta_idx np.where(peaks) results [] for r, th in zip(rho_idx, theta_idx): rho_peak rho_axis[r] theta_peak thetas[th] if abs(np.sin(theta_peak)) 1e-6: continue k_pix -np.cos(theta_peak) / np.sin(theta_peak) f0_pix rho_peak / np.sin(theta_peak) results.append({ k: k_pix * df / dt, f0: f0_pix * df, peak: acc[r, th] }) # 按峰值高度排序 results.sort(keylambda x: -x[peak]) return resultsmaximum_filter的邻域大小要跟累加器分辨率匹配角度方向 5 个格子、rho 方向 5 个格子能滤掉毛刺又不至于把邻近分量合并。min_ratio取 0.3 意味着只保留峰值高度超过最大值 30% 的候选这个值要根据交叉项强度调交叉项强时提到 0.5。返回的列表按峰值排序第一个就是最强分量。验证估计对不对有两个实用手段。一是重构信号用估出的 (k) 和 (f_0) 生成参考 LFM和原信号做相关相关系数接近 1 说明估得准。二是残差时频图从原 WVD 里减去估计分量对应的斜线区域看残差里还有没有明显斜线有就说明漏了分量。我习惯两个都做重构相关看单分量精度残差图看有没有漏检。还有一个容易忽略的点Hough 的角度分辨率决定了斜率估计的量化误差。theta_num 取 360 时角度步进 0.5 度对应斜率误差在极端角度下会放大。如果对斜率精度要求高可以在粗检测峰值附近做局部细化用更密的角度网格二次投票或者直接用最小二乘对峰值附近的时频点拟合直线。后者精度更高代价是要先把斜线附近的点选出来。最后说个习惯每次调完参数我都会把 WVD 幅度图和 Hough 累加器并排画出来看。WVD 看斜线清不清晰、交叉项多不多累加器看峰值尖不尖锐、有没有多峰。图上看一眼比盯着数字调参快得多。这套流程从信号生成到参数反算核心代码不到 100 行但每个参数背后都有取舍先把单分量跑通再上多分量和低信噪比步子迈稳了后面少返工。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
PSO-BP四分类MATLAB代码包拆解:从调参到复现的完整流程 简介:这份资源面向从事智能信息处理、模式识别与预测任务的研究者与工程人员,提供一套基于MATLAB实现的粒子群算法优化BP神经网络权值阈值的四分类预测方案,用于缓解BP网络易陷入局部极小、收敛偏慢等问题。压缩包共8个文件,约96K… · 2026/11/7 7:46:14
Python艺术签名生成器:PIL与贝塞尔曲线实战 简介:这份Python脚本项目源码实现了一个艺术签名生成器,面向具备Python基础、希望提升GUI编程与图像处理实战能力的开发者。项目围绕用户输入姓名后自动生成个性化签名展开,涉及Tkinter图形界面搭建、Pillow字体加载与图像绘制、贝塞尔曲线等… · 2026/11/8 10:17:23
CNN-GRU光伏功率多变量多步预测:Matlab完整源码与工程落地避坑指南 简介:这份资源面向计算机、电子信息工程、数学等专业的大学生及算法初学者,提供CNN-GRU卷积神经网络结合门控循环单元的多变量多步预测完整实现,重点应用于光伏功率预测场景,可支撑课程设计、期末大作业与毕业设计。压缩包共7个文… · 2026/11/5 7:02:59
考电工证的条件是什么?保姆级教程帮你搞定异地转移 考电工证的条件是什么?保姆级教程帮你搞定异地转移 之前考的证在外省能不能转过来?这几乎是所有考电工证的人最关心的问题之一,特别是那些已经在外地工作、想要把证书转回老家,或者打算换个城市发展的朋友。今天这篇保姆级教程,从条件、流程到异地转移,… · 2026/11/9 14:00:43
考电工证的条件是什么?费用多少钱?别怕考不过白交培训费 考电工证的条件是什么?费用多少钱?别怕考不过白交培训费 怕考不过白交培训费?这是很多想考电工证的朋友最怕听到的一句话。尤其是现在电工证的报考门槛越来越高,不少人担心花了几千块培训费,结果考试没过,钱就白花了。不过,只要你了解清楚考电工证的条… · 2026/11/9 14:00:43
铁岭电工证年审多少钱 报考避坑指南 电工证过期了怎么处理 铁岭电工证年审多少钱 报考避坑指南 电工证过期了怎么处理 证书过期了不知道怎么复审延期?别急,这事儿很多人遇到过,今天咱们就来聊聊 铁岭电工证年审多少钱 这个事儿,顺便给大家讲讲 郑州报考避坑指南 ,让想考证或正在复审的你少走弯路。… · 2026/11/9 14:00:43
常平电工证报考条件在哪考?没证别想进工地 常平电工证报考条件在哪考?没证别想进工地 你是不是也在为找工作发愁?电工证没考下来,连工地门都进不去。别急,这期咱们就聊清楚 常平电工证报考条件 ,还有 在哪考 的干货,帮你少走弯路,早日上岗拿工资。 一、电工证到底是什么?为什么必须考?… · 2026/11/9 14:00:43
考电工证没得学历2026河南最新政策怎么报更靠谱 考电工证没得学历2026河南最新政策怎么报更靠谱 你是不是也遇到过这种情况:想考电工证,但学历不够,不知道去哪报名,怕被中介坑?现在河南2026年最新政策已经出台,对报考条件和流程做了明确规定,关键是要找对地方,别被那些“包过”“包拿证”的… · 2026/11/9 13:59:43
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/9 2:05:04
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17
电工证不需要考复审延期怎么办理 通过率揭秘 电工证不需要考复审延期怎么办理 通过率揭秘 不知道去哪报名怕被中介坑?电工证不需要考复审延期怎么办理?最近不少学员都在问这个问题,尤其是刚拿到证的新手,对复审流程一知半解,生怕被培训机构套路。别担心,今天咱们就来聊聊电工证复审的真相,尤其是… · 2026/11/9 0:00:54
砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同心声。尤其是像电工这样的特种作业,操作证不仅关系到能不能上工,还直接关系到工资高低和职业发展。可偏偏,很多人连怎么报名、去哪… · 2026/11/9 0:00:54
南方电网电工作业含金量高吗?应届生怎么考怎么干? 南方电网电工作业含金量高吗?应届生怎么考怎么干? 工地太忙根本没时间复习考试,这不是个别现象,而是很多刚毕业的工程类学生面临的现实。南方电网电工作业的证书,听起来门槛不低,但 含金量… · 2026/11/9 0:00:54
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08