请问,请(用语言)向我解释这段代码的作用? 谢谢
我的担忧实际上是这两部分: 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();
答案 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位录音,你将在波形面板上看不到任何东西。