如何采样和处理的最佳方法

信息处理 采样
2022-02-10 16:13:42

我正在寻找一些建议,我希望众多论坛专家中的一位可以帮助我就信号的采样和处理提供一些建议。我正在使用带有 12 位 ADC 和 DSP 内核的 STM32F4 处理器。目前,我可以使用 CMSIS DSP 或 Siglib 库。以下是问题空间的一点描述:

我可以以任何需要的速率进行采样:ADC 前面是一个 10 阶模拟放大器和 LPF,Fc = 55Hz。放大器可设置为提供理想的 3Vpp ADC 范围

正弦输入信号在 10Hz 到 40Hz 的范围内,可以设置为任何持续时间。理想情况下,在 200ms 到 300ms 的范围内(可以更改)

在这些音调之间,有(理想情况下)50ms 到 100ms 的死区(可以更改)

会有一系列这样的音调,总时间约为 4 秒,或者可能 5 秒(可以在最后一个信号到达后处理,理想情况下是实时的)

我需要尽可能好的幅度和频率精度,理想情况下约为 2dB 和 0.5Hz。环境嘈杂,但输入信号可以保持 20dB 以上的噪声。

我不是在寻找代码讲义。只是一种最佳方法算法,理想情况下还有一些细节,例如采样率(需要抽取)、缓冲区大小、使用重叠添加/滑动窗口、信号处理链 - 需要 FIR(多少抽头)、FFT 方法/大小?

对你们中的许多人来说,这可能并不复杂,但我还没有完成所有理论,我需要花很长时间来尝试一个实现,(我有所有的书,但还有很多阅读!)问题需要我现在尝试解决方案。

感谢您的帮助!罗杰

2个回答

据我了解,您希望使用 STM32F4 ARM+DSP 芯片的 12 位 ADC 在 20dB SNR 和 10Hz-40Hz 范围内以最佳幅度和频率精度对噪声信号进行采样。

为了获得最高的频率精度,您需要缓冲更多的样本,并且对于给定的采样率 Fs,需要更大的 FFt 大小。这适用于给定范围内的频率。

使用高采样率(过采样)可能有利于提高 SNRQ。有关详细信息,请参阅 Sigma-Delta 转换器和噪声整形器。

FIR 滤波器的大小:同样,它是计算能力和处理质量之间的直接折衷。STM32F4 是非常强大的芯片,工作频率为 168 Mhz,FPU 为 32 位。

对于 FFT,如果有时间,您可以编写自己的代码。我可以为您提供一个蝴蝶实现。或者你最好从一些免费的图书馆中使用它。

您应该选择长 fft 尺寸以获得更好的频率分辨率。

请查看此文档:http: //support.ircam.fr/docs/AudioSculpt/3.0/co/Window%20Size.html

我不知道您问题的所有细节,例如信号稳定性、定时精度等,所以我会假设一些事情并建议使用基于 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 大小的幂,则您必须牢记该限制来处理数字。