VST 音频输入值与 Matlab 中的完全不同

Posted

技术标签:

【中文标题】VST 音频输入值与 Matlab 中的完全不同【英文标题】:VST audio input values completely different to those in Matlab 【发布时间】:2016-06-28 22:28:59 【问题描述】:

抱歉,如果这听起来像一个愚蠢的问题,我对 VST 开发还比较陌生。我正在尝试使用 JUCE 框架构建一个插件,我目前正在尝试使用正弦波 .wav 文件对其进行测试。当我在 Audacity 中打开 .wav 文件时,它告诉我它是 44100Hz 并且是 32 位浮点数。当我将同一个文件加载到 matlab 中时,前三个样本类似于 0.00、0.0443、0.0884 ......但是,当我将同一个文件放入 Ableton 和 Reaper 并尝试单步执行代码时,我发现前三个样本同一个文件是 0.00000000、0.00012068315、0.00048156900... 当我在 VS 中进入内存并以 32 位浮点视图查看它时,我看到了这一点。为什么我的样本值要小得多?

我的问题是我需要音频具有与 Matlab 中相同的样本值,我的算法才能工作。显然,发生了我无法控制的转换。任何人都可以阐明这个问题以及我应该如何解决它。看起来可能是一个缩放问题。 Ableton 正在 32 位模式下运行,而我的 VST 正在编译为 32 位。

如果有帮助,我还可以提供更多示例。

谢谢

【问题讨论】:

查看 Ableton 文档。据我了解,Ableton 不是免费的。我对死神一无所知。但也许你可以凑合着用 Audacity? 我认为我在 Reaper 和 Ableton 中获得相同值的原因意味着它可能是 VST SDK 或 JUCE 框架。但是,我还没有尝试过 Audacity。好主意。 【参考方案1】:

问题是因为 Ableton 和 Reaper 将 32 位音频转换为 16 位音频。我可以通过将 sine.wav 加载到 Ableton 并以 16 位导出它来检查这一点。然后我将文件加载到 Matlab 中,并得到了上面的较小样本。我的下一个问题是想办法在 VST 中将 16 位音频转换为 32 位音频。

【讨论】:

当 JUCE AudioProcessor 派生对象中的数据缓冲区出现在​​您面前时,音频图已经将其转换为范围内的 32 位浮点数或 64 位双精度数据(-1.0, 1.0) -- 参见 AudioProcessor 的 processBlock() 成员函数。【参考方案2】:

您似乎描述的是一个非常低的幅度,因此您将有很少的值(您可以将样本值转换为 dB 以验证这一点)。通常,音频信号的范围在 -1 和 +1 之间,其中极值表示数字世界中可能的最大音量(又名 0dB)。

我认为16位和32位之间的困境与您的问题无关。

【讨论】:

我正在做的是将通常读取音频文件的传统 C 代码转换为 32 位无符号长整数,然后将其转换为常规浮点值。当我将在遗留代码中获得的浮点值与在 C++ 中获得的浮点值进行比较时,它们完全相同,但当我使用 Ableton 和 Reaper 时则不同,所以我认为这就是问题所在。

以上是关于VST 音频输入值与 Matlab 中的完全不同的主要内容,如果未能解决你的问题,请参考以下文章

VST 前瞻和 setInitialDelay()

VST 音频插件如何检测来自 VST 主机的流中断?

使用 VST 插件失真的音频

从 JUCE 音频 VST 插件控制主机播放

将 VST 音频效果/插件应用于音频文件

Matlab 音频处理求教