質問

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

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

役に立ちましたか?

解決

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

あなたが望むのは、あなたが扱っている2つのサンプルレートの半分以下で開始するストップバンドが始まる補間ローパスフィルターです。これを実装する一般的な方法は、IIRフィルターを使用したアップサンプリング/ダウンサンプリング、およびポリフェーズFIRフィルターを使用することです。リアルタイムのパフォーマンスが必要でなく、アップサンプル/ダウンサンプルをしたくない場合、窓のあるSINCインタープロレーターもこれに適しています。これが次のとおりです 基本的な窓付きSINC補間ローパスフィルター, 、それはCに変換するのは些細なことでなければなりません

IIRフィルタリングを使用したい場合は、ここに標準的なものがあります Biquad IIRフィルター用の料理本.

オーディオリサンプリング理論の最良の説明が必要な場合は、 スタンフォードCCRMAの再サンプリングページ.

他のヒント

これには、専門のライブラリを使用することを検討しましたか、 libsamplerate?

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

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

  • あなたはレートでアップサンプリングしています 44100回 元のサンプルレート。たとえば、入力が10kHzの場合は中級 cbuf[] ほとんどのオーディオ分析では少し高い高さである441MHzになります。あなたが望むと仮定します cbuf[] 44100Hzになるには、作成するだけです 44100/OrigSampleRate のサンプルの cbuf[] サンプルごと sampdata[].
  • あなたは増加しています z アップサンプリングループで2回。これにより、すべての奇妙な要素が生じます cbuf[] 元の値を持つこと。これは最終的にファイナルにつながると思います buf[] ノイズの原因となる可能性のある奇妙な要素が無効になっています。また、必要な要素の少なくとも2倍の数で作成しなかった場合、CBUFにはバッファオーバーフローの可能性があります。
  • Steveが述べたように、線形補間は一般に、アップサンプリング時に良い結果をもたらす最も単純なものです。必要に応じて、より複雑なアップサンプリングを行うことができます(多項式、スプラインなど)。同様に、ダウンサンプリングの場合、単に切り捨てられるのではなく、平均サンプルを希望する場合があります。

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

ソースを取り、そこから何かを学んでみてください。それは厄介な状態ですが、その再サンプラーの結果は他のすべてをはるかに上回っています。

ffmpegとavcodecを直接使用します。これがこれを行う方法を示す良い例です。

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

低いサンプルレートにリゾートする前に、低パスフィルターはサンプルレートの1/2倍未満のオリジナルをフィルターする必要があります。そうしないと、Alizingアーティファクトが導入されます。スペクトルは、サンプルレートの1/2を超える周波数に対してそれ自体に折り返されます。したがって、44100から11025にリサンプしたい場合は、11025の1/2または5500 Hzで44100ローパッサをフィルタリングする必要があります。これは、帯域幅の低い帯域幅で最善を尽くすため、-10dBのような最大振幅でこれを行う必要があります。 16ビットの場合、値は10^(-10/20)*2^(16-1)または最大振幅の場合は10362 +/-のようなものです。これらの古い基本的なアイデアには知的権利がないはずなので、正確なアルゴリズムはオンラインで見つけるかもしれません。丸めの二重精度の浮動小数点なしですべての計算を行った後、結果を適切な整数値に丸め、一方のセットが他のセットが傍受する場所でタイムスケールで補間します。それはかなりの想像力と記憶、そして以前の経験を必要とし、その後、数学の物理学プログラマーの領域にあなたを置きます。 :-o :-)

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