语音识别中快速傅里叶(FFT)的实现

F(k)=\sum \binom{N-1}{n=0}*f(n)*w\binom{nk}{N}

k是频率f=0,1,2,3...

f(n)是声音采样样本点,此处只取了N=2048字节波形图,即f(n)是波形图。

w\binom{1}{2048}=exp(-j*2*PI/2048);

w\binom{nk}{2048}=exp(-j*2*PI*k*n/2048)。

F(k)是频谱图。w\binom{0}{N}=1;

N=2时,F(k)=f(0)+f(1)*w\binom{1*k}{2}。注意,N=2^1,样本点2个

N=4时,F(k)=f(0)+f(1)*w\binom{1*k}{4}+f(2)w\binom{2*k}{4}+f(3)*w\binom{3*k}{4}。注意,N=2^2,样本点4个

整理后F(k)=f(0)+f(2)*w\binom{1*k}{2}+w\binom{1*k}{4}(f(1)+f(3)w\binom{1*k}{2}

N=16时,展开整理后F(k)=f(0)+f(8)*w\binom{1*k}{2}+w\binom{1*k}{4}【f(4)+f(12)*w\binom{1*k}{2}】+w\binom{1*k}{8}【f(2)+f(10)*w\binom{1*k}{2}+w\binom{1*k}{4}【f(6)+f(14)*w\binom{1*k}{2}】】+w\binom{1*k}{16}【f(1)+f(9)*w\binom{1*k}{2}+w\binom{1*k}{4}【f(5)+

f(13)*w\binom{1*k}{2}】+w\binom{1*k}{8}【f(3)+f(11)*w\binom{1*k}{2}+w\binom{1*k}{4}【f(7)+f(15)*w\binom{1*k}{2}】】】。

注意,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\binom{1*k}{2}的形式,第一次只和并8对A+B*w\binom{1*k}{2},其他不管,得到

F(k)=C+D*w\binom{1*k}{4}+w\binom{1*k}{8}(E+F*w\binom{1*k}{4})+w\binom{1*k}{16}[G+H*w\binom{1*k}{4}+w\binom{1*k}{8}(I+J*w\binom{1*k}{4})]

第二次形成4对像C+D*w\binom{1*k}{4}的形式,这一次只和并4对C+D*w\binom{1*k}{4},第三次形成两对w\binom{1*k}{8}

第四次形成一对X+Y*w\binom{1*k}{16}。看到没,8,4,2,1减数分裂,无与伦比的减数分裂!伟大的减数分裂!

其他就是频率k=0,求X+Y*w\binom{1*k}{16},(k=0)幅值=sqrt(x*X+Y*Y),

频率k=1,求X+Y*w\binom{1*k}{16},(k=1)幅值=sqrt(x*X+Y*Y),

频率k=2,求X+Y*w\binom{1*k}{16},(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\binom{1*k}{2048}两项,是否看到孙大圣对金箍棒说,小,小,小...等到变成绣花针,装耳朵里去了。

这便是很形象的减数分裂,减数分裂是遗传里边很关键的一步,而我们的意识似乎并没有这样的结构,所以意识没办法遗传。

我们只看到遗传的重要,实质遗传便是永生,我们没有看到永生,原因是意识掌控着我们。所以我们认为意识死了,我便消亡了,此事不假,所以问题关键还在这个意识上。因为人类把意识运用到登峰造极的水平,所以意识也就毫不犹豫地担起了这个责任,所以我们就忽略了像减数分裂这样不靠意识的属性,而刻意强调了意识和意识创造的文明。

    如果每一个细胞是一个人,那么千千万万的细胞间必然会产生什么(细胞的文明->意识?),这应该和人群产生的文明一样,文明的传递,必然有他的密码,而人体要传承,也必然有它的密码,首先产生的(很随机)都经不起时间考验,消亡了,就像我们意识中很多美好而无用的东西,细胞也在做相同的事。后来,所以才有了后来。

    细胞间要产生什么,我们是不知道的,就像人之间,但我们会回过头去看,一些固定形式关系在细胞间(人之间)产生了什么。

    细胞是一粒生命,人也是一粒生命,人类的文明依靠了口传心授,纸笔文字,声视图像,而细胞,我们不知道,但细胞一定不会比人差。

   当你发现fft减数分裂时,你是否发现精(卵)原细胞的减数分裂与其重构了。不管世间是数字的,还是模拟的,而道是无差别的。

   减数分裂让生命穿越时空,那么fft是否也可以呢?答案显然是肯定的。

    我想,穿越时空后,我的意识丢掉了。

                                                                           201903051205 补充

我的邮箱[email protected];[email protected]

你可能感兴趣的:(算法类,语音识别入门项目实践)