Java:声音捕获和波形绘图

时间:2014-09-12 17:42:06

标签: java eclipse audio plot signal-processing

目前,我已经基于Richard G. Baldwin在http://www.developer.com/java/other/article.php/1579071/Java-Sound-Getting-Started-Part-2-Capture-Using-Specified-Mixer.htm编写的音频捕获教程在Eclipse中开发了一个Java应用程序

从我所知道的,这很好。

我能够收集数据,并将其存储在ByteOutputStreamObject中。

然后我想获取这些数据并绘制它。

为了绘图,我使用的是SWTChart插件(swtchart.org)。

但是,绘制的所有值都接近0,-256,256。

我的收藏集AudioFormat是:

SampleRate = 8000.0F
SampleSize = 8 bits
Channels = 1
Signed = true
bigEndian = False

我正在通过以下方式转换ByteOutputStream:

ySeries = toDoubleArray(byteArrayOutputStream.toByteArray());

...

public static double[] toDoubleArray(byte[] byteArray){
    int times = Double.SIZE / Byte.SIZE;
    double[] doubles = new double[byteArray.length / times];
    for(int i=0;i<doubles.length;i++){
        doubles[i] = ByteBuffer.wrap(byteArray, i*times, times).getShort();
    }
    return doubles;
}

双重格式是

所需的输入
lineSeries.setYSeries(ySeries);

如果我将上面的方法从getShort更改为getDouble,则生成的数组是双精度但是大约为(+ - )10 ^ 300 - 10 ^ 320。

有人可以帮我理解我需要做什么吗?

1 个答案:

答案 0 :(得分:1)

您的音频格式是8位有符号数据(通常8位音频是无符号的,所以要小心)所以样本的范围是-128到127.我假设你试图将它们重新缩放到-1.0范围内的双精度到1.0。为此,对于每个字节,将每个字节乘以1 / 128.0。请注意,由于不对称性,您无法一直达到1.0。

public static double[] toDoubleArray(byte[] byteArray){
    double[] doubles = new double[byteArray.length];
    for(int i=0;i<doubles.length;i++){
        doubles[i] = byteArray[i]/128.0;
    }
    return doubles;
}