波形代码.. ..我确实需要帮助...请

时间:2010-07-08 08:57:02

标签: java

请问,请(用语言)向我解释这段代码的作用? 谢谢

我的担忧实际上是这两部分: 1)

double y_new = (double) (h * (128 - my_byte) / 256);
lines.add(new Line2D.Double(x, y_last, x, y_new));
y_last = y_new;

2)for循环,我不理解......    什么是32768?    my_byte?

        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);

这是代码。它取自这里: http://www.koders.com/java/fid3508156A13C80A263E7CE65C4C9D6F5D8651AF5D.aspx?s=%22David+Anderson%22 (类抽样图)

        int frames_per_pixel = audioBytes.size() / format.getFrameSize() / w;
        byte my_byte = 0;
        double y_last = 0;
        int numChannels = format.getChannels();
        for (double x = 0; x < w && audioData != null; x++) {
        // scegli quale byte visualizzare
        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);
        }

        double y_new = (double) (h * (128 - my_byte) / 256);
        lines.add(new Line2D.Double(x, y_last, x, y_new));
        y_last = y_new;
        }

        repaint();

3 个答案:

答案 0 :(得分:0)

不知道是否有帮助,但

128 * someInt / 32768

相同
someInt << 7 >> 15

答案 1 :(得分:0)

您应该首先了解声音文件的组织方式。但无论如何..

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位样本,则必须从屏幕的2个字节创建整数(16位,Java中为32bin)。在此示例中,它们仅适用于8位样本数据,因此,如果此示例读取16位声音文件,则会将样本值转换为此行中的8位:

 my_byte = (byte) (128 * audioData[idx] / 32768);

所以我的字节保存了帧“idx”的样本值。

答案 2 :(得分:0)

double y_new = (double) (h * (128 - my_byte) / 256);

这行代码是在'windows'上绘制字节序列的方法的一部分(矩形,坐标系,如你所愿)

h       := the height of the drawable area in pixel
my_byte := a byte [-128,127] (a 8 bit sample from an audio file?)

(128 - my_byte)会将输入[-128,127]转换为[256, 1]。除以256将此范围转换为[1, 1/256]并乘以高度h得到[-128,127] - &gt;的预期映射。 [~0,h]

以下行用于从表示前一个字节的点到实际点绘制一条线。然后,实际点将成为下一次迭代的前一个点。


my_byte = (byte) (128 * audioData[idx] / 32768);

如果样本大小为16Bit,则执行此行代码。但是我们需要一个仅用于绘图的8Bit值。 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

老实说,我不知道为什么作者不只是一次除以256,这应该给出相同的结果。

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