遅延器(ディレイ)(Python)

目次

遅延器(ディレイ)とは

ディジタル信号処理処理の基本はディジタルフィルタです.ディジタルフィルタとはその名の通り,ディジタルデータに対して何らかのフィルタをかける役割を持ちます.
代表的な例としては,

  • 低周波帯域のみを通過させるローパスフィルタ
  • 高周波帯域のみを通過させるハイパスフィルタ
  • 特定の帯域のみを通過させるバンドパスフィルタ

などがあります.

これらすべてのディジタルフィルタは以下の3つの要素から構成することができます.

  • 乗算器
  • 加算器
  • 遅延器(ディレイ)

ディジタルフィルタはこれらの要素を組み合わせ,上記のような機能を実現しています.

乗算器,加算器に関してはその名の通り,信号に対して加算,乗算を行うものです.

そして,最後の遅延器は信号を遅らせるために使用されます.この遅延器を今回は扱います.

手順

delay.pyというファイル名で作成し,以下のコードを記述します.

import sys
import soundfile as sf
import numpy as np
import matplotlib.pyplot as plt

def delay(data, n_delay):
    n_samples = len(data)
    output_data = np.zeros(n_samples+n_delay)
    for time in range(n_samples+n_delay):
        time_delay = time - n_delay
        if time_delay >= 0:
            output_data[time] = data[time_delay]
    return output_data

def main():
    filename = sys.argv[1]
    n_delay = 8000
    data, samplerate = sf.read(filename)

    if len(data.shape) > 1:
        input_data = data[:, 1]
    else:
        input_data = data
    output_data = delay(input_data, n_delay)
    time = np.arange(0,len(input_data)+n_delay)*(1/samplerate)

    fig, axes = plt.subplots(2, sharex=True)
    axes[0].plot(time, np.hstack([input_data, np.zeros(n_delay)]))
    axes[0].set_title('Before delay')
    axes[0].set_xlabel('time[s]')
    axes[0].set_ylabel('amplitude')
    axes[1].plot(time, output_data)
    axes[1].set_title("After delay")
    axes[1].set_xlabel('time[s]')
    axes[1].set_ylabel('amplitude')
    plt.show()

if __name__ == '__main__':
    main()

実行例

$ python delay.py /path/to/audio_file.wav

実行結果を以下に示します.

上下の図を比較すると,確かに信号が遅延されていることが確認できます.
使用音源のサンプリング周波数は44.1kHzで,実行したプログラムは8000サンプル遅延するようにしたので,ディレイ後は入力信号より約0.2秒ほど遅延してることになります.

まとめ

今回は,ディジタルフィルタの基本であるディレイを扱い,実際にwavファイルに対して遅延することができました.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次