使用线性插值

时间:2015-10-13 06:56:09

标签: c# search dictionary interpolation

我正在使用.NET 4.5 / C#6.0开发应用程序,它从硬件设备获取测量数据,该设备也由我的应用程序配置。例如。我使用以下内容配置设备:

  • 开始频率:10 kHz
  • 停止频率:20 kHz
  • 测量点:11

并且在我的原始数据的处理管道的末尾,我得到如下的字典,其中密钥是频率和值,例如,以dB为单位的幅度:

  

key =>值
  10k => -3
  11k => -3
  12k => -3
  13k => -3.5
  14k => -4
  15k => -5
  16k => -6
  17k => -7
  18k => -8
  19k => -10
  20k => -12

这个字典会“在运行中”更新,因为设备会循环扫描这11个点 这些值一次显示在图表中,这没有问题,因为我只是在新点就绪时更新图表数据(我得到每个新点的事件),但我也有一个数据网格,用户可以显示手动输入点的值([值]表示手动输入),例如:

        | A: f       | B: mag(db)  
Point 1 | [11 kHz]   | -3 dB
Point 2 | [16.5 kHz] | -6.5 dB
Point 3 | 18.5 kHz   | [-9.5 dB] 

Point 1很容易,因为它恰好击中一个测量点,但对于例如Point 2用户在A列中手动输入16.5 kHz,这意味着我需要为其旁边的两个测量点插入B列的值。
大约相同,但Point 3的另一种方式:用户在B列中手动输入-9.5 dB,因此我需要找到插值频率,此值将是插值结果。

注意 - 以下约束适用于Point 3

  • 如果该值可能是两次或更多次,则使用第一个,例如,对于-3 dB,它应该返回10 kHz
  • 输入值的频率仅搜索一次,然后其行为与Point 2
  • 相同
  • 如果找不到给定的值,则返回最接近的值(对Point 2也有效),例如值> -3 dB返回10 kHz和值< -12 dB返回20 kHz

是否有一些快速/优化的方式来获取Point 2Point 3的这些值?

我只能想到每次手动输入值时迭代所有点,然后在每两个点之间进行插值,直到找到给定值。然后在更新其中一个相邻频率时更新B列 注意:该设备每秒可提供高达数百个点。

0 个答案:

没有答案