Ccmmutty logo
Commutty IT
4 min read

【DSP】Pythonで学ぶディストーションの仕組み

https://cdn.magicode.io/media/notebox/0847d454-7291-4d0d-9474-09224dcbe590.jpeg

はじめに

この記事では、サウンドメイキングに必要なエフェクターの一つ、「ディストーション」の仕組みを、Pythonコード形式で解説します。

ディストーションとは?

音楽、特に音声信号処理(シンセ、エフェクター、アナライザなど)において、波形に歪みが生じることで音が変化することを指します。
ディストーション(Distortion)は、「歪み(ひずみ)」という意味です。

どうなるの?

こういう波形が
こういう感じになります。
このように、波形の形が対称非対称問わず、変形して音が変わることを、「歪む」といいます。
(厳密には、上下方向の変形が生じる場合のみ、『歪む』という言葉が使われます)
(が、折り返し歪み(Aliasing Distortion)のように、慣用句的に『歪み』という言葉が使われているケースは存在します)

やってみよう

まずはサイン波を生成します。
python
import numpy as np
from IPython.display import Audio
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 8000) * np.pi * 2.0
sine = np.sin(x)

plt.plot(sine)
このような音ができるので、歪ませてみます。

まずは、ソフトクリップといわれるタイプのディストーションを実装します。
とはいっても、三角関数の一種を使用するだけなので簡単です。
python
softclipped = np.tanh(sine * 2)
plt.plot(softclipped)
このような音になります。
元の音より太くなっていると思います。
実際、元の音にはない成分が含まれています。

次に、ハードクリップといわれるタイプのディストーションを実装します。
具体的には、波形がある一定以上の大きさを超えたときに、その地点でバッサリと波形を切り取る、という処理になります。
今回は、NumPyのclip関数を使います。
python
hardclipped = np.clip(sine * 2, -1, 1)
plt.plot(hardclipped)
このような音になります。
ソフトクリップよりも、音が鋭くなります。
音の高い部分がより激しくなっていると思います。

最後に、上下の形が非対称になるディストーションをかけます。
今回は指数関数np.expを使い、波形の上半分よりも下半分のほうが大きくなるようにして、最後にソフトクリップをかけます。
python
asym_sine = np.exp(sine*2) + 1
asym_clip = np.tanh(asym_sine)
plt.plot(asym_clip)
このような音になります。
分かりにくいですが、先程の音とは変化の仕方が違います。
難しく言うと、先程の2つにはなかった偶数倍音が出ています。
人によっては、ソフトクリップ、ハードクリップの音を「冷たい」、非対称に歪んだ音を「暖かい」と言ったりもします。

詳しい説明

今回、ソフトクリップに使った関数はtanhといいます。
詳しいことは省きますが、この関数に入力した数値は、正の値なら限りなく1に、負の値なら限りなく-1に収束する、という関数です。
こういった関数のことを『誤差関数』と言ったりします。
また、こういった数学関数でなくても、入力と出力のマッピング(数値同士の対応 ex. 0.5は0.7に、0.8は0.9に…)を自由に書いて処理することもできます(iZotope Trash2などにその機能があります)。

対称非対称のお話

対象歪みは、基本的に偶数倍音が出にくい傾向にあります。
例えば、サイン波は基音だけなので、対象歪みを起こすと奇数倍音だけが出てきます。
矩形波や三角波、それに限らず、波形が点対称のものに対象歪みを起こすと、必ず奇数倍音が出ます。
が、DC(直流)成分が含まれている場合は、偶数倍音が出ることがあります。
それに対し非対称歪みは、どんな入力波形であっても、偶数倍音が出ます。
このことについて詳しく知るには、フーリエ級数などの知識が必要になってくるので、ここでは割愛します。

まとめ

  • DSPにおける基本的なディストーションは、『ソフトクリップ』、『ハードクリップ』、『非対称歪み』
    • 場合によって、これらを組み合わせたり、応用して使う
  • ソフトクリップは、正の数が大きければ大きいほど1に、負の数が大きければ大きいほど-1に向かう
  • ハードクリップは、一定以上の大きさの数値を、バッサリとカットする
  • 歪みの種類によって、出る成分が違う
    • 非対称歪みは偶数倍音が出る。ソフトクリップやハードクリップなどの対象歪みは偶数倍音が出にくい
    • 対象歪みでも、原音にDC成分が乗っていたり、偶数倍音が含まれていたりすると、上記の限りではない
    • 倍音についてはこちらを参照

お疲れ様でした。

出典

Wikipedia - 倍音
筆者の独学の知識

Discussion

コメントにはログインが必要です。