平移音频的算法

信息处理 声音的 算法
2022-01-01 18:21:30

我正在寻找一种方法来平移我拥有的 PCM 音频。目前音频是立体声格式,我想将它平移到所需的一侧(或更多/更少到一侧)。

我最近想出了如何在这里进行混合,所以我想它会是类似的(相互添加东西等等)。我的想法是将音频数据从一侧添加到另一侧。
例如,如果我要向左平移,我会从右通道获取数据并将其添加到左通道。然后我会将正确的通道设置为一个恒定值,这样它就会静音。

我的想法是正确的还是我错过了一些明显的东西?

提前致谢!

3个回答

将单声道源置于立体声中的基本技术称为恒功率声像

如果您想以角度θ放置单声道源,您可以使用AampBamp作为通道的振幅:

Aamp=22(cosθ+sinθ)

Bamp=22(cosθsinθ)

通常的范围从为中心。θ45450

希望,这有帮助。

参考:道路,柯蒂斯 (1996)。电脑音乐教程剑桥:麻省理工学院出版社,第 457-461 页。

此外:

您可以直接将其放入代码中。例如,如果您使用 Python 并且在 numpy 数组中有单声道音频,您可以按给定角度将其转换为立体声,如下所示:

def panner(x, angle):
    """
    pan a mono audio source into stereo
    x is a numpy array, angle is the angle in radiants
    """
    left = np.sqrt(2)/2.0 * (np.cos(angle) - np.sin(angle)) * x
    right = np.sqrt(2)/2.0 * (np.cos(angle) + np.sin(angle)) * x
    return np.dstack((left,right))[0]

你可以像使用它一样panner(np.array([1,2,3]), np.radians(20))(当然[1,2,3]是一个毫无意义的音频缓冲区。)

我只是想指出,如果您打算在代码中使用这些公式,您可以通过使用 0 到 90 度之间的角度 $\theta$ 并简单地计算 $A_{amp } = \sin(\theta)$ 和 $B_{amp} = \cos(\theta)$。θ between 0 and 90 degrees and simply calculating Aamp=sin(θ) and Bamp=cos(θ).

您之前可能遇到过这些(在我搜索等功率或恒定功率平移时,它们似乎更常被引用),并认为上面的公式会给您一个不同的曲线。它们确实看起来不同,但曲线是相同的。

对于立体声文件,如果声相不居中,您只需要保持一个通道相同,同时线性衰减另一侧。