我有下面的代碼使用簡單的算法進行傅里葉變換,但它不像它應該那樣工作。傅立葉變換得到在java中的量級值
public int ft(int x, int y, int br, int a, int height, int width, int[][] pixelTemp, double c){
int r;
int g;
int b;
double avg;
double newCitra = 0;
int temp;
for (int i=0; i<height; i++){
for (int j=0; j<width; j++){
temp = pixelTemp[i][j];
r = (temp>>16)&0xff;
g = (temp>>8)&0xff;
b = temp&0xff;
avg = (r+g+b)/3;
if (Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))>0){
if(-2*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))>0){
newCitra = ((newCitra + (((double)avg/(double)(height*width)))*(sqrt(Math.pow((Math.cos(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))),2)+Math.pow((double)Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width)))),2)))));
} else {
newCitra = ((newCitra + (((double)avg/(double)(height*width)))*(sqrt(Math.pow((Math.cos(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))),2)-Math.pow((double)Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width)))),2)))));
}
} else {
if(-2*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))>0){
newCitra = (newCitra + ((double)avg/(double)(height*width))*((Math.cos(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width)))))+(double)Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))));
} else {
newCitra = (newCitra + ((double)avg/(double)(height*width))*((Math.cos(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width)))))-(double)Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))));
}
}
/*System.out.println(newCitra);*/
}
}
newCitra = (int) (Math.log(1+newCitra)*c);
int j = 30;
int i = 10;
/*System.out.println(Math.abs(sqrt(Math.pow((Math.cos(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width))))),2)-Math.pow((double)Math.sin(Math.toRadians(360*(((double)(i*x)/(double)height)+((double)(j*y)/(double)width)))),2))));*/
int p = (255<<24) | ((int)newCitra<<16) | ((int)newCitra<<8) | (int)newCitra;
return p;
}
這是以下結果:
很顯然,我在這裏做了一些錯誤,但我無法弄清楚,在開方根值可以爲負,這將導致NaN的但我遵循傅里葉變換公式。
您可以指向公式? – gpasch