1

先生が教えてくれた概念を理解するのに苦労しており、クラスメートの間でかなり一貫性のない答えが得られます. 誰かがこのアイデアやコンセプトを明確にするのを手伝ってくれるかどうか疑問に思っていましたか?

これは、オーディオ処理における num チャンキングとして知られています。WAVファイルのみを扱う必要があります。したがって、音声データは圧縮されていないと仮定します。

numChunking は、オーディオ正弦波のフーリエ変換に関係しています。

numChunks の数を決定するには、次のようにします。

方法 1:

int numChunks = totalNumOfSamples/chunkSize

しかし、私が話した他のほとんどの人も言っていました

方法 2:

int numChunks = totalNumOfSamples/binSize

違いは、chunkSizeが 1024 や 2000 などで指定またはハードコードされた数値にすぎないことです。一方、 binSizeは、サンプルにフーリエ変換を適用した後に描画する周波数の数です。通常、描画するビン (パネル上のバー/頻度バー) の数は、画面に表示するのに約 50 ~ 100 であり、それには永遠に時間がかかります。

方法 1 では、たとえば 47988 サンプル / 2000 = 23 numChunks のような数の numchunks を取得します。次に、これらのチャンクを for ループに送り、サウンド データの各サンプルを各チャンクに追加します。したがって、23 個の numChunks をすべてまとめると、対応できないために精度がいくらか失われますが、ほぼすべてのサウンド データが得られます。分割からのすべてのサンプル。次に、それらを配列または ArrayList に追加して、後で離散フーリエ変換 (フォワード フーリエ関数) に送信し、結果を取得してビンに配置し、結果をバーとしてプロット/描画します。

よくわからない最後の詳細は、フーリエ変換がサウンド全体の TOTAL サンプルで除算するのか、numChunk 内のサンプルの TOTAL # だけで除算するのかということです。

方法 2 では、numChunks = 合計サンプル数 / binSize が機能します。たとえば、同じ例を使用します。47988/30bins = 1599 numChunks. この考えでは、クラスメートが numChunks は多数の subArray であると説明してくれました。そこで、2D 配列を作成しました。各配列は、binSize の長さを持つ 1599 配列です。したがって、各 subArray を順方向フーリエ変換で処理すると、結果の振幅値または周波数が得られます。次に、値を TOTAL サンプルで除算する順方向フーリエを通して各 subArray を実行します。音全体の大きさ。

両方のアイデアの結果は不規則に異なります。方法 1 では最初の値が約 37.5 になり、方法 2 では値として 3689 が得られます。次の値はすべて一般的に正しいように見えるため、どの方法が正しいか、または正しい方法があるかどうかはわかりません。

これはJavaでコーディングされています

この質問は非常に紛らわしいです。私自身が非常に困惑していることがわかります。誰かが正しいか間違っているかを明確にするか、概念を説明するのを手伝ってくれることを願っています.

4

1 に答える 1

1

うわー、あなたは少し混乱しています。少しでも説明できるように、最善を尽くします。

DFT (離散フーリエ変換) で行っていることは、多数のサンプル N を取得し、それらを時間領域から周波数領域に変換することです。周波数領域で取得した配列のサイズは、時間領域で配置した配列と同じサイズです。したがって、周波数解像度は sampleRate/numChunks になるため、出力配列に必要な周波数解像度に応じて、numChunks を任意の値に設定できます。したがって、たとえば 80 個の周波数値が必要な場合は、80 のチャンク サイズを使用します。サウンド ファイルを totalNumSamples/80 チャンクに分割すると、各チャンクの周波数コンテンツが順番に取得されます。

他の質問に答えるために、サウンド全体のサンプルの総数は重要ではありません。実行する各 DFT は完全に独立しているため、重要なのは各 DFT に入れられたサンプルの数だけです。

それが少し役立つことを願っています。

于 2012-12-01T11:07:58.977 に答える