为了解决一个棘手的问题(至少对我而言),我绞尽脑汁。
在播放音频文件(使用 Java)时,我希望根据时间显示信号幅度。
我的意思是我想实现一个显示某种示波器(频谱分析仪)的小面板。应该在时域中查看音频信号(纵轴是幅度,横轴是时间)。
有谁知道该怎么做?有没有我可以依赖的好教程?由于我对Java知之甚少,希望有人能帮助我。
更新:
基本上我想要的是幅度与时间的关系,而不是频率。应该在时域中查看音频信号(纵轴是幅度,横轴是时间)。
基本方法是这样的:
收集您想要显示的音频数据。这可能是原始音频样本,也可能是处理的结果(例如,对 N 个样本进行平均,或每第 N 个样本取一个)以提供 x 轴上的缩放。(如果没有缩放,您将需要 48000 像素来显示 1 秒的音频。)
给定这组样本,您必须将其转换为振幅时间图。首先,您可以创建一个新的 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 事件线程上!)。
祝你好运!
频谱分析仪基于快速傅里叶变换。你会很好地阅读这些。它们将信号从时域转换到频域。
那么你想要的是时间还是频率?
这是一个非常酷的教程,可以回答您的大部分问题: Java 中的数字信号处理和快速傅里叶变换