c语言中离散傅里叶变换的一个例子

实离散傅里叶变换(实DFT)的一个例子

让我们看一个转化的例子。一个原始信号的长度是16,所以这个信号可以分解成9个余弦波和9个正弦波(一个长度为N的信号可以分解成N/2 ^ 1个正弦和余弦信号。为什么?结合下面18个正余弦图,我想从计算机处理的精度上不难理解。一个长度为N的信号最多只能有N/2 ^ 1个不同的频率,更多的频率超出了计算机能够处理的精度范围,如下图所示:

9个正弦信号:

9个余弦信号:

将上述所有信号相加,得到原始信号。至于如何分别变换9个不同频率的信号,先不着急。下面我们来看看如何在程序中表达上述转化结果。我们可以看看下面的例子:

上图中,左边表示的是时域的信号,右边表示的是频域的信号表示方法。从左到右,表示正向DFT,从右到左,表示反向DFT。用小写x找一个快速傅立叶变换的C语言程序。 void fft()

{

int nn,n1,n2,I,j,k,l,m,s,L1;

float ar[1024],ai[1024];//实部和虚部

浮动a[2050];

浮点t1,t2,x,y;

浮点w1,w2,u1,u2,z;

float fsin[10]= { 0.0000000,1.000000,0.707107,0.3826834,0.1950903,0.09801713,0.04906767,0.02454123,0.01227154,0.00613588,};//优化

float fcos[10]= {-1.0000000,0.000000,0.7071068,0.9238796,0.9807853,0.99518472,0.99879545,0.9996988,0.9999247,0.9999812,.};

nn = 1024

s = 10

n1 = nn/2;N2 = nn-1;

j = 1;

for(I = 1;i = nn我)

{

a[2 * I]= ar[I-1];

a[2 * I 1]= ai[I-1];

}

for(l = 1;ln2l)

{

中频(lj)

{

t1 = a[2 * j];

T2 = a[2 * j 1];

a[2 * j]= a[2 * l];

a[2 * j 1]= a[2 * l 1];

a[2 * l]= t1;

a[2 * l 1]= T2;

}

k = n1

白色(千焦)

{

j = j-k;

k = k/2;

}

j = j k;

}

for(I = 1;I = s;我)

{

u1 = 1;

U2 = 0;

m =(1i);

k = m1

w1 = fcos[I-1];

w2 =-fsin[I-1];

for(j = 1;j = k;j)

{

for(l = j;lnnl = l米)

{

L1 = l k;

t1 = a[2 * L1]* ua[2 * L1 1]* U2;

T2 = a[2 * L1]* U2 a[2 * L1 1]* u1;

a[2 * L1]= a[2 * l]-t1;

a[2 * L1 1]= a[2 * L1]-T2;

a[2 * l]= a[2 * l]t1;

a[2 * l 1]= a[2 * l 1]T2;

}

z = u1 * wU2 * w2;

u2 = u1 * w2 u2 * w1

u1 = z;

}

}

for(I = 1;I = nn/2;我)

{

ar[I]= a[2 * I 2]/nn;

ai[I]=-a[2 * I 3]/nn;

a[I]= 4 * sqrt(ar[I]* ar[I]ai[I]* ai[I]);//振幅

}

}

相关文章

发表新评论