目前,我已经基于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。
有人可以帮我理解我需要做什么吗?
答案 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;
}