FFTまたはDFTを使用してオーディオをリサンプリングする方法


12

最初にFFTを実行し、次に必要な結果の部分のみを取得してから、逆FFTを実行することにより、音声オーディオをダウンサンプリングしています。ただし、32768から8192へのダウンサンプリングなど、2の累乗の周波数を使用している場合にのみ正しく機能します。32kデータに対してFFTを実行し、データの上位3/4を破棄してから、残りの1/4の逆FFT。

ただし、正しく整列しないデータを使用してこれを実行しようとすると、次の2つのいずれかが発生します。私の(Aforge.Math)を使用している数学ライブラリは、フィットがスローされます。これは、サンプルが2の累乗ではないためです。サンプルを2の累乗になるようにゼロ埋めしようとすると、反対側で意味不明になってしまいます。代わりにDFTも使用しようとしましたが、非常に遅くなります(これはリアルタイムで行う必要があります)。

最初のFFTと最後の逆FFTの両方で、FFTデータを適切にゼロパッドするにはどうすればよいですか?16khzに到達する必要がある44.1khzのサンプルがあると仮定して、私は現在、このようなものを試します。サンプルのサイズは1000です。

  1. 入力データを最後に1024に埋め込む
  2. FFTを実行する
  3. 最初の512アイテムを配列に読み込みます(最初の362だけが必要ですが、^ 2が必要です)
  4. 逆FFTを実行する
  5. 最初の362項目をオーディオ再生バッファーに読み込みます

これで、最後にゴミが出ます。同じことを行いますが、サンプルが既に^ 2であるため、ステップ1と3でパディングする必要はなく、正しい結果が得られます。

c#  audio 

9
FFTはこれを行う正しい方法ではありません。効率を最大にするためにポリフェーズフィルターバンクが必要ですが、問題を解決するだけの場合は、最初にGCDにアップサンプリングし、次にローパス、次にダウンサンプリングします。
ビョルンロシュ

こんにちはビョルン:「GCD」とは何ですか?
SpeedCoder5 2013

回答:


16

最初のステップは、開始サンプルレートとターゲットサンプルレートの両方が有理数であることを確認することです。それらは整数なので、自動的に有理数になります。それらの1つが有理数でない場合でも、サンプルレートを変更することは可能ですが、プロセスは大きく異なり、より困難です。

2225272275272255

データをリサンプリングする方法に関係なく、前の手順を実行する必要があります。次に、FFTでそれを行う方法について話しましょう。FFTでリサンプリングするコツは、すべてがうまく機能するFFTの長さを選択することです。つまり、デシメーションレート(この場合は441)の倍数であるFFT長を選択します。例として、FFTの長さとして441を選択しますが、882、1323、または441の他の正の倍数を選択することもできます。

これがどのように機能するかを理解するには、それを視覚化することが役立ちます。まず、周波数領域で次の図のようなオーディオ信号から始めます。 44.1 kHzサンプルレート

処理が完了したら、サンプルレートを16 kHzに下げたいが、歪みはできるだけ少なくしたい。つまり、上の画像の-8 kHzから+8 kHzまでをすべて維持し、それ以外のものをすべてドロップするだけです。その結果、次の図のようになります。 ここに画像の説明を入力してください

サンプルレートは縮尺どおりではなく、概念を説明するためだけにあることに注意してください。

255

ご想像のとおり、いくつかの潜在的な問題があります。それぞれについて説明し、それらをどのように克服できるかを説明します。

  1. データが間引き係数の適切な倍数でない場合はどうしますか?データの終わりに十分なゼロを埋めて、間引き係数の倍数にすることで、これを簡単に克服できます。データはFFTされる前にパディングされます。

  2. ll1ゼロ(データサンプルの数とパディングサンプルの数の両方がデシメーションファクターの正の倍数でなければならないことに注意してください-この制約を満たすためにパディングの長さを増やすことができます)、パディングされたデータのFFT、周波数ドメインの乗算データとフィルター処理を行ってから、高周波数(> 8 kHz)結果を低周波数(<8 kHz)結果にエイリアスしてから、高周波数結果をドロップします。残念ながら、周波数ドメインでのフィルタリングはそれ自体大きなトピックであるため、この回答ではこれ以上詳しく説明することはできません。ただし、フィルター処理して複数のチャンクでデータを処理している場合は、フィルターを連続させるために、Overlap-and-AddまたはOverlap-and-Saveを実装する必要があると言います

これがお役に立てば幸いです。

編集:周波数ドメインサンプルの開始数と目標の周波数ドメインサンプル数の差は、結果の負側と同じ数のサンプルを結果の正側から削除できるようにする必要があります。この例の場合、サンプルの開始数は間引き率、つまり441であり、ターゲットサンプル数は補間率、つまり160でした。差は279であり、均一ではありません。解決策は、FFTの長さを2倍の882にすることです。これにより、サンプルのターゲット数も2倍の320になります。これで差が均一になり、問題なく適切な周波数領域サンプルをドロップできます。


非常に素晴らしい。ジム、オンザフライでいいフィギュアをどうやって作っているの?
スペイシー

@Mohammad私は通常Powerpointを使用します。この場合、PowerpointのLibre Officeバージョンを使用しました。これは「Impress」と呼ばれていると思います。
Jim Clay

こんにちは、私はあなたのポイント(2)について質問があります。このステップの正確な意味は次のとおりです。「...そして、高周波数(> 8 kHz)結果を低周波数(<8 kHz)結果にエイリアスしてから、高周波数結果をドロップします。」その前の手順は理解できました。私のfドメインデータにフィルターのfドメインを掛けると、どうなるのでしょうか。また、この方法は、データもアップサンプリングしたい場合に機能しますか?ありがとうございました。
TheGrapeBeyond 2014年

@TheGrapeBeyond時間ドメインでエイリアスを設定すると、すべてのナイキストゾーンが一緒に追加されます。すべてのナイキストゾーンの最初の要素が一緒に追加され、最初のナイキストゾーンの新しい最初の要素になります。すべてのナイキスト領域の第二の要素が一緒に追加されますと、最初のナイキストゾーンなどの新しい第二の要素になって
ジム・クレイ

うーん、FFTベースのリサンプリングをどのように行っているのか私にはわかりません。ここで試してみると、非常に奇妙な結果が得られるからです。質問させていただきます。
TheGrapeBeyond 2014年

3

上記の答えは本当に完全ですが:

その要点は次のとおりです。

  1. 信号をダウンサンプリングするには、整数である必要があります。信号のダウンサンプリングの前に、信号をフィルタリングする必要があります。
  2. 最初に信号をアップサンプリング/補間することにより、有理数のダウンサンプリングを達成できます。
  3. アップサンプリングは、単にゼロを挿入してから信号をフィルタリングすることです。
  4. 3/4のサンプルレートを達成するために。すべての信号サンプルの間に4つのゼロを挿入して、信号をアップサンプリングします。フィルターを適用します。次に、信号をフィルタリングし、4つの信号サンプルのうち3つおきに削除します。

この詳細:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

また、どうしても必要な場合を除いて、FFTをコンピューター処理してIFFTを計算しないでください。その信じられないほど遅いプロセスと、ほとんどの信号処理タスクには不適切と考えられています。FFTは通常、問題を分析するため、または周波数領域でのみ信号処理を適用するために使用されます。


1

ビョルンロッシュが言っていたように、これにFFTを使用することはひどく非効率的です。しかし、ここでは、周波数領域でのアップサンプルフィルターとダウンサンプルの方法を使用して、非常に単純な方法で行っています。

1-長さNの目的のベクトル信号を取得します。

2-NポイントFFTを実行します。

3-FFTベクトルの中央に160 * NのゼロでFFTをゼロ埋めします。

4-IFFTを実行する

5-441サンプルから1つを選択し、他の440を破棄します。

長さN * 160/441のベクトルが残り、これがリサンプリングされた信号になります。

ご覧のように、結果のほとんどが破棄されるため、多くの無意味な計算を行っています。ただし、FFTを実行するコードにアクセスできる場合は、実際に少し調整して、最終的に得られるIFFT結果のみを計算し、捨てる結果は計算しないようにすることができます。

それが役に立てば幸い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.