Java 波形代码。。我确实需要帮助…请

Java 波形代码。。我确实需要帮助…请,java,Java,你能给我解释一下(用文字)这个代码的作用吗? 多谢各位 我关注的其实是这两个方面: (一) 2) 对于循环,我不明白。。。 32768是多少? 我的字节 int numChannels = format.getChannels(); for (double x = 0; x < w && audioData != null; x++) { int idx = (int) (frames_per_pixel * numChan

你能给我解释一下(用文字)这个代码的作用吗? 多谢各位

我关注的其实是这两个方面: (一)

2) 对于循环,我不明白。。。 32768是多少? 我的字节

        int numChannels = format.getChannels();
        for (double x = 0; x < w && audioData != null; x++) {

        int idx = (int) (frames_per_pixel * numChannels * x);
        // se a 8 bit è immediato
        if (format.getSampleSizeInBits() == 8) {
            my_byte = (byte) audioData[idx];
        } else {
            my_byte = (byte) (128 * audioData[idx] / 32768);
int numChannels=format.getChannels();
对于(双x=0;x
这是代码。它取自这里: (类别抽样图)

int frames\u per\u pixel=audioBytes.size()/format.getFrameSize()/w;
字节my_字节=0;
双y_last=0;
int numChannels=format.getChannels();
对于(双x=0;x
不知道这是否有帮助,但是

128 * someInt / 32768

someInt << 7 >> 15
someInt>15

你首先应该了解声音文件是如何组织的。但是无论如何

double y_new = (double) (h * (128 - my_byte) / 256);
        lines.add(new Line2D.Double(x, y_last, x, y_new));
        y_last = y_new;
本例绘制的线的Y位置代表声音文件的样本值。正如您可能知道的,一个样本可以是8/16/32…位。在本例中,它们将所有位值缩放到8(1字节)。ne Y的中心将位于屏幕中间位置(它是有符号的声音文件).h是屏幕的高度,我们希望将其缩放为127是屏幕顶部,而-127是屏幕下部的像素

2) 32768是有符号16位整数的最大值。因此,16位声音文件的最大样本值。myByte:声音文件保存为字节流。因此,如果使用16位样本,则必须创建整数(Java中的16位,32bin)从屏幕上的2个字节。在本例中,它们仅适用于8位样本数据,因此,如果本例读取16位声音文件,则将样本值转换为此行中的8位:

 my_byte = (byte) (128 * audioData[idx] / 32768);
因此,我的字节保存帧“idx”的样本值

这行代码是在“窗口”(矩形、坐标系,如您所愿)上绘制字节序列的方法的一部分

(128-my_byte)
将输入的
[-128127]
转换为
[256,1]
。除以256将此范围转换为
[1,1/256]
,并乘以高度
h
得到
[-128127]
->
[~0,h]

以下to行用于从表示上一字节的点到实际点绘制一条线。实际点将成为下一次迭代的上一点


如果样本大小为16位,则执行这行代码。但是我们需要一个8位的值用于绘图。Java中的
int
为32位,我们有一个16位样本,因此上16位为0,下16位存储音频样本值。算法现在将值向左移动7位,然后向右移动15位:

   00000000 00000000 11111111 11111111 
-> 00000000 01111111 11111111 10000000  // * 128,   << 7
-> 00000000 00000000 00000000 11111111  // : 32768, >> 15
00000000000000111111111111
-> 00000000 01111111 11111111 10000000  // * 128,    00000000 00000000 00000000 11111111  // : 32768, >> 15
老实说,我不知道为什么作者不只是除以256一次,结果应该是一样的


但无论如何,结果是一个字节,代表样本的八个最高有效位。顺便说一句,这是非常不准确的,因为如果你有一个非常安静的16位录音,你将在波形面板上看不到任何内容。

你能用一个更有意义的标题编辑你的问题吗?谢谢。
 my_byte = (byte) (128 * audioData[idx] / 32768);
double y_new = (double) (h * (128 - my_byte) / 256);
h       := the height of the drawable area in pixel
my_byte := a byte [-128,127] (a 8 bit sample from an audio file?)
my_byte = (byte) (128 * audioData[idx] / 32768);
   00000000 00000000 11111111 11111111 
-> 00000000 01111111 11111111 10000000  // * 128,   << 7
-> 00000000 00000000 00000000 11111111  // : 32768, >> 15