5

信号 (サウンド サンプル) をあるサンプリング レートからより高いサンプリング レートにリサンプリングしようとしています。残念ながら、何らかの「エイリアシング」が発生しているように見えるため、何らかのフィルターが必要であり、私はフィルターに精通していません。これが私が思いついたものです:

int i, j, a, b, z;

a = 44100;
b = 8363;

// upsample by a
for(i = z = 0; i < samplen; i++)
    for(j = 0; j < a; j++)
        cbuf[z++] = sampdata[i];

// some filter goes here???

// downsample by b
for(j = i = 0; i < z; i += b)
    buf[j++] = cbuf[i];

新しいサンプルはオリジナルに非常に似ていますが、何らかのノイズがあります。追加する必要があるフィルターと、できればそのフィルターに関連するコードを教えてください。

オリジナルサウンド: http://www.mediafire.com/?9gnga1in52d6t4x リサンプリングサウンド: http://www.mediafire.com/?x34h7ggk8n9k8z1

4

7 に答える 7

12

両方のサンプル レート (ソースと宛先) がデータの最高周波数を十分に上回っていない限り、線形補間を使用しないでください。これは非常に貧弱なローパス フィルターです。

必要なのは、処理している2つのサンプルレートの半分以下で始まるストップバンドを持つ補間ローパスフィルターです。これを実装する一般的な方法は、IIR フィルターを使用したアップサンプリング/ダウンサンプリング、および多相 FIR フィルターを使用することです。リアルタイムのパフォーマンスが必要なく、アップサンプル/ダウンサンプルしたくない場合は、ウィンドウ化された Sinc 補間器もこれに適しています。これは BasicのWindowed Sinc 補間ローパス フィルターで、C に変換するのは簡単です。

IIR フィルタリングを使用したい場合は、バイクアッド IIR フィルターの標準的なクックブックをご覧ください。

オーディオ リサンプリング理論の最適な説明が必要な場合は、Stanford CCRMA の Resampling pageを参照してください。

于 2010-12-09T05:18:29.043 に答える
10

libsamplerateなどの専用ライブラリを使用することを検討しましたか?

それは非常にポータブルであり、このようなことを正しく行う方法を知っている人々によって開発されています。直接使用しない場合でも、実装するアルゴリズムが非常に興味深い場合があります。

于 2010-12-09T00:15:48.023 に答える
2

私はあなたの実際の意図を推測しているだけですが、いくつかのコメント:

  • 元のサンプルレートの44100倍のレートでアップサンプリングしています。たとえば、入力が10kHzの場合、中間cbuf[]は441MHzになります。これは、ほとんどのオーディオ分析では少し高い値です。44100Hzにしたい場合は、のサンプルごとにサンプルcbuf[]を作成するだけで済みます。44100/OrigSampleRatecbuf[]sampdata[]
  • zアップサンプリングループで2回インクリメントしています。これにより、のすべての奇数要素がcbuf[]元の値になります。これにより、最終的にbuf[]は、ノイズの原因となる可能性のある無効な奇数要素が最終的に含まれるようになると思います。必要な要素数の少なくとも2倍で作成しなかった場合、cbufにバッファオーバーフローが発生する可能性もあります。
  • スティーブが述べたように、線形補間は一般的に最も単純で、アップサンプリング時に良い結果を生み出します。必要に応じて、より複雑なアップサンプリングを実行できます(多項式、スプラインなど)。同様に、ダウンサンプリングするときは、単に切り捨てるのではなく、サンプルを平均化することをお勧めします。
于 2010-12-09T00:16:45.513 に答える
1

私が今まで出会った中で最高のリサンプリング コード: http://shibatch.sourceforge.net/

ソースを取り、そこから何かを学ぼうとします。ひどい状態ですが、そのリサンプラーの結果は他の何よりも優れています。

于 2012-04-04T09:01:06.577 に答える
0

より低いサンプル レートにリサンプリングする前に、元のサンプル レートの 1/2 倍未満のローパス フィルターを適用する必要があります。そうしないと、アーティファクトが発生します。スペクトルは、サンプル レートの 1/2 を超える周波数で折り返されます。したがって、44100 から 11025 にリサンプリングする場合は、11025 または 5500 Hz の 1/2 で 44100 のローパスをフィルタリングする必要があります。これは、帯域幅が狭いほど再現の忠実度が低下するため、-10Db のような最大振幅でこれを行うのが最善です。符号付き 16 ビットの場合、値は 10^(-10/20)*2^(16-1) または最大振幅の 10362 +/- のようになります。これらの古くて基本的なアイデアには知的財産権がないはずなので、正確なアルゴリズムはオンラインで見つかるかもしれません。丸め倍精度浮動小数点を使用せずにすべての計算を行った後、結果を適切な整数値に丸め、一方のセットが他方のセットをインターセプトする正確な時間スケールで補間します。それにはかなりの想像力と記憶力、そして以前の経験が必要であり、数学者の物理プログラマーの領域にあなたを置きます. :-O :-)

于 2014-10-01T04:47:27.287 に答える
0

FFMpeg と avcodec を直接使用します。これを行う方法を示す良い例を次に示します。

http://tdistler.com/projects/audio-resampling-with-ffmpeg

于 2011-04-13T20:20:59.757 に答える