目次
遅延器(ディレイ)とは
ディジタル信号処理処理の基本はディジタルフィルタです.ディジタルフィルタとはその名の通り,ディジタルデータに対して何らかのフィルタをかける役割を持ちます.
代表的な例としては,
- 低周波帯域のみを通過させるローパスフィルタ
- 高周波帯域のみを通過させるハイパスフィルタ
- 特定の帯域のみを通過させるバンドパスフィルタ
などがあります.
これらすべてのディジタルフィルタは以下の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ファイルに対して遅延することができました.
コメント