☰
深入理解信号处理中的magnitude:从时域到频域的幅度计算与工程实践
2026/10/30 3:12:38 网站建设 项目流程

magnitude,中文一般叫幅值或者幅度,搞信号分析、音频处理、振动检测甚至数据科学的朋友,几乎没有一天不跟它打交道。我最早认真琢磨这个词,是在做音频响度分析工具的时候:一段录音读进来,画波形要看时域幅度,做频谱要看频域幅度,滤波器设计要看幅频响应,音量归一化还要拿峰值幅度当分母。当时觉得这玩意儿太基础了,随手调一个np.abs()就完事,直到后来被单位的坑、归一化的坑、窗函数的坑轮番教育,才意识到一个看似简单的 magnitude 计算,背后牵扯着整套信号处理的基本功。

如果你也在做音频分析、故障诊断、振动监测,或者只是想知道一段采集到的信号里到底藏着什么频率成分,这篇文章应该能帮你把"幅度"这件事彻底理顺。我会从项目角度完整拆解:什么是 magnitude、不同语境下它有什么含义、怎么用 Python 高效计算、以及那些常规文档里不会写的避坑细节。项目不大,但里面每一层都有讲究,看完你也能搭一套自己的幅度分析小工具。

1. 项目定位:一条链路摸清信号的幅度底细

1.1 先搞清楚你到底在算哪种 magnitude

很多人一上来就写np.abs(x),但"幅值"这个词在不同的使用场景里,对应的物理意义完全不一样。简单梳理一下,工程实践中至少有三种最常见的 magnitude,千万别混为一谈。

第一种是向量的模长,也就是向量从原点到终点的长度。二维空间里sqrt(x² + y²)大家都熟,三维加一个 z,再往上推广到 N 维,公式是一样的套路。这类计算在机器学习里的特征归一化、梯度裁剪,以及物理仿真里的力向量合成里经常出现。

第二种是信号的瞬时幅度。一个连续信号 x(t) 在某个时刻 t 的值,说"这个时刻信号的 magnitude 有多大",其实就是在说这个采样点的绝对值。时域的波形图,横轴是时间、纵轴是幅度,这就是最直观的时域 magnitude。

第三种是频域幅度,也就是对一段信号做傅里叶变换之后,每个频率分量的大小。这也是 magnitude 这个词在工程里出现频率最高的地方。FFT 结果是复数,实部虚部都有,abs(fft_result)取到的模长,就是该频率分量的强度。

这三种概念在同一个项目里经常交替出现。比如做一个电机振动分析:采集原始振动波形,看时域幅值判断有没有冲击;做频谱分析,看频域幅度判断是哪一阶故障频率;最后归一化特征向量,算的又是向量模长。所以做项目前先问自己一句:我现在要的 magnitude,到底是哪一种?这个看似废话的问题,能避免后面一大串单位混乱。

1.2 项目目标和工具选型

我这个项目叫 magnitude,其实目标很朴素:做一套足够通用的幅度分析脚本,输入是一段信号和采样率,输出是这个信号的时域统计、频域幅度谱,以及关键成分的幅度读数。它至少能回答这几个问题:

  • 这段信号的最大峰值是多少?有效值(RMS)是多少?有没有削波风险?
  • 信号里主要包含哪些频率分量?每个分量的幅度多大?
  • 某个频段的能量占比是多少?

工具选型上没有太多纠结的空间,直接选 Python + NumPy + SciPy + Matplotlib。理由很实际:NumPy 的 FFT 和线性代数接口足够成熟,SciPy 提供了窗函数和滤波器的标准实现,Matplotlib 能把结果直接可视化。相比 MATLAB,这套方案免费、可自动化、方便嵌入现有数据处理流程,而且社区资料多,遇到问题搜起来快。核心计算用到的函数就那几个,代码量少,逻辑也容易审查。

2. 核心原理:幅度计算背后那些绕不开的数学

2.1 向量的模长:从勾股定理到 N 维空间

先讲最基础的向量模长,因为它是理解一切幅度计算的起点。二维向量(x, y)的长度是sqrt(x² + y²),这在几何上就是勾股定理。三维向量加一个 z,公式变成sqrt(x² + y² + z²)。到了 N 维空间,规律完全一样,只是项数变多:

magnitude = sqrt(x1² + x2² + ... + xn²)

用 NumPy 实现极简单:

import numpy as np vector = np.array([3.0, 4.0]) norm = np.sqrt(np.sum(vector ** 2)) # 或者直接用内置函数 norm = np.linalg.norm(vector)

日常做特征工程的时候,np.linalg.norm是最省事的。但要注意,这个函数在深度学习框架里默认算的是 Frobenius 范数,行为略有差异。如果追求代码可读性和可控性,手写sqrt(sum(x**2))反而更清晰。

这层计算的工程意义在于归一化。比如一组特征向量,每个样本的幅值范围差了好几个数量级,直接喂给模型会出问题。这时候把每个向量除以它的模长,让它变成单位向量,量纲差异就消失了。梯度裁剪也是同理,梯度过大时按模长缩放,防止训练爆炸。

2.2 从 FFT 到幅度谱:为什么频域能看出信号成分

傅里叶变换做的事情,本质上就是"把一段波形拆成不同频率的正弦波之和"。离散傅里叶变换(DFT)的公式长这样:

X[k] = sum_{n=0}^{N-1} x[n] * exp(-j*2*pi*k*n/N)

其中每个 X[k] 都是一个复数。实部对应余弦分量,虚部对应正弦分量。问题在于,一个复数a + bj到底代表这个频率分量有多强?这就需要取它的模长:

magnitude[k] = sqrt(Re(X[k])² + Im(X[k])²) = abs(X[k])

假设你有一组信号x = sin(2*pi*440*t) + 0.5*sin(2*pi*2000*t),做 FFT 之后,在 440 Hz 和 2000 Hz 附近的频点会各出现一个谱峰,谱峰的高度就代表该频率成分的幅度。440 Hz 那个峰的幅度会高于 2000 Hz 那个峰,因为前面的正弦波幅值 1.0 更大,后面的只有 0.5。这个"高低关系"就是频域幅度最直接的信息。

不过要注意,FFT 的结果是对称的。对于实数信号,正频率和负频率的幅度完全一样,信息有一半是冗余的。所以工程上通常只取正频率部分,并把幅度乘以 2,得到"单边谱"。这个细节后面实操部分会专门解释。

2.3 三种幅度表达:线性值、dB 与 dBFS

算出了幅度,怎么表达又是另一门学问。最常见的有三种表达方式,适用场景各不相同。

线性幅度最直观。幅度 0.8 就是 0.8,和原始信号的物理量纲一致。适合展示波形、计算峰值、做加法运算。

dB(分贝)幅度是工程上更常用的表达,公式是dB = 20 * log10(amplitude)。为什么是 20 而不是 10?因为功率与幅度是平方关系,功率比用 10*log10 计算,幅度比折算回来后,10*log10(x²) = 20*log10(x)。dB 的好处是能把从 0.001 到 1.0 这种跨越三个数量级的幅度变化,压缩成 -60 dB 到 0 dB 这样比较直观的区间,并且方便描述动态范围。

dBFS是数字音频领域特有的表达,FS 是 Full Scale(满刻度)的缩写。它规定数字信号允许的最大幅度为 0 dBFS,所有数值都不超过这个上限。信号幅度 0.5 对应约 -6 dBFS,信号幅度 0.25 对应约 -12 dBFS。做音量归一化时,业界标准经常就是"峰值不超过 -1 dBFS"或者"响度压在 -14 LUFS",本质上都是在跟 dBFS 打交道。

我整理了一张对照表,方便快速心算:

线性幅度dB值dBFS近似值
1.00 dB0 dBFS
0.5-6 dB-6 dBFS
0.25-12 dB-12 dBFS
0.1-20 dB-20 dBFS
0.01-40 dB-40 dBFS
0.001-60 dB-60 dBFS

2.4 峰值幅度、RMS 幅度与功率幅度:各有各的用途

同样是"幅度",峰值和 RMS(有效值)表达的信息完全不同。峰值幅度是信号在一段时间内绝对值最大的采样点,它决定了一个系统会不会削波、会不会过载。放大器要看峰值,DAC 输出也要看峰值,超过满刻度就会削顶失真。

RMS 幅度的计算方式是sqrt(mean(x²)),它衡量的是信号的整体能量水平。正弦波的 RMS 等于峰值的1/sqrt(2),约 0.707 倍。RMS 在音频里更接近人耳感知的响度,因为人耳对持续声音的强弱感知,不是看瞬间峰值,而是看一段时间的平均能量。在振动监测里,RMS 也比峰值更能反映机器整体的振动烈度。

还有一个概念叫功率幅度,它更抽象一些,通信系统里常用10*log10(功率)来算 dBm、dBW 这类绝对功率单位。做信号分析时,功率往往正比于幅度的平方,所以看功率谱和看幅度谱是同一枚硬币的两面,只是坐标刻度不同。

选择哪一类的关键判断标准,是你的下游任务需要什么。如果做削波检测,用峰值;如果做响度评估,用 RMS;如果描述频谱形状,用幅度谱或功率谱。不要拿峰值去衡量能量,也不要拿 RMS 去判断会不会削波。

3. 实操实现:从零搭一个 magnitude 分析流程

3.1 环境准备与测试信号

这一节直接上代码。我用到的库只有四个:NumPy 负责数值计算,SciPy 提供窗函数,Matplotlib 做可视化,都是 Python 数据科学生态里的标配。测试信号我故意设计成两个正弦波的叠加:一个 440 Hz 幅度 0.8,一个 2000 Hz 幅度 0.2。这样后面看幅度谱时,两个峰的相对高低一目了然。

import numpy as np import matplotlib.pyplot as plt from scipy import signal fs = 44100 # 采样率 44.1 kHz,CD 音质标准 duration = 1.0 # 时长 1 秒 n_samples = int(fs * duration) t = np.arange(n_samples) / fs f0, f1 = 440.0, 2000.0 a0, a1 = 0.8, 0.2 sig = a0 * np.sin(2 * np.pi * f0 * t) + a1 * np.sin(2 * np.pi * f1 * t)

为什么把时长设为 1 秒?因为 FFT 的频率分辨率正好是fs / n_samples = 1 Hz,而 440 和 2000 都是整数频率,这样两个正弦波能精准落在对应的频点中心,后面演示幅度读数时不会因频谱泄漏产生误差。如果时长不凑整,正弦频率也不是整数,谱峰就会"糊"到相邻频点上,幅度读数也会偏低。这是设计测试信号时的常用技巧,务必记住。

3.2 时域幅度:瞬时幅度、峰值与 RMS

时域分析是整个流程的地基。拿到信号后,我最先看的是三类指标:瞬时幅度的整体分布、峰值、以及 RMS。

instantaneous_amplitude = np.abs(sig) peak_amplitude = np.max(instantaneous_amplitude) rms_amplitude = np.sqrt(np.mean(sig ** 2)) print(f"峰值幅度: {peak_amplitude:.4f}") print(f"RMS 幅度: {rms_amplitude:.4f}") print(f"峰值/RMS 比: {peak_amplitude / rms_amplitude:.4f}")

理论值也很好验证:两个正弦波叠加,峰值不会简单地等于 0.8 + 0.2 = 1.0,因为两个频率的相位不同,峰值是它们矢量合成的结果。RMS 则等于sqrt(0.8² + 0.2²) / sqrt(2),约 0.5831。如果看到计算结果和理论对不上,说明代码或者采样过程有问题,这种"自检"思维做信号处理时非常宝贵。

峰值/RMS 比(也叫波峰因子,Crest Factor)也值得记录。纯正弦波的理论波峰因子是sqrt(2)约 1.414,而音频信号通常远高于这个值,因为音乐和语音的瞬态成分很多。波形越"尖"(比如脉冲信号),波峰因子越大。这个参数对动态范围设计很有参考价值。

3.3 频域幅度谱:FFT、单边谱与频率轴

接下来是核心中的核心:频域幅度谱。我用的是rfft,它专门针对实数输入做优化,输出只有正频率部分,比完整 FFT 少算一半。

# 用 rfft 计算单边频谱 X = np.fft.rfft(sig) N = len(sig) # 关键一步:除以 N,把 FFT 结果归一化为真实幅度 X_norm = X / N # 计算幅度谱 mag = np.abs(X_norm) # 转成单边幅度谱:除 DC 和 Nyquist 点外,正频率幅度翻倍 # 因为 rfft 结果中的能量原本是正负频率各一半,取单边谱要合回来 mag_single = mag.copy() mag_single[1:-1] *= 2 # 频率轴 freqs = np.fft.rfftfreq(N, d=1.0 / fs)

这里有几件事必须要搞明白。第一,为什么要除以 N?NumPy 的 FFT 默认是不归一化的,直接计算结果和 DFT 公式一致,正弦波的幅度会被放大 N 倍。除以 N 之后,频谱上某个频点的幅值才等于该频率成分在时域里的实际幅度。第二,为什么单边谱要乘 2?因为rfft虽然只返回正频率,但每个正频率 bin 里只包含总能量的一半,另一半在负频率上。把幅度乘 2,得到的是"该频率实际正弦分量的完整幅度"。第三,DC 点和 Nyquist 点不能乘 2。DC 就是第 0 个频点,它对应信号的直流偏移;Nyquist 点(索引 N/2)是最高频,它没有对应的负频率配对,乘 2 会得到两倍错误值。

验证一下结果:在 440 Hz 处mag_single应该约等于 0.8,在 2000 Hz 处约等于 0.2,其余位置接近 0。这是我每次写完频谱分析代码都会做的数值自检,强烈推荐你也养成这个习惯。

3.4 封装一个完整的幅度谱分析函数

单次分析不够,工程化要做的是把流程固化成函数,这样以后换一条信号,只需要改文件名和采样率。我封装的函数会返回三个结果:单边幅度谱、对应频率轴、以及按强度排序的前 K 个频率成分。

def analyze_magnitude_spectrum(sig, fs, top_k=5): """ 输入信号和采样率,返回单边幅度谱、频率轴和主要频率分量。 """ n = len(sig) X = np.fft.rfft(sig) / n mag = np.abs(X) mag_single = mag.copy() if n % 2 == 0: # 偶数长度:最后一个频点是 Nyquist,不乘 2 mag_single[1:-1] *= 2 else: # 奇数长度:没有 Nyquist 点,全部正频点乘 2 mag_single[1:] *= 2 freqs = np.fft.rfftfreq(n, d=1.0 / fs) # 去掉 DC 项后,找幅度最大的 K 个频点 peak_indices = np.argsort(mag_single[1:])[::-1][:top_k] + 1 peaks = [(round(freqs[i], 2), round(mag_single[i], 4)) for i in peak_indices] return freqs, mag_single, peaks

用这个函数跑前面构造的测试信号,输出会是这样:

freqs, mag_single, peaks = analyze_magnitude_spectrum(sig, fs, top_k=3) print(peaks) # [(2000.0, 0.2), (440.0, 0.8), (???)]

注意按强度排序后,2000 Hz 的幅度 0.2 排在前面只是因为它被[1:]切片后索引顺序变化了,值本身完全正确。实际输出里 440 Hz 应该排在 2000 Hz 前面,因为 0.8 大于 0.2。这个函数最大的价值在于,你拿任意一段实测信号进来,它能快速告诉你主要频率成分是什么、各自分量多大,故障诊断的第一步往往就是这个。

3.5 可视化:线性和 dB 坐标画出来的图完全不同

代码算出一堆数字,最终还是要靠眼睛看。可视化是我最在意的环节,因为很多问题在数表里看不出来,画成图立刻就暴露了。

fig, axes = plt.subplots(2, 1, figsize=(10, 7)) # 上图:线性幅度 axes[0].plot(freqs[:5000], mag_single[:5000]) axes[0].set_title("Linear Magnitude Spectrum") axes[0].set_xlabel("Frequency (Hz)") axes[0].set_ylabel("Magnitude") # 下图:dB 幅度 mag_db = 20 * np.log10(mag_single + 1e-12) axes[1].plot(freqs[:5000], mag_db[:5000]) axes[1].set_title("Magnitude Spectrum in dB") axes[1].set_xlabel("Frequency (Hz)") axes[1].set_ylabel("Magnitude (dB)") plt.tight_layout() plt.show()

线性坐标下,小信号几乎贴着 X 轴,根本看不出细节;换成 dB 坐标后,小信号被"放大"了,噪声底、旁瓣、小峰值一览无余。这不是玄学,而是因为 dB 压缩了动态范围。类似地,频率轴也可以切换成 log 刻度,低频区间的细节会看得更清楚。实际工程项目里,我八成以上的时间看的是 dB 谱。

4. 工程细节:单位、归一化与窗函数里的坑

4.1 归一化:什么时候除 N,什么时候不除

FFT 的归一化可以说是新手最容易踩的坑。NumPy 的np.fft.fft默认不除 N,所以直接np.abs(np.fft.fft(sig))的结果不是真实幅度,而是放大了 N 倍。问题在于,很多书上讲 DFT 的时候都省略了归一化细节,导致网上抄来的代码千奇百怪。

我的建议是:统一在 FFT 之后除以 N,并在代码里写注释说明。这样得到的幅度谱和原始信号同一量纲,方便做数值验证。如果你只需要看相对大小(比如找峰值频率),不除 N 也能定位,但一旦涉及比较不同长度信号的幅度,不归一化就完全没法比了。

还有一点容易被忽略,就是整型信号要先转浮点并归一化。一段 16-bit PCM 音频,采样值范围是 -32768 到 32767,直接丢进 FFT,结果会比浮点信号大几万倍,画图时坐标轴根本没法看。正确的做法是除以 32768.0,先映射到 -1 到 1 的浮点区间再做分析。这在音频处理里属于基本常识,但架不住踩的人多。

4.2 窗函数:为什么幅度变小了,怎么补回来

实际信号不可能都像测试信号那样时长刚好凑整数周期,绝大多数情况是截取一段有限长数据,FFT 会默认信号是周期的,截断处的突变会产生频谱泄漏。解决思路是乘一个窗函数,让信号在两端平滑过渡到接近 0。

但窗函数会改变幅度。以最常用的 Hann 窗为例,它会把信号整体"压扁"到一半左右的幅度,导致频谱峰值比真实值偏小约 6 dB。工程上需要一个幅度校正系数。

# 加 Hann 窗 window = np.hanning(n_samples) sig_windowed = sig * window # 做 FFT,归一化 X_win = np.fft.rfft(sig_windowed) / n_samples mag_win = np.abs(X_win) mag_win_single = mag_win.copy() mag_win_single[1:-1] *= 2 # 幅度校正:Hann 窗的相干增益约 0.5,除以它补回幅度 coherent_gain = np.mean(window) # Hann 窗约为 0.5 mag_corrected = mag_win_single / coherent_gain

用np.mean(window)计算相干增益是最稳的方式,不管什么窗函数都适用。加窗后幅度谱的峰值会比不加窗时略有展宽,这是分辨率换泄漏抑制的必然代价。做工程取舍时,先明确需求:如果关心频点定位精度,矩形窗或尽量延长记录时间;如果关心幅度测量准确性且信号持续存在,Hann 窗加幅度校正通常是最好的折中。

4.3 DC 分量:0 Hz 处的巨大尖峰如何掩盖一切

实测信号往往有直流偏移,比如传感器零点没有校准,或者 ADC 有参考电压偏差。这个 DC 分量会在 0 Hz 处形成一个巨大的谱线,而且因为幅度谱图的比例问题,它会把附近低频成分压得在图上几乎看不见。

处理办法很简单,分析前先去掉均值:

sig_no_dc = sig - np.mean(sig)

如果 DC 不是一个常数,而是随温度缓慢漂移,那就要用高通滤波器或去趋势工具来处理。我常用的组合是scipy.signal.detrend去掉线性趋势,再减去均值去掉常数偏移。做频谱分析前先消除 DC,这应该成为肌肉记忆,不然低频频段全是假象。

4.4 频谱泄漏:谱线变糊不是信号有问题,是你截断方式有问题

频谱泄漏这个坑,很多初学者会有误解,以为峰值变宽、旁边出现一堆小毛刺是信号本身的问题。其实根源在于截断。设想你有 1000 个采样点,信号正好重复 100 次,FFT 会认为这是完美的周期信号;但如果信号只重复了 99.5 次,首尾就不连续,FFT 强行把它当周期的,截断处的跳变在频域就变成了一大堆多余的频谱能量。

泄漏的后果是:真实频率的能量"漏"到了旁边一系列频点,形成裙边,幅度读数也会偏低。减轻泄漏的手段有两种:一是增加采样时长,让频率分辨率更高,泄漏的相对范围变小;二是加平滑窗函数,牺牲一点频谱分辨率来换取旁瓣衰减。Hann 窗是默认选择,Hamming 窗旁瓣稍高但主瓣更窄,Blackman 窗旁瓣抑制更强但主瓣更宽,按需取舍。

4.5 别把 abs 和 magnitude 当成一个东西

最后一个坑有点微妙:编程语言里的abs和数学上的 "magnitude" 并不总是一回事。NumPy 中np.abs(复数)返回的是复数的模长,对实数数组则原样取绝对值,这跟 magnitude 概念基本吻合。但有两点必须注意。

第一,对一个复数X[k]取abs,你丢掉的是相位信息。除了幅度,信号的相位在分析里同样重要,滤波器的相位响应、时延测量都会用到np.angle(X[k])。如果全程只保留幅度,你就是在"半聋"地分析信号。

第二,在时域里做包络分析时,np.abs(x)只是把负半周翻到正半周,拿到的并不是包络。真正的瞬时包络需要通过 Hilbert 变换构造解析信号,再取模长:

analytic_signal = signal.hilbert(x) envelope = np.abs(analytic_signal)

这在调幅信号解调、轴承故障冲击提取里非常常用。记住这条,遇到"算出了幅度但形状不对"时,多半就是这个原因。

5. 常见问题与排查技巧实录

5.1 频率轴算错:峰值位置对不上理论值

症状:已知信号里有 440 Hz 正弦波,频谱图上峰值却出现在 882 或者 220 的位置。原因基本只有一个:频率轴构造有误。

最容易出错的写法是手动拼np.arange(N) / N * fs,然后在索引偏移、端点处理上报错。我推荐直接用np.fft.rfftfreq或np.fft.fftfreq,它们能把 bin 索引正确映射到物理频率。除了轴的正确性,还要检查是否用了rfftfreq却配了完整fft的结果,或者反过来。频率轴长度和频谱数组长度不一致时,画图不会报错,但横坐标会整体错位,这种错误特别隐蔽。

5.2 幅度轴对不上:计算没问题,单位凭白少了一半

症状:构造一个幅度 0.8 的正弦波,频谱图里 440 Hz 的峰值显示 0.4,怎么看都不对。这通常是单边谱没有乘 2,或者加窗后没有做幅度校正。纯正弦信号的能量平均分配到正负频率,rfft返回的只有正频部分,里面的幅度实际只有真实值的一半。

排查逻辑很简单:先在代码里固定一段纯正弦测试信号,幅度设为 1.0,频率选为分辨率整数倍。然后检查频谱峰值是不是 1.0。不是的话,按顺序排查四个环节:有没有除 N、有没有做单边谱翻倍、DC 和 Nyquist 点有没有被误乘、加窗后有没有做相干增益校正。这个测试用例可以在项目里长期保留,谁改了代码都能快速回归验证。

5.3 小信号被淹没:线性坐标是有极限的

症状:频谱图上能看到最强的峰值,但微弱信号完全看不出来,或者噪声底是条平平的直线,实际上下面藏着信息。多半是用了线性坐标。线性坐标下,幅度 0.01 和 0.0001 的差异在图上根本拉不开,而 dB 坐标可以清晰展示 -40 dB 和 -80 dB 的区别。

处理办法是频谱图默认用 dB 坐标显示。只想快速看谱峰位置时,可以用线性坐标,但是要提醒自己"看不到的不等于没有"。

5.4 常见问题速查表

症状可能原因解决思路
峰值幅度是理论值的一半没做单边谱乘 2正频率幅度乘 2,DC/Nyquist 除外
峰值幅度是理论值的 N 倍FFT 结果没有除以 N统一除以 N 再做单边谱处理
峰值位置偏高或偏低频率轴构造错误用 rfftfreq/fftfreq 生成频率轴
谱峰旁边一堆毛刺频谱泄漏加窗函数,或增加采样时长
0 Hz 处高到离谱直流偏移分析前减均值或 detrend
小信号在图上不可见线性坐标动态范围不够改用 dB 坐标
低频段全是假波形DC 漂移被当成低频信号高通滤波或去趋势处理
幅度偏小且波形变钝窗函数未做幅度校正除以窗函数的相干增益
整型信号结果巨大未转浮点归一化int16 除以 32768.0 后再分析

5.5 一套可复用的分析流程建议

每次拿到新数据,我的处理顺序基本固定:先看时域波形和统计指标,确认有没有削波、DC 偏移、异常脉冲;然后减均值、去趋势,必要时加窗;接着做 FFT 得到单边幅度谱,用 dB 坐标可视化;最后提取主要谱峰,写进报告脚本里。整个过程不复杂,但每一步都有它的目的,不要跳着走。

我现在处理任何信号,第一件事永远是问自己三个问题:单位是什么、归一化做了没有、该不该加窗。这三个问题想清楚,信号分析基本不会跑偏。magnitude 这个词看似基础,但它贯穿了时域统计、频域分析、滤波器设计、归一化处理几乎所有环节,值得花时间吃透。踩过的坑多了,你会发现这些坑百分之九十都集中在"常数因子"上——哪里该乘 2,哪里该除 N,哪里该除窗函数的相干增益。把这些常数整明白,你的幅度分析就真正站得住脚了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询