Wizard Notes

音楽信号解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です

線形畳み込みのforループでのナイーブな実装 (Python)

この記事をシェアする

VSTプラグインで線形畳み込みを実装する必要が出てきたので、 事前にPythonC++ライクな実装を検証しました。

とりあえず、2つの入力信号の配列サイズ不明で、最適化していない実装です。

import numpy as np
from numba import jit

@jit
def conv_linear(x1, x2, y, len_x1, len_x2, len_y):
    for k in range(0, len_y):
        y[k] = 0.0
        for m in range(0, len_x1):
            n = k - m
            if n >= 0 and n < len_x2:
                y[k] +=  x1[m] * x2[n]

使い方

x1, x2 = np.array([1.0, 0.5, 0.1]), np.array([1.0, 0.5])
y = np.zeros(len(x1)+len(x2)-1)
conv_linear(x1, x2, y, len(x1), len(x2), len(y))
_plot(x1, x2, y)