估计低频(包括幅度和相位)

信息处理 fft 频率
2022-01-23 14:30:09

在过去的一个月里,我一直在追逐 DFT/FFT 兔子。一路上,我一直在粘贴其他兔子的名字以供以后追逐:自相关,相位声码器,抛物线近似,小波变换

这是我的问题。使用 FFT 时,总是会丢失较低的频率。我实际上发现了这里描述的相同问题: FFT/IFFT 问题

坦率地说,情况比这更糟。这些频率的能量根本没有丢失。它们被溶解到前几个 bin 中,使这些 bin 对插值半无用。

现在,我只想要低频的一般近似值,包括幅度和相位。在 FFT 术语中,我想要 bin #0.05、0.10、0.15、0.20、0.25 ......最多可以说 bin 3.50 左右。实际上,我知道任何很小的东西,比如 0.05,几乎都相当于线性回归。但在我看来,0.5 或 0.75 应该是可行的。

我什至玩弄了将 k 更改为双倍(“咳嗽”“有趣”): 关闭频率分量的最佳窗口

当摩西从山上下来时,他没有携带石板,上面命令在公式中:F = k*(df) = k*sample_rate/N,k 必须是整数。

不管怎样,我已经决定是时候尝试别的了。那么,接下来我应该追什么兔子呢?(即使是近似值)

PS:推荐更大的样本不是答案 - 我已经在抽样我的可用限制。


编辑添加图片(希望有一个可能的新答案):

测试用例(我想要一个蓝色的近似值,即使很糟糕):

矩形(当然,糟糕的绿色和一般的红色):

Gaussian 3.0(只有红色可以插值,但还不错):

较小的高斯给出了糟糕的绿色插值和不错的红色。


编辑回答一般问题(对不起,我一开始没有这样做):

图中数据的数学描述是什么?我猜正弦曲线的总和(有噪音)。

采样率是多少?我所有的样本都采用不同的速率,例如,使用了每个完整的文件大小。测量值不是赫兹/周期/周期,而是反序列化数据单元。大多数情况下,我使用 8 字节双精度,但有时使用 4 字节整数。因此,对于双打,你可以说我的 Fs = fileBytes/8

您可以捕获多少个样本?每个文件一个。

应用程序是什么?我不知道——这是给客户的。

3个回答

更新/修订:听起来你需要一些非常强大的东西,超越相关器/被动技术。听起来您需要一个自适应滤波器。有用于频谱估计的各种类型的自适应滤波技术,但它们通常非常依赖于所述技术的应用和输入类型。您能否详细说明数据是如何收集的、您怀疑数据中的内容以及您希望完成的具体内容?

如果存在一个好的解决方案,我认为它将需要某种类型的自适应滤波器,因为(我认为)您要求的东西超出了传统相关/滤波器/FFT 技术的典型范围。

几个通常有用但可能不起作用的简单选项:1)第一个选项适用于在“区间”之间插入单个 DFT/FFT 峰值,但它依赖于只有一个真正的峰值和关心的是找到那个峰的位置。

2)如果您想以任意频率计算 DFT 箱(即“箱 1.65”),请阅读 Goertzel 算法,因为这将允许您这样做。或零填充,然后 FFT。但是,这应该具有相同的基本效果,但您仍然无法在 1.65 和 1.70 之间解析 - 它们只是同一平缓曲线上的两个点,而不是两个不同的峰值。

在 FFT 给出的频率表示中,没有频率丢失,也没有频率分箱。

FFT 将离散信号分解为特定频率和相位的正弦波之和。这种表示是精确的,并且具有与原始信号相同的能量。不会丢失任何信息,因为您可以进行逆 FFT 并准确地恢复原始信号。分箱来自信号的离散化,而不是 FFT。

同样对于有限长度的信号,没有频率低于周期等于信号长度的频率。这是来自频谱的数学定义。更简单地说,DFT/FFT“假设”信号是重复的。信号的零填充因此增加了周期并且因此降低了第一频率。

如果由于某些先验知识而存在较低的频率,例如,如果我们在其周期的一半内对正弦波进行采样,则必须包含此信息。

一种解决方案可能是滚动您自己的频谱并以比信号更长的周期来缩放频率分量。假设低频分量继续存在。

例如,让fS是您感兴趣的频率,期间 =1/fs>1比归一化为 1 的信号周期长。

现在,您将信号与该频率的正弦波和余弦波进行卷积。没有零填充。

fe=tNf[t]×cos[2πfst]
fo=tNf[t]×sin[2πfst]

然后乘以1/fs为了说明样本外的信号继续这样的假设,并乘以 1/N 以说明样本数。

fe=fe×1/fs×1/N
fo=fo×1/fs×1/N

然后以通常的方式给出幅度和相位。

这可以在您想要的任何频率刻度上完成。

编辑:关于第一条评论的更改。

编辑2:答案充满错误。更新。

编辑 3:为 N 添加因式分解

- 如果我有这个错误,欢迎编辑。

如果您只想要低频,您可以先抽取(下采样)您的输入,然后运行相同的 FFT。假设您有一个 8kHz FS 的输入信号,但您只对 100Hz 及以下感兴趣。使用 512 点 FFT,您只能在 8kHz FS 下每个 bin 获得 15.625Hz。

现在,您可以抽取(下采样)8kHz 到 200Hz FS,然后运行 ​​SAME FFT。你基本上扔掉 /LPF 一切> = 100Hz。现在,每个 bin 包含 200Hz / 512 或 0.390625Hz 每个 bin。

您实际上是在运行更长的 FFT。但是,对于下采样有额外的处理,但 FFT 不需要额外的内存,这可能是你遇到“最大长度”墙的地方,对吧?

编辑:找到相关答案的链接: 音频的下采样低通滤波器:FIR 或 IIR?