3

厄介な問題を解決するために頭を悩ませています (少なくとも私にとっては)。

(Java を使用して) オーディオ ファイルを再生しているときに、信号の振幅を時間に対して表示したいと考えています。

つまり、一種のオシロスコープ (スペクトル アナライザー) を表示する小さなパネルを実装したいと考えています。オーディオ信号は時間領域で表示する必要があります (縦軸は振幅、横軸は時間です)。

誰もそれを行う方法を知っていますか? 信頼できる良いチュートリアルはありますか? 私はJavaについてほとんど知らないので、誰かが私を助けてくれることを願っています.

アップデート:

基本的に私が欲しいのは、周波数ではなく、時間に対する振幅です。オーディオ信号は時間領域で表示する必要があります (縦軸は振幅、横軸は時間です)。

4

4 に答える 4

3

基本的なアプローチは次のとおりです。

  1. 表示したい音声データを収集します。これは、生のオーディオ サンプルであるか、x 軸のスケーリングを提供するための処理 (たとえば、N 個のサンプル全体の平均化、または N 個ごとのサンプルの取得) の結果である可能性があります。(スケーリングを行わない場合、1 秒間の音声を表示するには 48000 ピクセルが必要です)。

  2. このサンプルの配列が与えられた場合、それを適応時間プロットに変換する必要があります。まず、新しい JPanel を作成し、ペイント メソッドをオーバーライドしてプロットを描画します。

例えば

public void paint(Graphics g)
{
   short[] samples;  // the samples to render - get this from step 1.

   int height = getHeight();
   int middle = height/2;

   for (int i=0; i<samples.length; i++)
   {
      int sample = samples[i];
      int amplitude = sample*middle;
      g.drawLine(i, middle+amplitide, i, middle-amplitude); 
   }  
}

これにより、コンポーネントに振幅-時間グラフが描画されます。コンポーネントと同じ高さで、サンプル数と同じ幅になります。

アニメーションを取得するには、定期的に新しい short[] 配列をコンポーネントにドロップし、repaint() を呼び出します (もちろん、すべて Swing Event スレッドで!)。

幸運を!

于 2010-04-27T18:56:00.127 に答える
1

スペクトラムアナライザは、高速フーリエ変換に基づいています。あなたはそれらをよく読むでしょう。それらは信号を時間領域から周波数領域に変換します。

それで、あなたが望むのは時間ですか、それとも頻度ですか?

于 2010-04-11T20:15:16.947 に答える
0

Fscape- http: //sourceforge.net/projects/fscape/

于 2010-04-11T20:15:43.397 に答える
0

これは、あなたの質問のほとんどに答える非常にクールなチュートリアルです: Digital Signal Processing and Fast Fourier Transform in Java

于 2010-06-11T10:28:15.190 に答える