0

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

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)

它返回给我以下错误:

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

我无法追踪问题所在

4

2 回答 2

0

问题出在我做 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])

我在这个链接中附上了完整的代码: https ://github.com/abonellitoro/not-in-phase-stereo-tone-generator

于 2017-03-26T20:59:26.863 回答
0

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

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

np.column_stack((sine_A, sine_B))

但是,它仍然无法正常工作。当您调用 时sd.play(),它开始在后台播放,然后立即返回。由于在那之后您将立即退出脚本,因此您不会真正听到任何漂亮的正弦音。要等待播放完成,您可以使用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()

顺便说一句,你也可以看看我的小教程,它显示了类似的东西。

于 2017-03-26T22:05:59.617 回答