【问题标题】:Signal amplitude against time in JavaJava中信号幅度与时间的关系
【发布时间】:2010-04-11 20:09:46
【问题描述】:

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

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

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

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

更新:

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

【问题讨论】:

  • 在频谱分析仪中,横轴是频率,而不是时间
  • 如果您想要 "vertical axis:amplitude""horizo​​ntal axis: time" 就像您的问题中所述,那么您只需在时间 t 并且你有你的振幅。例如,如果您有一个 44 kHz、16 位的单声道 .wav 文件,那么索引 [44000] 处的 16 位 是时间 “1 秒” 处的幅度。通常,此类幅度/时间图显示几秒钟(甚至整个样本),并使用一个移动的垂直突出显示条来显示“音频文件所在的位置”(在那里,完成了)。这是你想要的吗?或者你需要一个FFT? (上个世纪在 Java 中去过那里,也做过;)

标签: java audio signals spectrum


【解决方案1】:

基本做法是这样的:

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

祝你好运!

【讨论】:

    【解决方案2】:

    频谱分析仪基于Fast Fourier Transforms。你会很好地阅读这些。它们将信号从时域转换到频域。

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        这是一个非常酷的教程,可以回答您的大部分问题: Digital Signal Processing and Fast Fourier Transform in Java

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          • 2013-02-02
          • 1970-01-01
          • 2014-04-24
          • 2013-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多