gpt4 book ai didi

在 C 中不使用 float 或 uint64 类型计算振荡器频率

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:05 26 4
gpt4 key购买 nike

我有一个 32.768 kHz 振荡器,可产生 1 Hz 脉冲。我正在用一个 40MHz 的时钟测量这个脉冲。我试图通过将预期结果与获得的结果进行比较来测量振荡器的实际频率。

  • 我无法更改我正在测量的周期,它必须是 1-Hz (1s)。
  • 我不能使用 float、double 或大于 uint32 的类型。
  • 我还需要整数部分后的第一个数字(例如 32768.1 Hz)。

如果没有约束,解决方案将是这样的:

computedFreq = (uint32) ( (float32)32768u /  ( ( (float32)measuredPeriod / (float32)40,000,000 ) / (float32)10u ) );

computedFreq = ( 32768*10*40,000,000 ) / measuredPeriod;

因此对于 40,008,312 的测量周期,结果将为 327611。

如何在满足约束的同时实现这一点?

最佳答案

您的问题是测量范围高达 40010000 Hz,而您只对 20000 Hz 范围感兴趣。所以解决办法就是限制范围。

您可以使用 2 个点进行线性插值。

  1. 选择 2 个输入值。最小/最大点可能会:

    inMin = 40,000,000 - 10,000
    inMax = 40,000,000 + 10,000
  2. 使用您的公式预先计算相应的输出值(此处的值是粗略值,您可以自己计算):您可以将这些作为常量存储在代码中。

    outMin = ( 32768*10*40,000,000 ) / inMin = 327761 
    outMax = ( 32768*10*40,000,000 ) / inMax = 327598

    请注意,由于公式的性质,最大值小于最小值。这在选择以下类型时很重要。

  3. 使用线性插值来计算使用前面两个点的结果:

    out = (in - inMin) * (outMax - outMin) / (inMax - inMin) + outMin

    你必须为此使用有符号整数,因为 (outMax - outMin) 是负数。

    乘法的上限是(inMax - inMin) * (outMax - outMin),应该适合int32。

您可以选择任意 2 个点,但您应该选择不会产生太大值以致于乘法溢出的点。此外,如果点彼此太近,答案可能不太准确。

如果您有多余的精度,可以在 outMin/outMax 上使用大于 10 的乘数,然后四舍五入以保持更高的精度。

关于在 C 中不使用 float 或 uint64 类型计算振荡器频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39911553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com