3

为了解决一个棘手的问题(至少对我而言),我绞尽脑汁。

在播放音频文件(使用 Java)时,我希望根据时间显示信号幅度。

我的意思是我想实现一个显示某种示波器(频谱分析仪)的小面板。应该在时域中查看音频信号(纵轴是幅度,横轴是时间)。

有谁知道该怎么做?有没有我可以依赖的好教程?由于我对Java知之甚少,希望有人能帮助我。

更新:

基本上我想要的是幅度与时间的关系,而不是频率。应该在时域中查看音频信号(纵轴是幅度,横轴是时间)。

4

4 回答 4

3

基本方法是这样的:

  1. 收集您想要显示的音频数据。这可能是原始音频样本,也可能是处理的结果(例如,对 N 个样本进行平均,或每第 N 个样本取一个)以提供 x 轴上的缩放。(如果没有缩放,您将需要 48000 像素来显示 1 秒的音频。)

  2. 给定这组样本,您必须将其转换为振幅时间图。首先,您可以创建一个新的 JPanel 并覆盖 paint 方法来绘制绘图。

例如

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 事件线程上!)。

祝你好运!

于 2010-04-27T18:56:00.127 回答
1

频谱分析仪基于快速傅里叶变换。你会很好地阅读这些。它们将信号从时域转换到频域。

那么你想要的是时间还是频率?

于 2010-04-11T20:15:16.947 回答
0

这是一个非常酷的教程,可以回答您的大部分问题: Java 中的数字信号处理和快速傅里叶变换

于 2010-06-11T10:28:15.190 回答
0

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

于 2010-04-11T20:15:43.397 回答