6

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

クラシックシンセサイザーのROMからの愛されているシングルサイクル波形がいくつかあります。

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

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

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

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

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

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

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

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

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


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

4

4 に答える 4

2

既存の 8 ビット サンプルを新しい 16 ビット サンプルの上位バイトに配置し、下位バイトを使用して、元の 8 ビット サンプルごとに新しい 16 ビット データポイント を線形補間することができます。

これは基本的に、いくつかの新しいサンプルを使用して、元の 8 ビット サンプルのそれぞれの間で 16 ビットの直線を結びます。2 つの元のサンプル間で突然 8 ビットのジャンプが発生するため、現在のサウンドよりもはるかに静かなサウンドになります。

ローパス フィルタリングを適用することもできます。

于 2009-07-29T22:43:10.880 に答える
1

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

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

AI は錬金術のようなものです。最終目標には到達しませんでしたが、途中で多くの優れたものが出てきました。

于 2009-07-30T12:50:26.767 に答える
1

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

  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)、および 8 ビットが約 48 dB のダイナミック レンジであることに基づいて、しきい値はおそらく 40 dB です。最大 1.5 ビットのノイズを許容します。

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

  5. y[n] がうまく聞こえない場合は、非常に低いレベルのノイズでディ​​ザリングします。

ノート:

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

B. ステップ 5 は、ステップ 3 で Y[w] のランダム ノイズに「0」値を設定することに置き換えられる可能性があります。

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

于 2009-07-31T20:34:13.773 に答える
1

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

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

信号のように見えるノイズを取り除くことはほとんど不可能です。周波数帯域内のものを微調整し始めると、目的の信号が取り出されます。

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

ピート

編集:コメントが少し長くなってきているので、一部を回答に移動します。

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

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

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

更新: なぜ? 信号をサンプリングする目的は、信号を可能な限り再現できるようにすることです。サンプリングで変換しきい値が不十分に設定されている場合、すべてのエラーは信号の片側にあり、十分に分散されておらず、ゼロを中心としています。このようなシステムでは、特に 8 ビット ADC のように分解能が低い場合は特に、利用可能なダイナミック レンジを最大限に活用しようとします。

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

于 2009-07-30T12:59:04.423 に答える