我有一个数字采样信号(采样频率 = 4000 Hz),其中包含 0 到 1000 Hz 的模拟频率。我希望频率分辨率为 100 Hz(如 0,100,200,300 Hz .. 1000 Hz),我必须将 0 到 100 Hz 范围内的频率分辨率提高 10 Hz。那是在频率 0,10,20,30,... 100。所以我希望检测的频率分量是 [0,10,20,...,100,200,300,...,1000]。换句话说,我希望在 0-100Hz 范围内获得更高的频率分辨率,而在 100-1000Hz 范围内获得更低的分辨率。这是如何通过 FFT 或相关方法实现的。
选择性地提高 FFT (DFT) 的频率分辨率
您可以使用复杂的 Goertzel 算法或滤波器计算任何单个 FFT 结果箱。
但是要意识到,如果您想计算数量级为 log N 或更大的 bin 数量(例如 10 个额外的 bin,带宽和间距为 10 Hz),则执行完整更长的 FFT 并丢弃所有额外的 bin 可能会更快FFT 结果箱。
所以只需计算 2 个不同长度的 FFT 并忽略所有不需要的结果。
我在这里没有看到这个答案,所以我会发布它。您可以在执行 FFT 之前将信号重新采样到较低的采样率,从而减小 FFT 的大小。
如果您知道您感兴趣的唯一频率是 0..1000Hz,您可以安全地将原始信号重新采样到 2000Hz 的 FS,然后进行 FFT。对于较高频率,这将所需的 FFT 降低了 2 倍。
对于 10Hz 分割,将原始信号再次重新采样到 200Hz 的 FS,并对结果进行相同的 FFT 以获得 0..100Hz 的结果。
重新采样信号首先通过将 FFT 限制为您感兴趣的频率来增加相同大小 FFT 的频率分辨率。它有效地增加了 FFT 在较低频率上的长度,同时丢弃了较高频率。
在您的情况下:输入信号 4000Hz。重新采样到 2000Hz 并使用大小为 64 的 FFT 可得到 2000/64 或 31.25Hz 的分辨率。重新采样到 200Hz 并使用大小为 64 的 FFT 可得到 200/64 或 3.125Hz 的分辨率。
我知道现在回答发布问题的原始人有点晚了,但以防万一有人发现这个并想要一个聪明的解决方案的想法...... FFT算法是利用分而治之的方法构建的,所以也许可以调整它可以更准确地计算某些部分,而其他部分则更少……在 FFT 期间,频谱从 2^x 单点频域到单个 2^x 点频域分阶段组合。在算法过程中,我认为有一种方法可以将一些 bin 组合在一起,从而在一端获得比另一端更低的分辨率。由于每个阶段结果的“蝴蝶”结构,一个人可以达到的效果有一些限制我认为理论上,一个人可能能够让它以指数方式产生箱,例如 [1hz, 2hz , 4hz, 8hz, 16hz 等... ] 只需在每个阶段 s 将最后 (s-1) 个 bin 组合在一起!我自己还没有尝试过这个,但它看起来很简单,只要你能够访问和理解你的特定 FFT 的核心代码!
将其视为 FFT 每个阶段频域的 bin 带宽乘数表,您将有:
[1] * 2^x;
[1, 1] * 2^(x-1);
[1, 1, 1, 1] -> [1, 1, 2] * 2^(x-2);
[1, 1, 2, 1, 1, 2] -> [1, 1, 2, 4] * 2^(x-3);
[1, 1, 2, 4, 1, 1, 2, 4] -> [1, 1, 2, 4, 8] * 2^(x-4);
etc... until (x-s) = 0.
对不起,这很难理解!每个 [] 是一个频域。[] 内的数字对应于 bin,并显示每个 bin 所代表的带宽的相对大小。例如,如果 1 表示 10hz,则 2 表示 20hz。-> 是一个箭头符号,表示这些域在组合箱时的变换,* 2^z 表示在特定阶段有 2^z 个这些频域。x 是总阶段数减 1,s 是从 s = 0 开始计数的当前阶段,即第一阶段。(第一阶段通常由 FFT 中的位反转排序时域表示,然后某种主处理循环接管并将其转换为后续阶段,但这取决于您的算法的确切版本及其设计)
这值得么?好吧,因为每个 bin 的频率是最后一个 bin 的两倍,所以这样一组 bin 只能完美匹配单个音高的所有八度音阶,所以我猜它可能非常没用,除非你有一些非常特殊的要求可以代替它非常有用...计算起来会快得多吗?在每个阶段,您将计算比上次多 2^(xs) 个 bin,而不是每次多 2^x 个 bin,所以我认为是的,对于大型 FFT,它应该更快,因为它的扩展性要好得多。
真正的问题是,这种方法能否适应原始问题提出的那种现实世界问题?有多种方法可以生成各种其他复杂模式的 bin,其中任何一种都可能更合适,但是其中一些方法并不比计算完整的高分辨率 FFT 并随后组合 bin 更有效。此外,设计一种算法来创建具有任何逻辑意义的带宽模式并不是那么容易,尽管我无法证明这是一项不可能完成的任务。
当然还有其他更简单的可能性,它们可能具有非常有趣的特定用途……通过在每个阶段将第一个 (s-1) 箱组合在一起,可以设法获得类似 [16hz, 24hz, 28hz, 30hz, 31hz] 的东西。或者类似于 [1hz, 2hz, 4hz, 8hz, 12hz, 14hz, 15hz, 16hz] 的模式,通过在每个合适的阶段将一些 bin 组合在一起围绕中间。
FFT 的频率分辨率为 Fs/N,其中 N 是 FFT 大小。FFT 为您提供所有频率的统一分辨率。因此,您需要 N >= 400 个点才能获得 10 Hz 分辨率。