FFTでより低い周波数が強い?


15

マイク入力からFFTを計算しています。低い周波数は常に高い周波数よりもパワーが大きい(dBが高い)ように見えることに気付きます。

  1. データを24576バイト(4096 * 6)のフレームにカットしました。
  2. ハミングウィンドウの適用: input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. FFTWを通してそれを実行しますProcess1D()
  4. 複素数から変換する: output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
  5. 6つの値を平均して、4096バイトの完全なFFTを取得します。
  6. きれいな絵(パレットにマッピングされた色)を塗ります。

平均化(pt。5)は、FFTノイズを低減するために行われます。

画像は、音とマイクをオフにした状態で表示されるため、低周波数ではより多くのエネルギー(およびノイズ)が発生します。これは、マイク/サブの問題だけではないことを示しています。

私の質問:
1.これは予想されますか?どうして?
2.これを修正する標準的な方法はありますか?いくつかのMath.Tan()マジックが、それが属する場所を持ち上げることができるように見えます。

私の目標は、デフォルトで低い周波数が勝つことなく、上位5つの周波数を識別できるようにすることです。

FFT


最初に正しいハミングウィンドウを試して、壊れたウィンドウフラグメントがこの低周波ノイズの原因であるかどうかを確認してください。
hotpaw2

@Tedd Hansen、どうやって「低い周波数なしでトップ5の周波数を特定する」ことになりましたか?重み付き1/3オクターブバンドのトップ5ですか?
デニス

回答:


12

はい、これは非常に期待されています。表示されるのは、「ピンク」のスペクトル、つまり絶対帯域幅ごとの一定のエネルギーである「」と比較して、相対帯域幅ごとの一定のエネルギーです。ピンク信号の場合、1〜2kHzのエネルギーは2〜4kHzのエネルギーと同じです(それぞれが帯域幅の2倍または「オクターブ」を表します。

ほとんどの自然な音声信号(音声、音楽、映画など)はピンクのようなスペクトルを持っています。また、ほとんどの音響バックグラウンドノイズ(マイクノイズ、HVACノイズ、気圧変動、一般的なバックグラウンド)は、ピンク色であるか、より低い周波数に偏っています。

人間の聴覚システムも同様に機能します。内耳では、オーディオ信号は、3番目のオクターブスペクトルとほぼ同じ一定の相対帯域幅(「クリティカルバンド」と呼ばれる)の帯域に分割されます。

オーディオスペクトルデータを調べる最良の方法は、対数周波数スケールでプロットすることです。


「自然なオーディオ信号はピンクのようなスペクトルを持っている」という声明では、時間スケールの考慮が省略されています。長い時間(約10秒)にわたって、私は同意します。確かに数分にわたって、その主張は真実である傾向があります。ただし、ここでのスペクトルは0.55秒にわたって計算されています。入力が音楽などの場合は、はるかに音色の構造が期待されます。
mtrw

2
「調性」は、スペクトルの微細構造により影響を与えます。(オクターブあたりのエネルギー的に)全体の形状は、まだ「三角形とクラッシュシンバルのためのソロ」のようなそれの何かしない限り、音楽のための大部分がピンクになります
ヒルマー

1
@mtrw:方形波は確かにトーンですが、高周波高調波は1 / fレートで減衰します。
エンドリス

8

ステップ2では、式はである必要がありますinput[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));。ここNで、はバッファ内のサンプルの数です24576

ステップ4と5では、dB値ではなく、2乗の振幅値でビンごとの平均化を行います。あなたが二乗した大きさを持っているとしましょう[4,6]。彼らの平均は510*log10(5) ~= 6.99です。平均値10*log10(4)10*log10(6)です6.90

最初の問題は、スペクトル漏れの原因となる低周波数へのバイアスの原因である可能性があり、低周波数はDCラインからより多くの汚染を取得します(必然的に悪い推定です)。2番目の問題は、おそらく低周波数で違いを生むことはないでしょうが、私はあなたの測定の意図に近づくと思います。


fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]4610ログ10510ログ104+10ログ106/2

上記の説明では、適用されるFFTの幅であるため、4096のウィンドウ幅(N)が必要であると考えています。このウィンドウは、各fftの前に変換される4096サンプルに適用する必要があります。
ジェイコブ

@Jacob-OPは6 * 4096ポイントのFFTを計算してから、隣接する6つのビンを平均して4096ポイントに減らします。
mtrw

5

1 / fノイズは、多くの物理的、生物学的、経済的なシステムで発生します。一部の研究者は、それを遍在していると説明しています。

ピンクと白のノイズ

線形周波数の縦軸を持つFFTスペクトログラムのピンクノイズ(左)およびホワイトノイズ(右)(一般的なオーディオまたは同様のスペクトルアナライザーでは、ピンクノイズは下向きではなくフラットであり、ホワイトノイズは上昇します)


6
左側のノイズは間違いなくピンク色ですが、右側のノイズは少しオレンジ色に見えます:

1 / fノイズはいたるところにあるのは事実ですが、オーディオ用に適切に設計されたアナログフロントエンドは、一般に10 Hz以上の1 / fノイズの低レベルを持っています。目的の帯域ではホワイトノイズが支配的です。
mtrw

4

これは予想されますか?どうして?

多くの自然な音は倍音を持っているため、基本周波数が低くなり、基本周波数の倍数でエネルギーが少なくなります。左端に多くのエネルギーを意味するDCバイアスがあるかもしれません。別の影響として、周波数応答を歪ませるウィンドウ関数があります。

これを修正する標準的な方法はありますか?いくつかのMath.Tan()マジックが、それが属する場所を持ち上げることができるように見えます。

ハイパスフィルターを使用して、DCバイアスに対処できます。単純な実装では、すべてのサンプルから長期平均を減算します(編集:またはさらに単純な場合、FFT結果から50Hz未満などの低周波を破棄します)。さまざまなウィンドウ関数を試すこともできます。(@mtrwが指摘するように)ウィンドウを適切に適用していることを確認してください。応答のその他の非線形性は、何らかの理想的な入力を測定し、その曲線に正規化することで修正できます。


ウィンドウ関数は、周波数応答に影響を与えるべきではありませんか?
エンドリス

@endolith:それは、データにウィンドウ関数を掛けると、結合された関数の応答が異なります。詳細については、リンクされているウィキペディアの記事をご覧ください。実世界のサンプルを扱う現実は、通常、ウィンドウ(たとえば、長方形)があり、そのために(無限の)ソース信号の周波数応答のみを近似できるということです。
ガイサートン

おそらく、「周波数応答」を別の方法で考えています。信号が静止している場合、ウィンドウ関数を適用すると、使用するウィンドウ関数に関係なく、スペクトルは同じ周波数で同じ振幅になり、すべての周波数に等しく影響するスケールファクターだけが異なります。各周波数スパイクの幅は異なりますが、スパイクの高さは互いに同じになります。ウィンドウ関数は、一部の周波数を他の周波数よりも減衰させるフィルターのようには機能しません。
エンドリス

@endolith:無限の正弦波を想像してください。今ではcos ^ 2ウィンドウを掛けます。元の周波数の成分は引き続きありますが、その振幅は「オフ」になり、ウィンドウから新しい周波数成分が得られます。最初の段落を参照してください:en.wikipedia.org/wiki/Spectral_leakage
ガイサートン

はい、ただし、「オフ」振幅は、無限正弦波の周波数に関係なく同じになります。
エンドリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.