Pythonでnumpyの信号をスピーカーから出力するのはどうすればよいのかを探していると,sounddeviceというのが見つかった.
これを使って前は少し遊んでみるた
sounddeviceにはplayrecという関数があって再生と録音を同時にできる.
音を入力出力する例としては,sd.playrec(z, samplerate=fs, channels=1)に変えるだけである.
下の例ではz2が録音されたデータの列になっている.
注意すべき点は,秒単位ではタイミングがずれることである.タイミング関係は使用している環境や負荷によるかもしれない.
import numpy as np import sounddevice as sd import matplotlib.pyplot as plt fs = 44100 fbase = 4000; t = np.linspace(0, 44099, num=44100, endpoint=False); z = 0.2 * np.sin(t * 2 * np.pi * (fbase)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 1)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 2)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 3)); z2 = sd.playrec(4 * z, fs, channels=1)#sd.rec(int(duration * fs), samplerate=fs, channels=1) sd.wait() sd.play(z2, fs); # 表示 Fz = np.fft.fft(z2) / z2.shape[0] * 2; # 折り返すのでパワーが2分の1になっている. Fz[0] = Fz[0] / 2; # 平均成分は折り返さない. Fz_abs = np.abs(Fz); freq = np.fft.fftfreq(len(z), d=1.0/fs); tim = np.arange(0, z2.shape[0]) * 1.0 / fs; plt.figure(1) plt.subplot(211); plt.plot(tim, z2); plt.subplot(212); plt.plot(freq, Fz_abs * 1e6); plt.xlim([0, 20000]) plt.show();
タグ:Python