添加到单声道信号以执行立体声

Adding to mono signals to perform stereo

我正在尝试使用这两个相移音调播放立体声信号,但我做不到

import numpy as np
import sounddevice as sd

fs = 44100
duration = 1
frequency = 440

phase = 90 * 2 * np.pi / 360
sine_A = (np.sin(2 * np.pi * np.arange(fs * duration) * frequency / fs + phase)).astype(
    np.float32)
sine_B = (np.sin(2 * np.pi * np.arange(fs * duration) * frequency / fs)).astype(np.float32)

sumSine= np.array([sine_A, sine_B])
sd.play(sumSine)

它 returns 我出现以下错误:

sounddevice.PortAudioError: Error opening OutputStream: Invalid number of channels

我无法追踪问题所在

问题出在我处理 numpy 数组的方式上。

一定是

stereoSignal = numpy.array([[a,b], [c,d],...])

正确的近似值如下。

fs = 44100
duration = 1
frequency = 440

phase = 90 * 2 * np.pi / 360
sine_A = (np.sin(2 * np.pi * np.arange(fs * duration) * frequency / fs + phase)).astype(
    np.float32)
sine_B = (np.sin(2 * np.pi * np.arange(fs * duration) * frequency / fs)).astype(np.float32)

sumSine = np.array([list(i) for i in zip(sine_A, sine_B)])
sd.play(sumSine, mapping=[1, 2])

我附上完整的代码link: https://github.com/abonellitoro/not-in-phase-stereo-tone-generator

如您所知,您没有正确连接 sine_Asine_B。按照您的操作方式,创建了一个包含两行和许多列的数组。由于 sd.play() 期望列是频道,你显然给了它太多,这就是它抱怨的原因。

您应该连接两个数组,使它们形成新数组的两列。我认为最简单的方法是:

np.column_stack((sine_A, sine_B))

不过还是不行。 当您调用 sd.play() 时,它开始在后台播放,然后立即 returns。由于您在那之后立即退出脚本,因此您不会真正听到任何美妙的正弦音调。 要等待播放完成,您可以例如使用 sd.wait().

最后,您的脚本可能如下所示:

import numpy as np
import sounddevice as sd

fs = 44100
duration = 1
frequency = 440

phase = np.pi / 2
t = np.arange(int(fs * duration)) / fs
sine_A = np.sin(2 * np.pi * frequency * t + phase)
sine_B = np.sin(2 * np.pi * frequency * t)

stereo_sine = np.column_stack((sine_A, sine_B))
sd.play(stereo_sine, fs)
sd.wait()

顺便说一句,你也可以看看 my little tutorial,它显示了类似的东西。