ELAI S.r.l.

图上点更多,数据却没变:补零解决不了什么

图上点更多,数据却没变:补零解决不了什么 通过完整算例解释方法、假设与局限。

图上点更多,数据却没变:补零解决不了什么

更密的图,不代表更多测量

传感器采集十分之一秒振动,一个宽峰可能隐藏两个近邻振荡。变换前补零,图变得平滑而密集,但真的提高分离能力了吗?问题是观测信息,而非美观。我们用 100 与 103 赫兹的合成信号比较补零与延长采集。

先区分三个量

采样率 f_s=1000 Hz 表示每秒一千次,N=100 对应窗口 T=N/f_s=0.1 s。两个正弦分量幅度均为任意单位一、初相为零且无噪声。离散傅里叶变换 DFT 将样本与复振荡比较,FFT 是计算算法,不会创造观测。采样率、持续时间与图上频率间距必须区分。

x[n] = cos(2π·100·n/f_s) + cos(2π·103·n/f_s), n=0,…,N−1

N 点 DFT 的频率为 k f_s/N,本例间隔十赫兹,没有点恰在 103 Hz。非网格分量可能显得变弱并分布到邻点,因此采样最大值不一定是唯一频率。要理解补零,就把同一求和写到任意 f 上。

X(f) = Σ_(n=0..N−1) x[n] exp(−j 2π f n/f_s)

补零改变的是求和的评价位置

补到 M=1600,前一百个样本不变。新增项全为零,X(f) 这条函数不变,只改为在 k f_s/M 处评价,间隔 0.625 Hz。并没有额外观测 1.5 秒振动,只是在更多频率上评价原百个样本,无论软件是否称其为“FFT 分辨率”。

脚本验证 M=16N 时,长 DFT 每隔十六点与原 DFT 在给定数值容差内相同,即同一频谱更密采样。补零有助于定位已可分辨的峰并减小网格误差,却不增加关于未知信号的独立方程。插值有用,但不等于新信息。

观测窗口决定主瓣宽度

矩形 N 样本窗口内,频率 f_0 的孤立复指数产生几何级数,模为 |sin(πNδ/f_s)/sin(πδ/f_s)|,δ=f−f_0,δ=0 时极限 N。中心附近第一对零点为 ±f_s/N,主瓣零点间宽 2f_s/N,取决于窗口而非绘图点数 M。实正弦另含负频率分量。

T=0.1 s 时首零点距中心十赫兹,两分量只差三赫兹,增大 M 不会收窄主瓣。保持采样率而采集 N=1000,即观测一秒,首零点距中心降至一赫兹,这才改变数据。图比较短、长记录的补零频谱,按实际样本数而非 M 归一,避免人为降低幅度。

NMT(s)间隔(Hz)
1001000.110
10016000.10.625
10001600010.0625
两曲线均补零、频率相同但观测时长不同。关注峰分离而非点密度,信号为合成。
两曲线均补零、频率相同但观测时长不同。关注峰分离而非点密度,信号为合成。

这个比较不能证明什么

主瓣宽度不是所有估计器的绝对壁垒:强假设下的参数法可估计更近频率,但噪声、模型阶数和可识别性变得关键。这里只比较确定信号的 DFT,不实现超分辨率。其他窗函数权衡主瓣与旁瓣;分开的峰也不能独自证明两个故障或物理源。

代码使用 NumPy 2.5.3,保存频谱与版本,不测设备。更长 FFT 消耗计算和内存,更长观测增加采集延迟,不能与计算延迟混淆。先确定允许观测多久、需要区分何种细节。补零让已有观测更易阅读,并不延长真正观察的时间。

SciPy 1.18.0 — Spectral analysis and zero-padding.

import numpy as np
import json,sys
from pathlib import Path
fs=1000.;runs=[]
for n in [100,1000]:
 t=np.arange(n)/fs;x=np.cos(2*np.pi*100*t)+np.cos(2*np.pi*103*t)
 small=np.fft.rfft(x);m=16*n;large=np.fft.rfft(x,n=m)
 assert np.allclose(large[::16],small,rtol=1e-12,atol=1e-10)
 f=np.fft.rfftfreq(m,1/fs);sel=(f>=80)&(f<=125)
 runs.append(dict(n=n,padded=m,duration=n/fs,spacing=fs/n,paddedSpacing=fs/m,frequency=f[sel].tolist(),amplitude=(2*np.abs(large[sel])/n).tolist()))
r=dict(python=sys.version.split()[0],numpy=np.__version__,seed=None,scope='Synthetic two-tone signals, not sensor or hardware measurements',fsHz=fs,tonesHz=[100,103],runs=runs)
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 25 日。