Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android的浮点到双精度转换_Java_Android_Floating Point_Double_Fft - Fatal编程技术网

Java android的浮点到双精度转换

Java android的浮点到双精度转换,java,android,floating-point,double,fft,Java,Android,Floating Point,Double,Fft,好的,这应该很简单。。。但我还是不明白。我正在为Android编写一个java程序,用于对浮点数组进行fft。在返回的复频谱上,我提取实部和虚部,以便计算一些参数,如幅值和相位。问题是我使用的libgdx fft变换使用float,但是大多数数学类操作使用double。这意味着我需要将float转换为double。 它在fft的实部上似乎工作得很好,但是,对于虚部,我得到精度误差,或者更确切地说,对于一个频率单元,我得到一个45.188522的虚部浮点值,但是,当我转换为双倍时,它变为-45.1

好的,这应该很简单。。。但我还是不明白。我正在为Android编写一个java程序,用于对浮点数组进行fft。在返回的复频谱上,我提取实部和虚部,以便计算一些参数,如幅值和相位。问题是我使用的libgdx fft变换使用float,但是大多数数学类操作使用double。这意味着我需要将float转换为double。 它在fft的实部上似乎工作得很好,但是,对于虚部,我得到精度误差,或者更确切地说,对于一个频率单元,我得到一个45.188522的虚部浮点值,但是,当我转换为双倍时,它变为-45.188522

   fft.forward(array);
   fft_cpx=fft.getSpectrum();
   tmpi = fft.getImaginaryPart();
   tmpr = fft.getRealPart();
   for(int i=0;i<array.length/2;i++)
   {
       real[i] = (double) tmpr[i];
       imag[i] = (double) tmpi[i];  // THIS CONVERSION
       mag[i] = (float)Math.sqrt((real[i]*real[i]) + (imag[i]*imag[i]));
       phase[i] = (float) ((float) Math.atan2(imag[i], real[i]));
   }
但所有返回的都是-45.18852,而不是45.18852

^^^^^原件^^^^^

更多详情:

下面是我的src代码和对我感兴趣的人的用法

好的,我正在使用Ubuntu10.10和EclipseJDK,版本:HeliosServiceRelease2 Android SDK:最新的r10。 我是为android 1.6,API级别4编译的。 我使用libgdx进行fft,您可以在这里获得它,并确保将gdx.jar添加到libs中,并添加到构建路径库中。如果您为android 1.6创建了一个具有相同或新活动的新项目,请设置一个AVD,我设置的AVD具有以下完整性支持:

SD Card yes
Accellerometer yes
DPas Support yes
Abstracted LCD Density 240
Audio Playback Support yes 
Max VM Application heap size 24
camera support no
Touch Screen support yes
这是我的src代码:

package com.spec.example;
import android.app.Activity;
import android.os.Bundle;
import com.badlogic.gdx.audio.analysis.FFT;
import java.lang.String;
import android.util.FloatMath;
import android.widget.TextView;

public class spectrogram extends Activity {
/** Called when the activity is first created. */
float[] array = {1, 6, 1, 4, 5, 0, 8, 7, 8, 6, 1,0, 5 ,6, 1,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
float[] array_hat,res=new float[array.length/2];
float[] fft_cpx,tmpr,tmpi,mod_spec =new float[array.length/2];
float[] real_mod = new float[array.length], imag_mod = new float[array.length];
double[] real = new double[array.length], imag= new double[array.length];
double[] mag = new double[array.length] ,phase = new double[array.length];
int n;
float tmp_val;
String strings;
FFT fft = new FFT(32, 8000);
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);

   fft.forward(array);
   fft_cpx=fft.getSpectrum();
   tmpi = fft.getImaginaryPart();
   tmpr = fft.getRealPart();
   for(int i=0;i<array.length;i++)
   {
       real[i] = (double) tmpr[i];   // This works well
       imag[i] = (double) tmpi[i];  // However this is creates a problem
       //mag[i] = FloatMath.sqrt((tmpr[i]*tmpr[i]) + (tmpi[i]*tmpi[i]));   //using FloatMath android class (works fine)
       mag[i] = Math.sqrt((real[i]*real[i]) + (imag[i]*imag[i]));
       phase[i]=Math.atan2(imag[i],real[i]);

       /****Reconstruction****/        
       real_mod[i] = (float) (mag[i] * Math.cos(phase[i]));
       imag_mod[i] = (float) (mag[i] * Math.sin(phase[i]));

   }

   fft.inverse(real_mod,tmpi,res);// inverse fft to reconstruct original array if input = output It works as it is, however it is using the input imaginary, not imag_mod
   strings=String.valueOf(tmpi[1]); // Just printing the second imaginary element Calculated using: |X|e^(j*phaseofX) = |X|(cos(X) + jsin(X))
   //strings=String.valueOf(imag_mod[1]); // Just printing the second imaginary element (Original returned from fft.getImaginary())
    //this ^^ is the one which returns a -ve (Uncomment to test)
   tv.setText(strings);
   setContentView(tv);

    }
  }
我不熟悉android开发和java,所以如果答案很明显或者我的语法很奇怪,请耐心等待。希望有人能解决这个问题

可能想尝试Double.parseDoublenew-Stringtmpr[i]而不是隐式强制转换:这应该不会有什么区别,但我见过类似于浮动的奇怪事情。

@digipd

这不是答案。。。我很谦虚地试图证明Java环境将从float转换到double,或将从double转换到float的范围缩小并没有错

请在您的环境中运行此测试或等效测试

除此之外,我唯一能建议的是仔细检查您的变量声明,并遵循在自己的行上声明每个变量的标准。。。并在声明每个变量时进行初始化,这样做的副作用是将每个变量向下移动到其可能的最小范围内;这通常被认为是一件好事,因为它最大限度地减少了在其他地方意外使用/修改变量的机会。这是临时变量的三倍

证明那是浮动的?所有的?扩大到相等的两倍


IE:没有,正如预期的那样。

我想你会发现问题在于这一行:

float[] fft_cpx,tmpr,tmpi,mod_spec = new float[array.length/2];
我认为您只是实例化了一个数组,如果您将其替换为:

float[] fft_cpx = new float[array.length/2];
float[] tmpr = new float[array.length/2];
float[] tmpi = new float[array.length/2];
float[] mod_spec = new float[array.length/2];

通过创建一些单独的对象,您将发现tmpi和img是匹配的。

您可能希望用java重新编写一个基本程序。。。Basic是另一种不相关的、广为人知的编程语言,如果不使用的话。。。一个傻瓜的失礼行为。没有害处-你能发布一个复制这种行为的帖子吗?另外,您的JDK/SDK版本和供应商、O/s和处理器是什么?原谅我,但我无法让自己相信这一点。如果Java的自动widdening:double myDoubleValue=myFloatValue以如此明显的方式被完全破坏,那么请原谅我,我严重怀疑您是否会第一个发现它。那么你的环境是什么,我们可以复制它吗?好的,我将为感兴趣的人制作一个SSCCE。尽可能详细地描述。请容忍我。感谢现在提供的SSRC代码,如果您需要更多信息,请告诉我,如果这还不足以测试它。我只想做一个说明,这不是为什么我的浮点到双精度转换结果为负数的答案。但是上面的代码仍然适用于计算填充了array.length零的16元素数组的fft,并且这个问题实际上不会影响我的代码的性能或准确性。谢谢,我只是出于这个原因编辑了它。。我猜您的意思是:Double.parseDoubleFloat.toStringtmpi[I];这种事情不应该是必要的。首先,从float转换为double是一种非常昂贵的方法。请提供一个实际的代码,如果可能的话,这是必要的具体例子。是的,我在提供更多的代码的过程中,我没有使用上述方法。但无论如何,它仍然返回一个负值。现在编辑原始帖子以添加可用代码。感谢这不是解决方案,我已经提供了上面的示例代码:桌面Java虚拟机与dalvik在问题中运行代码几乎没有什么关系。@Stephan:嗯?请你详细说明一下好吗?据我所知,问题是:double[I]=double float[I];生成一个双精度值,使floatdouble[i]近似等于floats[i]***-1**。。。或者你的意思是,你认为这是安德里欧设备的一个问题,可能是与桌面开发相对应的移动电话
环境在这种情况下,你可能会发现一些东西。桌面上的Java虚拟机与Android上的dalvik虚拟机有所不同。虽然它们似乎运行相同的代码,但它们是不同的软件,我想这就是谷歌与甲骨文的官司。最明显的是,dalvik以DEX格式运行文件,而不是从java编译器dx编译的字节码。dx是将一个文件转换为另一个文件的工具。[维基百科条目]给出了关于差异的第一个提示。因此,如果dalvik虚拟机在将浮点值转换为双倍值方面存在问题,我对此深表怀疑,但无论如何,您无法通过使用桌面虚拟机证明相反。因此,您的测试本身并没有错,但是如果我们要在dalvik VM中查找bug,那么在Java VM上运行它不会产生有意义的结果。不过,我的第一句话可能有点刺耳。
C:\Java\home\src\forums>"C:\Program Files\Java\jdk1.6.0_16\bin\java.exe" -Xms4m -Xmx256m -enableassertions -cp c:\java\home\src;C:\Java\home\classes; forums.FunkyDouble
Press any key to continue . . .
float[] fft_cpx,tmpr,tmpi,mod_spec = new float[array.length/2];
float[] fft_cpx = new float[array.length/2];
float[] tmpr = new float[array.length/2];
float[] tmpi = new float[array.length/2];
float[] mod_spec = new float[array.length/2];