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]);//振幅
}
}
最后更新于 2023-10-07 07:42:24 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章
- C语言中的一行没有优化(C语言中常见的优化方法)
- C语言结构改变学号(C语言如何表达学号)
- C语言控制台界面阅读键盘操作(如何用C语言阅读键盘)
- C语言输入的两个数的乘积(C语言写的两个数的乘积)
- C语言中的字符可以判断相等吗(C语言中如何判断字符串是否相等)