DJ 效果算法的声音拉伸

Posted

技术标签:

【中文标题】DJ 效果算法的声音拉伸【英文标题】:Sound stretching for DJ like effect algorithm 【发布时间】:2015-08-26 02:22:19 【问题描述】:

我正在做一个项目,包括使用 SoundTouch 和 C# 进行声音拉伸。

作为停止音乐播放时的效果,我想实现一个拉伸算法,比如当 DJ 关闭 Vinyl 但 Vinyl 停止旋转需要几秒钟的时间,同时音乐仍在播放并且声音拉伸降低节奏直到归零。

我的问题是我真的不知道我应该从哪里开始。我曾想过使用某种迭代来轻松降低音乐样本块的节奏,但这对我来说似乎有点复杂,而且我在弄清楚算法时遇到了问题。

非常感谢任何类型的建议、起点、示例或帮助。

谢谢。

【问题讨论】:

唱片放慢的效果不需要时间拉伸,因为您不希望速度和音高独立改变。您只需要通过重新采样音频来减慢播放速度;您可以使用线性插值,或者使用数学上更精确的方法来提高音频质量 这很有趣,请@m69 能更具体一点吗?我刚刚在 soundtouch 类中看到了线性插值的名称,但我真的不知道它的作用! 我对DSP编码不太了解,我只是用了很多音频软件:-) 但基本上,你想逐渐改变输入/输出样本的比例;为此,您需要计算输入样本点之间的值;最简单的方法是线性的:如果回放采样点在输入采样点 a 和 b 之间的三分之二,则使用在 a 和 b 的值之间的三分之二的采样值。 这是一个很好的起点,谢谢。我将尝试根据您的解释使其正常工作,并让您知道它是否有效。 :) 谢谢@m69 效果很好@m69 请考虑将您的评论作为问题的答案,以便我将其标记为答案。 :) 【参考方案1】:

唱机放慢速度的效果不需要时间拉伸,因为您不会单独改变速度和音高。您只需要通过重新采样音频来降低播放速度。

在下图中,绿点代表输入音频样本,网格是输出样本时钟,橙色点是生成的输出音频样本。

为了生成输出音频样本,您需要在输入样本值之间进行插值。在图中我使用了线性插值,这是最简单的方法。为了提高音频质量,您可以使用数学上更精确的插值方法,例如差分插值(搜索样条绘图技术以获取更多信息),但对于您的快速减速效果的特殊情况,线性插值可能就足够了。

【讨论】:

顺便说一句,这种事情有专门的dsp.stackexchange.com。 非常感谢@m69 答案很完美,我也不知道dsp.stackexchange.com 感谢您的大力帮助。 :)

以上是关于DJ 效果算法的声音拉伸的主要内容,如果未能解决你的问题,请参考以下文章

文本相似度算法

OpenCASCADE中的Sweep扫掠算法

Johnson算法

有啥软件可以把普通歌曲转换成DJ版歌曲?

基于Seam-Carving算法的图像拉伸收缩matlab仿真

FFT算法得到错误的声音频率值