如何找到逻辑过滤器下的最大值?

问题描述 投票:0回答:1

背景: 我正在为一家测试音频质量的工厂编写一个脚本。我有一个软件可以返回 2K 不同频率的传递函数值。我在 Excel 中设置了一个 VBA 脚本来运行该软件并使用数据填充 Excel 电子表格。然而,然后我使用 Octave/MatLab 来分析数据并找到传递函数“滚降”的低频和高频。我不想调用 Octave/MatLab 来进行此计算,而是想学习如何在 VBA/Excel 中进行此计算;这将消除工厂安装其他软件的需要。


问题: 如何使用 Excel VBA 宏查看 2x2000 表并找到传递函数高于参考值(1 [KHz] - 3 [dB])的低频和高频

考虑到我在 Octave/MatLab 中制作的函数,如何在 Excel/VBA 中执行以下操作:

  1. 在第一列中找到最接近 1000 的索引/值(实际值可能是 999.98,但不能保证)(称之为 freqRef)
  2. 将单元格的相邻值存储在下一列中(称为 tfRef)
  3. 查看 freqRef 上方的所有行,以了解第二列中低于“thRef - 3”的值(即查找逻辑条件“Freq < 1000 & TF < tfRef - 3")
  4. 的“Max Freq”)
  5. 查看 freqRef 下面的所有行,以了解第二列中低于“thRef - 3”的值(即查找逻辑条件“Freq > 1000 & TF < tfRef - 3")
  6. 的“Min Freq””

历史记录:这是我在 Octave/MatLab 中编写的代码。它利用逻辑索引滤波器(逻辑数组),使得 FREQLOG 是满足条件

TF(f) - TF@1[KHz] + 3 < 0
的所有频率(传递函数低于参考阈值的所有频率)。我一直在尝试用 VBA 编写此代码,但我不知道如何在保持索引抽象的情况下执行此操作。

[~, IDX] = min( abs( FREQ - 1000 ) );
FREQLOG = FREQ(TF - TF(IDX) + 3 < 0);
FREQLO = max(FREQLOG(FREQLOG < 1000))
FREQHI = min(FREQLOG(FREQLOG > 1000))
excel vba matlab indexing octave
1个回答
0
投票

如果您将其逐步转换为 Excel 数组公式,您最终会得到如下结果:

=LET(freq,A2:A11,
Tf,B2:B11,
idx,XMATCH(MIN(ABS(freq-1000)),ABS(freq-1000)),
freqlog,FILTER(freq,Tf<INDEX(Tf,idx)-3),
MAX(FILTER(freqlog,freqlog<INDEX(freq,idx))))

=LET(freq,A2:A11,
Tf,B2:B11,
idx,XMATCH(MIN(ABS(freq-1000)),ABS(freq-1000)),
freqlog,FILTER(freq,Tf<INDEX(Tf,idx)-3),
MIN(FILTER(freqlog,freqlog>INDEX(freq,idx))))

但这确实让我想起了一个乡巴佬给一位在乡村迷路的绅士的建议:

If I were you, sir, I wouldn't start from here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.