05.スイープ信号の分離実験

Created: 2018/08/25
Last Update: 2018/08/26
  1. 過渡信号の分離

    ボーカル音声は正弦波のような周波数が決まった波形ではないことが想定されますので、スイープ信号を使い時間的に変化する音源を抽出できるか実験します。

  2. ひとつのスイープ信号を分離

    110Hzから1760Hzまでスイープする信号の一部を切り出します。

    元波形

    このスイープ信号のうち、1sec-4secの部分を抽出します。

    スイープ信号の1sec-4secを抽出

    抽出された波形

    スイープ信号の1sec-4secを逆位相で消したもの

    抜き出した残りの波形

    結果の考察

    周波数が変化するスイープ信号であっても、同様のロジックでほぼ抜き出すことができました。 残存信号を確認すると、まだ元の信号が聞こえます。完全には振幅と位相が一致していないことがわかります。

  3. 2つのスイープ信号を分離

    110-1060Hzおよび3000-1560Hzまでの2つのスイープ信号の混合から、それぞれが抜き出せるかテストします。

    110-1060Hzおよび3000-1560Hzのスイープ信号

    元波形

    
    #!/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)
    

    高周波側の分離

    分離した高周波側波形です。若干抽出にゆらぎが見られますが、大部分の成分は抽出できています。

    3000-1560Hzのスイープ信号を抽出

    抽出された高周波側波形

    低周波側の分離

    同様に分離した低周波側波形です。

    110-1060Hzのスイープ信号を抽出

    抽出された低周波側波形

    結果の考察

    スイープ信号が2つであっても同様に、それぞれの信号を分離できることがわかりました。 しかし、混合信号の場合は現在の抽出ロジックでは他の信号成分が干渉して、抽出周波数にゆらぎが生じ完全な元波形は再現できていません。 また、信号開始時と終了時の振幅は、もとの周波数解析のロジックに由来して少し小さくなっています。

もくじへ戻る