添加到单声道信号以执行立体声
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_A
和 sine_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,它显示了类似的东西。
我正在尝试使用这两个相移音调播放立体声信号,但我做不到
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_A
和 sine_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,它显示了类似的东西。