F(k)=*f(n)*w
k是频率f=0,1,2,3...
f(n)是声音采样样本点,此处只取了N=2048字节波形图,即f(n)是波形图。
w=exp(-j*2*PI/2048);
w=exp(-j*2*PI*k*n/2048)。
F(k)是频谱图。w=1;
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<Num;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<num;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<nn;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 补充
我的邮箱liuganggang_1978@163.com;734523623@qq.com