7

私は独特の特徴を持つソフトシンセサイザーを書き始めています: オシレーターには、ユーザーが正弦波、方形波、のこぎり波を連続的に選択できる「連続波形」ノブがあります。つまり、ノブが完全に左にある場合、出力は正弦波になり、中央にある場合はのこぎり波になり、右にある場合は方形波になります。そして、中間位置は、古典的な波の「補間」バージョンである波を出力します。-- ノブの位置と波の種類を変更できますが、波形を連続的に変更する方法が望まれます --

オシレーターを実装する方法をいくつか考えました。

  1. ノブの位置を取得して実際の信号のスペクトル (振幅と周波数の配列) を計算する関数を考え出し、一連の正弦関数と合計ブロックを使用して出力信号を実装します。

  2. 1. と同様ですが、サインと合計の代わりに逆フーリエ変換を適用します (この時点では、それらが実際に同じものかどうかはわかりません)。

  3. 可能なノブ位置ごとに波形テーブルを生成し、ウェーブ テーブル合成技術を使用して出力信号を生成します。

  4. 2 つのノコギリ波 (偶数倍音と奇数倍音の両方を含む) から始め、1 つを反転して合計し、ノブでそれぞれの振幅を制御します。波形は

いくつかの質問を聞きたいんです:

A. 技術番号 1 は非常にプロセッサを集中的に使用するため、実際には実行可能ではないことを読みました。これは、iPad のような ARM プロセッサにも当てはまりますか??

B. どの手法を選択したとしても、オシレータの出力にローパス フィルタを接続するだけで、エイリアシングの問題を解決できますか?

C. そのようなオシレータを実装する方法について他に何か提案はありますか?

D. どの C++ ツールキットを使用するかについて何か提案はありますか? 私は CCRMA の STK を見てきましたが、他にもっと適切なライブラリがあるかどうかはわかりません。

幸運を祈ります!;)

編集:昨夜、誰かが私に夕食を教えてくれました。ベジエ曲線は、考慮すべきもう 1 つのオプションです。

4

4 に答える 4

5

これを過度に複雑にしていないかどうかはわかりません。私の理解が正しければ、連続波形ノブで行っていることは、3 つの波形のさまざまな量を効果的に混合することだけです。したがって、常に3つの波形すべてを生成し、説明した波形の組み合わせに応じて異なるゲインでそれらを合計します.

エイリアシングを回避するための帯域制限された波形合成については、必要なもののほとんどがここで見つかるでしょう。

それが役立つことを願っています。

于 2012-01-26T21:28:32.597 に答える
3

これがBの答えです(ローパスフィルターを出力に接続するだけでエイリアシングの問題を解決できますか?)、他のいくつかの点に触れています。

残念ながら、答えは「いいえ」です。エイリアシングは、ナイキスト周波数を超える高調波周波数(つまり、サンプルレートの半分)が存在することによって発生します。これらの高調波が発振器の波形に存在する場合、フィルタリングは役に立ちません。(適切にアグレッシブなフィルタリングは、生成した波の特性を破壊します。)オーバーサンプリング(別の回答ではこれについて言及しています)は可能ですが、コストがかかります。

これを回避するには、「帯域制限された」波形を生成する必要があります。つまり、選択した値<ナイキストを超える高調波がない波形です。これを行うことは簡単ではありません。ここにあるこの論文は一読の価値があります。この問題を解決するには、2つの確立された実用的なアプローチがあります。BLIT(帯域制限インパルストレイン)とMinBLEPです。どちらのアプローチも、波形の適切なポイントに「もの」を挿入することにより、高調波を生成する不連続性を滑らかにしようとします。

それを念頭に置いて、あなたのオプションは縮小し始めます。おそらく、使いやすさとサウンドの間の最良の妥協点は、一連の帯域制限されたウェーブテーブルを生成することでしょう。ただし、補間された波を処理するには、何らかの形のアンチエイリアシングを調査する必要があります。

iDevice ARMは、リアルタイムでDSPを実行することができます。一般的なアドバイス:タイトなコードを記述し、インライン関数を使用し、分割を避けます。レンダリングループは1秒間に44,100回呼び出されるため、コードが1/44100秒(0.023ms)以内に完了する限り、問題は発生しません。実際には、問題なく複数のオシレーターを同時に実行できるはずです。アプリストアにこれらすべての音楽アプリが存在することは、その証拠です。

STKは素晴らしいイントロライブラリです。(Perry Cookの本「インタラクティブアプリケーション用のリアルタイムオーディオ合成」も優れた基礎であり、読む価値があります。)STKは意図的に最適化されていませんが、「連続」波形の生成にどれだけ役立つかはわかりません。 。kvraudio.commusicdsp.orgがあなたの読書リストに載っているはずです。

于 2012-01-26T21:32:32.073 に答える
1

A. 技術番号 1 は非常にプロセッサを集中的に使用するため、実際には実行可能ではないことを読みました。これは、iPad のような ARM プロセッサにも当てはまりますか?

これにより、単純な問題が複雑になります (しゃれが意図されています)。Accelerate.framework は、これらの関数 (fwiw) の最適化されたバリエーションを提供しますが、単純な問題を複雑にしています。一般的な注意事項: デバイスでの浮動小数点計算は低速です。浮動小数点の実装は、プログラムをかなり危険にさらす可能性があります。機能、ポリフォニー、または品質が大幅に低下する可能性があります。要件を知らなければ、浮動小数点計算でうまくいくかどうかを判断するのは困難です。

B. どの手法を選択したとしても、オシレータの出力にローパス フィルタを接続するだけで、エイリアシングの問題を解決できますか?

オーバーサンプリングしない限り、時間領域で生成された信号では機能しません。

C. そのようなオシレータを実装する方法について他に何か提案はありますか?

下記参照

D. どの C++ ツールキットを使用するかについて何か提案はありますか? 私は CCRMA の STK を見てきましたが、他にもっと適切なライブラリがあるかどうかはわかりません。

STK は、組み込みシンセサイザー用に設計されたツールキットというよりも、教育ツールに似ています。より適切な実装が存在します。

オプション 1. ノブの位置を取得して実際の信号のスペクトル (振幅と周波数の配列) を計算する関数を考え出し、一連の正弦関数と合計ブロックを使用して出力信号を実装します。

オプション 2. 1. と同様ですが、サインと合計の代わりに逆フーリエ変換を適用します (この時点では、それらが実際に同じものかどうかはわかりません)。

デスクトップでは比較的遅いです。

オプション 4. 2 つのノコギリ波 (偶数倍音と奇数倍音の両方を含む) から始め、1 つを反転して合計し、ノブでそれぞれの振幅を制御します。波形は

エイリアスのない生成のために、これを非常に効率的に (たとえば、BLIT を使用して) 行うことができます。ただし、BLIT は少数の波形に制限されています (Saw と Square に使用できます)。歴史を振り返って、「2000年頃のハードウェアおよびソフトウェアシンセで、この問題をどのように解決したか」と尋ねることができます。これが1つの解決策でした。もう一つは:

オプション 3. 可能なノブ位置ごとに波形テーブルを生成し、ウェーブ テーブル合成技術を使用して出力信号を生成します。

デバイスの機能を考慮して、これまたは BLIT の int 実装をお勧めします。

このテーブルは理解と実装が簡単で、優れたサウンドと CPU の結果を提供します。また、CPU/メモリ/品質のトレードオフを高度に構成できます。

エイリアスを解放したい(または近い)場合は、BLIT(またはその親戚)を選択してください。その理由は、ウェーブテーブルで可聴エイリアシングを最小限またはまったくなくすために、十分な量のメモリと十分な量のオーバーサンプリングが必要になるためです。

実装:

BLIT (およびファミリ) の実装がオンラインで多数あります。

テーブルのナプキン落書きは次のとおりです。

enum { WF_Sine, WF_Saw, WF_Square, WF_COUNT };
enum { TableSize = SomePowerOfTwo };

struct sc_waveform {
    uint32_t at[TableSize];
};

enum { NPitches = Something };

sc_waveform oscs[WF_COUNT][NPitches];

初期化時に、加算合成を使用してデータを取り込みoscsます。

再生中は、次のいずれかを使用します。

  • テーブルから読み取るための補間とオーバーサンプリング
  • または、信号のかなりの量のオーバーサンプリングとダウンサンプリング (これは CPU 効率的です)。

参考までに: オーバーサンプリングせずに無責任な量のメモリ (利用可能な量を考慮して) を消費したテーブルの線形補間は、最高の部分音を可聴的に減衰させず、 44.1kHzでレンダリング。これは単純なブルート フォース アプローチです。少し余分な作業を行うことで、より良い結果を得ることができます。

最後に、「Vector Synthesis」をグーグルで検索すると、関連情報も見つかるはずです。あなたが説明しているのは、その原始的な形式です。

于 2012-01-27T09:42:35.657 に答える
1

フーリエ変換は線形であるため、方形波とのこぎり波などの FFT を取得し、すべての高調波を線形にクロスフェードしてから、iFFT または正弦波の合計によって時間領域に戻すと、のこぎり波と鋸波をクロスフェードするのとまったく同じ出力が得られます。方形信号を直接。それがあなたのやりたいことかどうかはわかりませんが、もしそうなら、FFT を実行したり、中間テーブルを計算したりする必要はありません。

もちろん、波形間でスムーズに「フェード」する方法は他にもたくさんあります。たとえば、正方形を生成する位置からのこぎりを生成する位置に移動する線形セグメントで構成される歪み曲線を使用して、位相歪みを使用できます。これは、本質的に帯域制限のある方法で実装するのはおそらく非常にトリッキーです。

エイリアシングは、実際には、オーバーサンプリングとフィルタリング、またはフィルタリングのみを使用して解決できることがよくあります。エイリアシングは常に何らかのノイズを発生させるため、帯域制限技術を使用することをお勧めします。

于 2012-01-26T21:20:14.670 に答える