どこから関数を取得しますか?
ホイールの再発明は行わず、 musicdsp.orgから機能を取得します。これは、多くの既製のアルゴリズムを見つけることができるdspプログラマーのコミュニティですが、それらのほとんどはC ++コードにリストされています。
最初に
最も簡単な例から始めましょう。
z = M_PI * a;
s = 1 / sin(z)
b = 1 / a
if(x> b)
f(x)= 1
他に
f(x)= sin(z * x)* s
ここで、変数a-は信号の歪みの度合いを制御し、入力信号は変数xとして表されます。 これを最大で実装します:

最初のパッチ
ここで、ifロールは、オブジェクトの構築によって実行されます>〜 、 +〜および[selector〜2] 。 オブジェクト>〜は、(サイクル〜からの)入力信号を変数bと比較し、信号値が変数bより大きい場合は1を表示し、それより小さい場合は0を表示します。 1つと0はセレクター〜オブジェクトを制御し、1つのインレットのみを出力します。 したがって、条件x> bが満たされると、 1が出力されます;そうでない場合、出力は式cos(z * x)* sによって計算されます。 元の式ではサインですが、コサイン関数を使用していることに気付くかもしれません。 実際には、サインを計算するためのオブジェクトは最大ではないので、サインをコサインに置き換える必要があります。違いはありません。それらは初期段階でのみ異なるからです。
第二
コード:
x = [-1..1]の入力
k = 2 *量/(1量);
f(x)=(1 + k)* x /(1 + k * abs(x))
コードの作成者は、 金額が-1 ... 1の範囲内にある必要があることに注意します 。 もちろん、 量を1に設定する必要はありません。この場合、ゼロによる除算があります。 ここに入力信号-xがあります。

ここでは複雑なことは何もありません。パッチを慎重に研究し、式と比較すると、すべてがどのように機能するかを簡単に理解できます。
第三
コード:
f(x、a)= x *(abs(x)+ a)/(x ^ 2 +(a-1)* abs(x)+ 1)
彼は最大です:

信号は、パラメータamount> 1で歪んでいます。 量が-1 ... 0の範囲にあるときに、奇妙な効果(少なくとも正弦波では)に気付きました。 試してみてください、幸福があります! :)
チェビシェフ多項式
非線形信号変換は追加の高調波を作成しますが、ほとんどの場合、無数の高調波が生成され、エイリアシングによる高周波での歪みが発生します。 したがって、追加された高調波を制御することが非常に重要です。幸いなことに、これはチェビシェフ多項式を使用して非常に簡単に実行できます。
それらには非常に重要な特性があります:単位振幅の高調波信号(たとえば、正弦波)がそれらを介して供給されると、同じ信号を得ることができます。 周波数乗数は、多項式の次数に依存します。
すべての多項式は、ほぼ次の形式をとります。
y = f(x)= d0 + d1x + d2x ^ 2 + d3x ^ 3 + ... + dNx ^ N;
つまり、実際には多項式です。 n番目の要素は、多項式の次数を決定します。 この場合、各要素は特定の高調波を生成し、その後すべてが加算されます。 各メンバーのタイプは、次の繰り返し関係によって決定されます。
Tk + 1(x)= 2xTk(x)-Tk – 1(x);
その中で、各用語は前の用語に基づいて決定され、すべてゼロから始まり、この場合は1に等しく、最初の用語はxに等しくなります。
T0(x)= 1;
T1(x)= x;
それらを知っていれば、3番目の用語を決定できます。
T2(x)= 2x * x-1 = 2x ^ 2-1;
そして4番目:
T3(x)= 2x(2x ^ 2-1)-x = 4x ^ 3-3x;
ご想像のとおり、第2項は第1高調波、第3項は第2高調波などです。
チェビシェフ多項式のもう1つの特徴は、1未満の振幅で信号を渡すと、高調波の飽和が少ないサウンドが出力されることです。 これにより、歪みの駆動パラメータを作成できます。
それでは、練習に移りましょう。 8つの高調波を生成し、各コンポーネントの振幅を設定できるチェビシェフ多項式を使用して歪みを作成する必要があります。 各高調波の伝達関数を探すのではなく、2つの前の高調波に基づいて新しいサブパッチを生成する小さなサブパッチを作成します。

前の高調波は最初のインレットに供給され、前の高調波は前のインレットに供給され、変更されていない入力信号は3番目のインレットに供給されます。 ご覧のように、このサブパッチャーは繰り返し関係Tk + 1(x)= 2xTk(x)-Tk – 1(x)を実装するだけで、複雑なものはありません。
次に、これらのブロックからパッチを作成して、8次高調波を追加します(チェーンの最後のハイパスフィルターはDCオフセットを削除します )。

このパッチを使用すると、追加された高調波の振幅を調整できます。これを使用して、アナログデバイスをエミュレートできます。 そのため、多くの真空管の歪みは主に偶数次の高調波を追加し、奇数次の高調波は入力信号の振幅が大きい場合にのみ表示されます。 低品質のアンプの多くは、3次高調波を生成する可能性があります。 ソリッドステートの「ファズフェイス」歪みは、信号を非対称に歪みます。明らかに、2次および3次高調波、および4次および5次高調波がわずかにあります。 Electro-Harmonix Big Muff PIは対称的に歪み、主に5次および7次高調波を生成します。
おわりに
振幅変換は、不快な結果、つまりエイリアシングを伴います。 生成された高調波がサンプリング周波数の半分に等しい最大信号周波数(ニキスト周波数)を超えると表示されます。 それに対抗するために、オーバーサンプリングが使用されます。つまり、数倍に増加したサンプリングレートで内部アルゴリズムを実行し、その後信号がデバイスを離れると減少します。 チェビシェフ多項式を使用する場合、エイリアシングを完全に除去するためにサンプリング周波数を増やす必要がある回数が正確にわかっています。これは、生成される最高高調波によって決まります。 アルゴリズムが他の伝達関数に基づいている場合、通常これらのアルゴリズムは無限の数の高調波を生成するため、完全に除去することはできませんが、オーバーサンプリングはエイリアシングの影響を大幅に減らすことができます。
作業中のほとんどのウェーブシェイパーvstsは信号を変換するために式を使用せず、その役割は式の値が-1 ... 1の範囲で入力される値のテーブルによって果たされます。 これにより、リソースを大量に消費する計算をリアルタイムで実行できなくなり、伝達関数を「描画」することもできます。
次の記事のいずれかで、オーバーサンプリングとテーブルウェーブシェイピングを最大限に行う方法について説明するので、お楽しみに。
PSパッチアーカイブには、 all_in_one.maxpatパッチも含まれています。このパッチには、アルゴリズムとソースサウンドを選択する機能を備えたすべてのアルゴリズムが含まれています。
リンクからアーカイブ自体をダウンロードできます。