質問

これは私の「週末」の趣味の問題です。

古典的なシンセサイザーの ROM にある、お気に入りのシングルサイクル波形がいくつかあります。

これらは 8 ビットのサンプル (256 個の可能な値) です。

わずか 8 ビットなので、ノイズ フロアはかなり高くなります。これは量子化誤差によるものです。量子化誤差はかなり奇妙です。すべての周波数が少し混乱します。

私はこれらのサイクルを利用して、それらの「クリーンな」16 ビット バージョンを作成したいと考えています。(はい、人々がダーティ バージョンを好むことはわかっています。そのため、ユーザーが好みの程度にダーティとクリーンの間を補間できるようにします。)

それは不可能に思えますよね、下位 8 ビットを永久に失ってしまったからです。しかし、これはしばらく頭の片隅にあり、私にはそれができると確信しています。

これらは再生のために何度も繰り返される単一サイクルの波形であるため、これは特殊なケースであることに注意してください。(もちろん、シンセサイザーは、エンベロープ、モジュレーション、フィルターのクロスフェードなど、サウンドを面白くするためにあらゆる種類の処理を行います。)

個々のバイト サンプルについて、私が実際に知っているのは、それが 16 ビット バージョンの 256 個の値の 1 つであるということです。(逆のプロセスを想像してください。16 ビット値が切り捨てられるか、8 ビットに丸められます。)

私の評価関数は最小ノイズフロアを取得しようとしています。1 つ以上の FFT でそれを判断できるはずです。

徹底的なテストにはおそらく永遠に時間がかかるため、最初のパスは低解像度で行うことができました。それとも、ランダムに選択した値を (同じ 8 ビット バージョンを維持できる既知の値の範囲内で) ランダムにプッシュし、評価を行ってクリーンなバージョンを維持するだけでしょうか?それとももっと早くできることはありますか?探索空間のどこかにもっと良い最小値があるかもしれないのに、局所最小値に陥る危険はありますか?他の同様の状況でも同じことが起こりました。

おそらく近隣の値を調べることによって行うことができる最初の推測はありますか?


編集: 新しい波形が元の波形にサンプリングされるという要件を削除すれば、問題はより簡単になると何人かの人が指摘しています。それは本当だ。実際、よりクリーンなサウンドを探しているだけなら、解決策は簡単です。

役に立ちましたか?

解決

質問のアプローチに沿って、山登りアルゴリズムなどを検討することをお勧めします。

http://en.wikipedia.org/wiki/Hill_climbing より多くの情報があり、サイドボックスには、より適切な他のアルゴリズムへのリンクがあります。

AIは錬金術のようなものです-私たちは最終的な目標に到達することはありませんでしたが、多くの良いものが途中で出てきました。

他のヒント

既存の8ビットサンプルを新しい16ビットサンプルの上位バイトに配置し、下位バイトを使用して 線形補間 元の各8ビットサンプル間の新しい16ビットデータポイント。

これは、いくつかの新しいサンプルを使用して、基本的に元の各8ビットサンプル間に16ビットの直線を接続します。現在の音よりもずっと静かに聞こえます。これは、2つの元のサンプル間での突然の8ビットのジャンプです。

ローパスフィルタリング

まあ、ノイズをクリーンアップするために、FIRフィルタリング(処理サイクルが本当に必要な場合はIIRですが、FIRは不安定なことなくより良い結果を出すことができます)を期待しています。あなたが望む効果を得るためにそれをいじる必要がありますが、基本的な問題は8ビットの解像度でそれをサンプリングすることによって作成されたオーディオの鋭いエッジを滑らかにすることです。オーディオの中心周波数を広く生成し、ローパスフィルターを実行してから、「フラット」に聞こえないように耳を傾けます。選んだフィルターで。

それは難しいですが、できることは限られています。下位8ビットは失われます。できることはそれを近似することです。

信号のようなノイズを取り除くことはほとんど不可能です。周波数帯域で週単位で物事を開始すると、関心のある信号が除去されます。

アップサンプリングの場合、すでにFFTを使用しているため、周波数領域信号の末尾にゼロを追加して逆FFTを実行できます。これにより、元の信号の周波数と位相の情報が完全に保持されますが、同じエネルギーがより多くのサンプルに拡散します。最初に8ビットをシフトして16ビットのサンプルにする場合、これはそれほど大きな問題にはなりません。ただし、変換を実行する前に、通常は整数のゲイン係数でキックします。

ピート

編集: コメントが少し長くなっているので、答えに移ります。

FFT出力のピークは、量子化によって生じる高調波スパイクです。私はそれらをノイズフロアとは違って考える傾向があります。誰かが述べたようにディザリングして高調波スパイクの振幅を除去し、ノイズフロアを平坦化することができますが、ノイズフロアの平坦な部分ですべての信号対ノイズを失います。 FFTに関する限り。その方法を使用して補間すると、同じエネルギーを保持し、より多くのサンプルに広がります。これにより、振幅が減少します。そのため、逆を行う前に、ゲイン係数を掛けて信号にエネルギーを与えます。

信号は単純/複雑な正弦波ですか、それともハードエッジを持っていますか?つまり、三角波、方形波など、サイクルごとに連続性があると仮定していますが、それは有効ですか?その場合、FFTに供給する波形サイクルの数を増やすことにより、FFTの解像度をより正確に正確な周波数に上げることもできます。使用する周波数がある程度離散的であると仮定して、正確に特定できる場合、目的の信号を完全に再作成できる可能性があります。

16ビットから8ビットへの切り捨て要件を使用すると、元のソースと一致しない結果が生成されます。 (したがって、最適な答えを見つけるのが難しくなります。)通常、「最も近い一致を取得する」ことを試みることにより、固定小数点波形を生成します。つまり、最も近い数に丸めることを意味します(トランキングはフロア操作です)。それはおそらくそれらが最初に生成された方法です。 0.5(この場合0.5は128)を追加し、出力をトランキングすると、より正確な結果を生成できます。それが心配ではない場合は大丈夫ですが、間違いなく精度に悪影響を及ぼします。

更新: どうして?信号をサンプリングする目的は、信号をできるだけ再現できるようにすることです。サンプリングで変換しきい値が適切に設定されていない場合、信号の片側でエラーが発生し、十分に分散されず、ほぼゼロに集中します。このようなシステムでは、特に8ビットADCなどの低解像度を使用している場合は、通常、使用可能なダイナミックレンジを最大限に使用しようとします。

バンド限定バージョン?それらが異なる周波数でフィルタリングされている場合、他のバリエーションから離れすぎたときに歪みのない同じサウンドを再生できるようになったと思われます。グラフィックのミップマッピングのようなものです。 この2つは、異なるエイリアシングフィルターが適用された同じ信号であると思われます。これは、オリジナルを再現するのに役立つ場合があります。それらは、異なる畳み込みを持つ同じベース信号でなければなりません

波形の周期性を利用した簡単なアプローチがあるかもしれません。次のような場合はどうでしょうか。

  1. 上位バイトが波形、下位バイトがゼロである 16 ビット波形を作成します。これを x[n] と呼びます。

  2. x[n] = X[w] の離散フーリエ変換を計算します。

  3. 信号 Y[w] = (dBMag(X[w]) > しきい値) を作成しますか?X[w] :0、ここで dBMag(k) = 10*log10(real(k)^2 + imag(k)^2)、しきい値はおそらく 40 dB です。これは、8 ビットがおよそ 48 dB のダイナミック レンジであり、最大 1.5 ビットが許容されることに基づいています。ノイズの。

  4. Y[w] を逆変換して、新しい 16 ビット波形である y[n] を取得します。

  5. y[n] の音が良くない場合は、非常に低いレベルのノイズでディ​​ザリングしてください。

ノート:

A.このテクニックは、元の波形が正確に周期的である場合にのみ機能します。

B.ステップ 5 は、ステップ 3 の Y[w] のランダム ノイズに「0」値を設定することで置き換えることができます。何がより効果的かを確認するには、少し実験する必要があります。

これは (少なくとも私にとっては) 最適化アプローチより簡単に思えます。ただし、切り詰められた y[n] は、おそらく元の波形と等しくなりません。その制約がどれほど重要なのかわかりません。このアプローチだと良い感じの波形が生成されるような気がします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top