Algorithm 更改声音文件的速度

Algorithm 更改声音文件的速度,algorithm,audio,multimedia,Algorithm,Audio,Multimedia,我想改变声音文件的速度,但不知如何实现。我假设在减速的情况下必须进行某种类型的插值,但我不确定如何实现加速-可能是几个样本的平均值?无论它改变了节奏还是音高,现在都不重要,我想学习如何做到这两个,但我想至少在开始时做到其中一个 如果有人对这些类型操作背后的数学有任何参考,他们将不胜感激 谢谢, Ben有两个选项可以加快声音文件的播放速度: 提高采样率 减少每单位时间的样本数 在这两种方法中,播放速度的提高将使声音的音调发生相应的变化 增加采样率 增加采样率将提高声音的播放速度。例如,从22

我想改变声音文件的速度,但不知如何实现。我假设在减速的情况下必须进行某种类型的插值,但我不确定如何实现加速-可能是几个样本的平均值?无论它改变了节奏还是音高,现在都不重要,我想学习如何做到这两个,但我想至少在开始时做到其中一个

如果有人对这些类型操作背后的数学有任何参考,他们将不胜感激

谢谢,
Ben

有两个选项可以加快声音文件的播放速度:

  • 提高采样率
  • 减少每单位时间的样本数
在这两种方法中,播放速度的提高将使声音的音调发生相应的变化

增加采样率

增加采样率将提高声音的播放速度。例如,从22 KHz采样率到44 KHz将使播放声音的速度比原始声音快一倍。在这种方法中,原始采样数据是不变的——只需要更改音频播放设置

减少每单位时间的样本数量

在这种方法中,回放采样率保持不变,但样本数量减少——一些样本被丢弃

使声音的播放速度为原始速度的两倍的简单方法是删除每一个其他采样,并以原始播放采样率播放

然而,使用这种方法,一些信息将丢失,我预计一些工件将被引入音频,因此这不是最理想的方法

虽然我自己还没有尝试过,但对样本进行平均以创建新样本的想法是一个很好的开始。这似乎意味着,不只是扔掉音频信息,而是可以通过平均化过程在一定程度上“保留”音频信息

大致来说,这里有一段伪代码可以将播放速度提高一倍:

original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5]

def faster(samples):
    new_samples = []
    for i = 0 to samples.length:
        if i is even:
            new_samples.add(0.5 * (samples[i] + samples[i+1]))
    return new_samples

faster_samples = faster(original_samples)

我还发布了一个关于“a问题”的答案,其中我详细介绍了一些可以执行的基本音频操作,因此这可能也很有趣。

维基百科上有一个很好的解释。基本上,您将信号转换为两个采样率的最小公倍数,过滤掉不符合目标采样率的任何频率(或不来自源),并在目标采样器处拾取新样本。有一些数学技巧可以使计算占用的资源大大减少(多相分解),但这应该让你开始了。

这是一个听起来很有趣的问题:)是的-我几乎把它理解为“改变音速”你想改变速度(同时改变音高)还是节奏(保持音高不变)?或者/或者只是想开始修改声音文件……我能想到的平均值的唯一优点是可以最大限度地减少偏差。例如,如果您有这样的数据:[1,-1,1,-1,1,-1],它具有零偏差,您可以看到平均值将保持零偏差,但丢弃样本则不会。你对信号所做的任何事情都会引入某种伪影,如果你选择了一本好的DSP教科书,你就会看到这种伪影。@Nosredna:这是一个很好的例子来说明关于偏差的观点。谢谢你指出这一点。