在实现FFT(快速Fourier变换)计算的时候,第一步要做的就是实现码位(二进制码)倒序。
有一种算法,叫做雷德(Rader)算法。
关于雷德算法,可以看这个:
用js写了一遍,如下:
// 雷德(Rader)算法 function rader(src, N){ var next = 0; var k = N>>1; while(k){ if(k>src){ next = src + k; break; } else{ src -= k; k = k >> 1; } } return next; } // 位运算 实现加法 // http://blog.csdn.net/zhongjiekangping/article/details/6855864 function sum0(a,b){ return (a^b) +((a&b)<<1); } // 自己写的,同雷德(Rader)算法,只是b是N>>1。 function sum(a,b){ var c = a^b; var d = a&b; while(d){ d=d>>1; if(d^(d&c)){ break; } else{ c=d^c; } } return c+d; } // 下边是测试代码 var arr = []; var src = 0; var n = 3; var N = 1<<n; for(var i=0;i<=N;i++){ arr[i] = src; src = rader(src,N); } console.log(arr); src = 0; var arr2 = []; var N2 = N>>1; for(var i=0;i<=N;i++){ arr2[i] = src; src = sum(src,N2); } console.log(arr2); n = 10; N = 1<<n; N2 = N>>1; src = 0; console.time("rader:"); for(var i=0;i<N;i++){ src = rader(src,N); } console.timeEnd("rader:"); src = 0; console.time("hanyeah:"); for(var i=0;i<N;i++){ src = sum(src,N2); } console.timeEnd("hanyeah:");
还是雷德(Rader)算法快。
生成倒序数耗时很短,在做fft的时候可以忽略。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。