5

1.コンテキスト

GLSLを使用して、次のような特定の周波数での波形の振幅をプロットしています。

GLSLプロット

上記のような単純な波形を表示するのは簡単な作業です。正しい方程式を使用するだけです(GLSLの抜粋コードはこちらから入手できます)。私が今やろうとしているのは、2つの波形間の周波数変調の結果を表示することです。


2.調査

いくつかの調査の結果、これを達成するための2つの可能な方法を見つけました。

  1. dspのようなアプローチを使用することは、私が知る限り、位相アキュムレータここで最初の回答を参照)をルックアップテーブルと組み合わせて使用​​することは、信号処理を扱うときに推奨されるアプローチです。GLSLの初心者として、複数のGPUサイクルにわたって変数を格納およびインクリメントできないため、これはGLSLシェーダーでは不可能であることを理解しました。

  2. 純粋数学的なアプローチを使用すると、これにはChowningの単純なfm式のような方程式が含まれます。 FM式http://img577.imageshack.us/img577/4820/fmformula.png
    この式は、状況によってはうまく機能します(コサイン波が別のコサインを変調するか、コサインが鋸歯を変調します)が、次のような一般的な式を見つけることができませんでした。すべての場合に機能します(鋸歯状波がコサインを変調する場合、搬送波周波数は鋸歯状振幅によって変調されると思いますが、得られるのは明らかに変調されていない搬送波だけです)。


3.質問

  • この問題を解決するための最良のアプローチは何でしょうか?
  • GLSLでdspのようなアプローチは可能ですか?
  • そうでない場合、すべての作業を実行するのに十分な柔軟性のある一般的なFM方程式はありますか?

ここに含まれるすべての分野(オーディオdsp、コンピューターサイエンス、GPUプログラミング、数学)でのスキルの欠如を考えると、ここで本当に単純なものが欠けていても驚かないでしょう。しばらくお待ちください。

4

1 に答える 1

4

おっしゃる通り、位相アキュムレータの通常の dsp のようなアプローチは、GPU での並列計算にはあまり適していません。したがって、「純粋な数学的」方法がおそらく最善の策です。

より一般的な周波数変調関数へのチャウニングの単純な FM 式の一般化は、ウィキペディアの周波数変調ページ(そのページの一番最初の式) で与えられます。重要な点は、cos 関数の引数が位相であるということです。これは、ウィキペディアの方程式が示すように、周波数の時間積分です。FM では、周波数は通常、搬送波に変調を加えたものです。たとえば、単純な正弦波 FM のチャウニングの公式では、時間の関数としての周波数は次のようになりますt

f(t) = f_c - M * f_m * sin(f_m * t)

ここf_cで、 はキャリア周波数、Mは変調量、 はf_m変調の周波数です。これはフェーズに統合されます

p(t) = f_c * t + M * cos(f_m * t)

これは、質問の方程式のフェーズに対応します。

コサインをノコギリ波で変調するf(t)と、ノコギリ波 (およびキャリア周波数) になるためp(t)、ノコギリ波の時間積分を見つける必要があります。これは比較的簡単です (区分二次関数である必要があります) が、問題がある場合は math.stackexchange のスタッフが助けてくれるはずです。

(注: ここではすべてを time で表現していますが、代わりtに space を使用することもできます。)x

于 2012-08-01T11:43:30.327 に答える