我不知道您问题的所有细节,例如信号稳定性、定时精度等,所以我会假设一些事情并建议使用基于 FFT 的高斯比技术。
自 1991 年以来,该技术虽然并不广为人知。基本上,它依赖于在输入数据上使用高斯窗口,然后进行 FFT,然后根据 FFT 的自然对数值计算频率和幅度。CERN 使用了一种相关技术,他们已经对其进行了广泛的分析。
根据高达 40 Hz 的信号,您的最小采样率为 80 Hz。但是由于你的 Fc 是 55 Hz,如果你有 40 到 55 Hz 之间的任何频率,它就会混叠,所以你的最小采样率必须至少为 110 Hz。您的其他要求可能会迫使您接受更高的费率。
但是还有其他与采样率无关的问题。首先,您有 10 到 40 Hz 的正弦信号,存在 200-300 毫秒(0.2-.3 秒)。对于 10 Hz 输入,计算结果仅为 2 到 3 个周期(而 40 Hz 输入为 8-12 个周期)。请记住,更高的采样率不会增加信号的长度或周期数。
其次,由于信号之间有 50-100 毫秒的死区时间,因此您必须将处理与输入同步。您可能想要某种“信号存在”或“不存在”检测器 鉴于您的 10 Hz 输入与 40 Hz 输入的上升/下降时间不同,这样的检测器对您来说可能过于复杂。因此,为了简单起见,让我们假设您的信号和死区时间相对于它们的时间是稳定的,并且您可以以某种方式确定事情何时开始和停止。
所以让我们假设 300 毫秒的信号和 100 毫秒的死区时间,总共 400 毫秒(0.4 秒)。由于您将对输入进行窗口化,因此最好有 50 毫秒的死区时间,然后是 300 毫秒的信号,然后是 50 毫秒的死区时间。Windows 倾向于不强调信号的开始和结束,因此上述内容是可取的。也许您需要一个 50 毫秒的死区时间检测器。一旦您确定已接收到正好 50 毫秒的死区时间,您就会开始接收另外 50 毫秒的死区时间,然后是 300 毫秒的信号,然后是另一个 50 毫秒的死区时间(总共 400 毫秒)。你可能认为这很简单——我可以向你保证,事实并非如此。同步事物可能会出现一些非常棘手的编码问题,特别是如果您使用中断来获取 A/D 样本,
收集到一个数据块后,您将应用高斯窗口并计算频率和幅度。然后你会等待下一个块。如果您在 FFT 中包含死区时间,您可能需要稍微调整频率和幅度估计(如果您可以精确同步并仅挑选信号,则无需调整)。
至于采样率,您可能应该计划使用最低 110 Hz 的 2 到 4(或更多)倍。所以可能是 200 到 400 个样本/秒。将是适当的。更多样本/秒将帮助您更好地平均噪声。但它在处理能力方面的成本更高。
您的 FFT 和缓冲区大小将直接取决于您选择的采样率。因此,如果您选择 400 个样本/秒,则 300 毫秒信号加上 100 毫秒死区时间将需要:400 个样本/秒 x 0.4 秒 = 160 个样本。如果您的代码库不能容纳非 2 FFT 大小的幂,则您必须牢记该限制来处理数字。