k是频率f=0,1,2,3...
f(n)是声音采样样本点,此处只取了N=2048字节波形图,即f(n)是波形图。
N=2时,F(k)=f(0)+f(1)*w。注意,N=2^1,样本点2个
N=4时,F(k)=f(0)+f(1)*w+f(2)w+f(3)*w。注意,N=2^2,样本点4个
整理后F(k)=f(0)+f(2)*w+w(f(1)+f(3)w)
N=16时,展开整理后F(k)=f(0)+f(8)*w+w【f(4)+f(12)*w】+w【f(2)+f(10)*w+w【f(6)+f(14)*w】】+w【f(1)+f(9)*w+w【f(5)+
f(13)*w】+w【f(3)+f(11)*w+w【f(7)+f(15)*w】】】。
注意,N=2^4,样本点16个
归纳后可得16个样本点f(0),f(8),f(4),f(12),f(2),f(10),f(6),f(14),f(1),f(9),f(5),f(13),f(3),f(11),f(7),f(15)可以经过偶奇数排序得到
即第一次为0,2,4,6,8,10,12,14;1,3,5,7,9,11,13,15.前半部分
0,2,4,6,8,10,12,14再经过偶奇数排序得0,4,8,12;2,6,10,14
0,4,8,12;2,6,10,14再经过偶奇数排序得0,8;4,12;2,10;6,14
后半部分1,3,5,7,9,11,13,15经过偶奇数排序得1,9;5,13;3,11;7,15
这是第一个规律。
第二个规律是,N=16,形成8对像A+B*w的形式,第一次只和并8对A+B*w,其他不管,得到
F(k)=C+D*w+w(E+F*w)+w[G+H*w+w(I+J*w)]
第二次形成4对像C+D*w的形式,这一次只和并4对C+D*w,第三次形成两对w,
第四次形成一对X+Y*w。看到没,8,4,2,1减数分裂,无与伦比的减数分裂!伟大的减数分裂!
其他就是频率k=0,求X+Y*w,(k=0)幅值=sqrt(x*X+Y*Y),
频率k=1,求X+Y*w,(k=1)幅值=sqrt(x*X+Y*Y),
频率k=2,求X+Y*w,(k=2)幅值=sqrt(x*X+Y*Y),
。。。
C#代码:规律一实现
int Num=2048;
for(int i=0;i {jiou[i]=i;}//i为测试用,看排序是否正确 fft递归(2048,jiou); ///////////////////////////////////////// void fft递归(int num,int[] temp) { int[] 奇数=new int[num/2]; int[] 偶数=new int[num/2]; for(int n=0;n {if(0==n%2){偶数[n/2]=temp[n];} else{奇数[n/2]=temp[n];} } int nn=num/2; if(1==nn) return; fft递归(nn,偶数); fft递归(nn,奇数); for(int m=0;m {temp[m]=偶数[m];temp[nn+m]=奇数[m];} } 规律一搞定,规律二实现: for(int kk=0;kk<512;kk++) { 笨办法(kk,ref returnval); arr[kk]=returnval; } //////////////////////////////////////// void 笨办法(kk,ref returnval) { if(bt!=null)//bt[2048]中为2048字节波形图 { double PI=3.1415926; int erN=2; for(int temp1=0;temp1<11;temp++)//2^11=2048 {w[temp1].x=(float)(math.cos(-kk*2*PI/erN)); w[temp1].y=(float)(math.sin(-kk*2*PI/erN)); erN=erN<<1;if(erN>2048)break; } int [] arr=new int[2048]; for(int m=0;m<2048;m++) {temp=jiou[m];arr[m]=bt[temp]-128; } pointF[] temp1024=new pointF[1024]; for(int x=0;x<1024;x++) {int tt=2*x;temp1024[x].x=arr[tt+1].w[0].x+arr[tt];temp1024[x].x=arr[tt+1].w[0].y;} } pointF[] temp512=new pointF[512];减数分裂(temp512,temp1024,512,w[1]); pointF[] temp256=new pointF[256];减数分裂(temp256,temp512,256,w[2]); pointF[] temp128=new pointF[128];减数分裂(temp128,temp256,128,w3]); pointF[] temp64=new pointF[64];减数分裂(temp64,temp128,64,w[4]); pointF[] temp32=new pointF[32];减数分裂(temp32,temp64,32,w[5]); pointF[] temp16=new pointF[16];减数分裂(temp16,temp32,16,w[6]); pointF[] temp8=new pointF[8];减数分裂(temp8,temp16,8,w[7]); pointF[] temp4=new pointF[4];减数分裂(temp4,temp8,4,w[8]); pointF[] temp2=new pointF[2];减数分裂(temp2,temp4,2,w[9]); pointF[] tempE=new pointF[1];减数分裂(tempE,temp2,1,w[10]); returnval=math.sqrt(tempE[0].x*tempE[0].x+tempE[0].y*tempE[0].y); } ///////////////////////////////////// void 减数分裂(Pointf[] 一半,pointf[] 全,半数,pointf w) { for(int x=0;x<半数;x++) {int tt=2*x; 一半[x].x=全[tt+1].x*w.x-全[tt+1].y*w.y+全[tt].x; 一半[x].y=全[tt+1].x*w.y+全[tt+1].y*w.x+全[tt].y; } } 2019.03.04.17:48 刘刚(有光) ganggangwa ganggangwawa 关于fft减数分裂的畅想 当2048项变1024项,直到x+y*w两项,是否看到孙大圣对金箍棒说,小,小,小...等到变成绣花针,装耳朵里去了。 这便是很形象的减数分裂,减数分裂是遗传里边很关键的一步,而我们的意识似乎并没有这样的结构,所以意识没办法遗传。 我们只看到遗传的重要,实质遗传便是永生,我们没有看到永生,原因是意识掌控着我们。所以我们认为意识死了,我便消亡了,此事不假,所以问题关键还在这个意识上。因为人类把意识运用到登峰造极的水平,所以意识也就毫不犹豫地担起了这个责任,所以我们就忽略了像减数分裂这样不靠意识的属性,而刻意强调了意识和意识创造的文明。 如果每一个细胞是一个人,那么千千万万的细胞间必然会产生什么(细胞的文明->意识?),这应该和人群产生的文明一样,文明的传递,必然有他的密码,而人体要传承,也必然有它的密码,首先产生的(很随机)都经不起时间考验,消亡了,就像我们意识中很多美好而无用的东西,细胞也在做相同的事。后来,所以才有了后来。 细胞间要产生什么,我们是不知道的,就像人之间,但我们会回过头去看,一些固定形式关系在细胞间(人之间)产生了什么。 细胞是一粒生命,人也是一粒生命,人类的文明依靠了口传心授,纸笔文字,声视图像,而细胞,我们不知道,但细胞一定不会比人差。 当你发现fft减数分裂时,你是否发现精(卵)原细胞的减数分裂与其重构了。不管世间是数字的,还是模拟的,而道是无差别的。 减数分裂让生命穿越时空,那么fft是否也可以呢?答案显然是肯定的。 我想,穿越时空后,我的意识丢掉了。 201903051205 补充