背景: 我正在为一家测试音频质量的工厂编写一个脚本。我有一个软件可以返回 2K 不同频率的传递函数值。我在 Excel 中设置了一个 VBA 脚本来运行该软件并使用数据填充 Excel 电子表格。然而,然后我使用 Octave/MatLab 来分析数据并找到传递函数“滚降”的低频和高频。我不想调用 Octave/MatLab 来进行此计算,而是想学习如何在 VBA/Excel 中进行此计算;这将消除工厂安装其他软件的需要。
问题: 如何使用 Excel VBA 宏查看 2x2000 表并找到传递函数高于参考值(1 [KHz] - 3 [dB])的低频和高频。
考虑到我在 Octave/MatLab 中制作的函数,如何在 Excel/VBA 中执行以下操作:
历史记录:这是我在 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 数组公式,您最终会得到如下结果:
=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