【问题标题】:Pitch interpolation using numpy使用 numpy 进行音高插值
【发布时间】:2020-01-30 00:35:13
【问题描述】:

我有一个 numpy 数组,其中包含 88200 个元素,表示以 44.1 kHz 的采样率采样的 2 秒音频样本。假设样本的音高为 130.8 Hz。我可以插入音频数据并将其拉伸成一个 4 秒的样本,这将使音高减半或将其压缩成一个 1 秒的样本,这将使音高加倍。

我想实现音高滑动(滑音)。也就是说,某种插值使音高从 130.8 Hz 开始,并在采样结束时平滑地滑到 261.6 Hz。

如何使用 Python 和 numpy 做到这一点?我想我应该可以使用 linspaceinterp 函数来完成这个任务,但我无法让它正常工作。

【问题讨论】:

  • 要滑动音高,插值将在数组中的变化点处。您可能最好编写自己的函数,这样您就可以轻松地交换线性、样条和拉格朗日插值。如果您的音频buffer 正在放慢速度,并且您要求索引00.511.4,则0.5 和@987654329 没有直线插值@indexes,您需要逐案处理。
  • 你可以使用非 numpy 库吗?不是说不能坚持使用 numpy,但做好这件事并非易事。
  • 我实际上使用 numpy 解决了我的问题!我会尽快写一个答案。如果您或其他任何人可以改进它,我希望看到它!

标签: python numpy audio linear-interpolation


【解决方案1】:

这是我最终使用的 numpy 代码:

def slide_sample(arr, v1):
    x_old = np.linspace(0, arr.size, arr.size)
    v0 = 1
    ratio = 2 / (v0 + v1)
    vels = np.linspace(v0, v1, int(arr.size * ratio))
    x_new = np.append([0], np.cumsum(vels))
    return np.interp(x_new, x_old, arr)

arr 是要滑动的样本数组,v1 是要滑动到的相对间距。所以slide_sample(arr, 2) 会滑到两倍音高,slide_sample(arr, 0.5) 会滑到一半音高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2021-01-21
    • 2020-11-17
    相关资源
    最近更新 更多