You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于DFT波中心频率计算及频带能量求解的技术问询

关于DFT计算波中心频率与频带能量的解答

先提个小细节:你文中写的「随后对数据执行DWT」应该是DFT(离散傅里叶变换)吧?毕竟后面的频带划分逻辑完全是DFT的路子,我先默认是笔误啦~

核心疑问:频带能量怎么算?

你写的 E[i] = sqrt(realPart[i] * realPart[i] + imaginaryPart[i] * imaginaryPart[i]) 其实算的是DFT频点的幅值(Magnitude)——也就是这个频点的信号强度绝对值。如果要算能量,需要基于幅值做进一步处理,常见的两种方式:

  • 直接对幅值平方:能量[i] = 幅值[i] * 幅值[i]
    这是因为DFT满足Parseval定理:时域信号的总能量等于频域所有频点(包括直流、正负频率)的能量之和,而每个频点的能量就是其幅值的平方。
  • 如果用的是归一化后的DFT实现(比如有些FFT库会在计算后除以样本数N),那能量计算要对应调整,比如 能量[i] = (幅值[i] * 幅值[i]) / N;如果只算正频率部分(你已经舍弃了负频率),也可以用 (幅值[i] * 幅值[i]) / (2*N),因为负频率是正频率的共轭,能量是对称的。

你的频率计算逻辑验证

你的公式 freq = (K + 1) * fps / N 是对的,这里帮你再理清楚对应关系:

  • 原始DFT的bin索引k(0到511)对应的频率是 freq = k * fps / N,其中N=512,fps=512Hz:
    • Bin0是0Hz(直流)
    • Bin1对应1Hz,Bin100对应100Hz,正好是你要生成的信号频率
  • 你舍弃了Bin0,把正频带(Bin1到Bin255)重新索引为0到254,所以新索引K对应的原bin是K+1,代入公式就得到正确的频率,这部分逻辑没问题。

补充:你生成正弦波的代码小bug

看你生成数据的代码:

var data : [Double] = []
for i in 0...511 {
 let t = Double(i) * 100/256
 let f = 10 * sin(2 * Double.pi * t)
 data.append(f)
}

这里的时间t计算不太对,采样率是512样本/秒,所以每个样本的时间间隔是1/512秒,正确的时间应该是 t = Double(i) / 512,然后100Hz的正弦波应该写成 sin(2 * Double.pi * 100 * t),这样生成的才是标准的100Hz信号。你当前的写法相当于把角频率搞错了,生成的不是100Hz的波,这点要修正哦~

内容的提问来源于stack exchange,提问作者Duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:44:42