ボーカル音声は正弦波のような周波数が決まった波形ではないことが想定されますので、スイープ信号を使い時間的に変化する音源を抽出できるか実験します。
110Hzから1760Hzまでスイープする信号の一部を切り出します。
元波形
このスイープ信号のうち、1sec-4secの部分を抽出します。
抽出された波形
抜き出した残りの波形
周波数が変化するスイープ信号であっても、同様のロジックでほぼ抜き出すことができました。 残存信号を確認すると、まだ元の信号が聞こえます。完全には振幅と位相が一致していないことがわかります。
110-1060Hzおよび3000-1560Hzまでの2つのスイープ信号の混合から、それぞれが抜き出せるかテストします。
元波形
#!/usr/bin/env python
import soundfile as sf
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import chirp
length = 5.0
pre = 0.5
post = 0.5
samplefq = 44100
swstart = 110
swend = 1060
amp = 1
swstart2 = 3000
swend2 = 1560
amp2 = 1
const=1
t = np.linspace(0, length, num=length*samplefq)
buf = np.zeros(t.shape[0])
buf += amp*chirp(t, swstart, length, swend)
buf += amp*chirp(t, swstart2, length, swend2)
wav = np.concatenate([np.zeros(int(pre*samplefq)), buf, np.zeros(int(post*samplefq))], axis=0)
#plt.plot(wav)
#plt.show()
wav /= wav.max()
wav *= 0x7000
wav = wav.astype(np.int16)
with sf.SoundFile('sweep2.wav', 'w', samplefq, 1) as sfile:
sfile.write(wav)
分離した高周波側波形です。若干抽出にゆらぎが見られますが、大部分の成分は抽出できています。
抽出された高周波側波形
同様に分離した低周波側波形です。
抽出された低周波側波形
スイープ信号が2つであっても同様に、それぞれの信号を分離できることがわかりました。 しかし、混合信号の場合は現在の抽出ロジックでは他の信号成分が干渉して、抽出周波数にゆらぎが生じ完全な元波形は再現できていません。 また、信号開始時と終了時の振幅は、もとの周波数解析のロジックに由来して少し小さくなっています。