请用MATLAB、C语言或者其他语言编程实现8点序列的基2-DIT-FFT算法,并对结果进行分析验证。 25
请用MATLAB、C语言或者其他语言编程实现8点序列的基2-DIT-FFT算法,并对结果进行分析验证。报告内容要求:设计目的及意义,设计原理,详细的设计方案,调试与验证,...
请用MATLAB、C语言或者其他语言编程实现8点序列的基2-DIT-FFT算法,并对结果进行分析验证。
报告内容要求:设计目的及意义,设计原理,详细的设计方案,调
试与验证,设计中存在的问题及改进措施,体会。
谁有这个,发给我12023125@qq.com 展开
报告内容要求:设计目的及意义,设计原理,详细的设计方案,调
试与验证,设计中存在的问题及改进措施,体会。
谁有这个,发给我12023125@qq.com 展开
1个回答
展开全部
typedef struct
{
float real;
float img;
}COMPLEX;
void reverse(COMPLEX *X,COMPLEX *x,int N) /*输入数组名称和元素个数,实现倒序 */
{
int LH = N/2;
int j = LH;
int N1 = N-2;
int i;
for(i = 1; i <= N1; i++)
{
int k = LH;
X[i] = (i<j ? x[j] : x[i]);
/*
if(i < j)
{
comp T = a[j];
a[j] = a[i];
a[i] = T;
*/
}
while(j >= k)
{
j = j-k;
k = k/2;
}
j = j+k;
}
}
/*
函数功能:对指定长度的采样数据进行快速傅立叶变换,并返回变换值, X = FFT(x)
入口参数:目标采样数据,保存变换值的指针,采样数据长度
出口参数:指向变换值的指针
注意事项:保存结果的空间是在函数外部申请,本函数不处理此内容
/*/
COMPLEX *FFT(COMPLEX *X,COMPLEX *x, unsigned N)
{
unsigned temp=N,L=0,M=0,LE=1,LE1=0,J=0,I=0,IP=0;
COMPLEX U={0,0},W={0,0},T={0,0};
while((temp>>=1)>0) /*获得阶码M*/
{
M++;
}
reverse(X,x,N);
for(L=0;L<M;L++)
{
LE=1<<L; /*LE=2^L,分组间隔*/
LE1 = LE>>1; /*LE1=LE/2,对偶跨距,实际也是一个分组中对偶点的对数*/
U.real = 1.0;
U.img = 1.0;
W.real = cos(PI / LE1);
W.img = sin(PI / LE1);
J = 0;
while(J<LE1)
{
I = J;
while(I < N)
{
IP = I + LE1;
ComMul(X + IP,&U,&T);
ComSub(X + I,&T,X + IP);
ComAdd(X + I,&T,X + I);
I += LE;
}
ComMul(&U,&W,&U);
J++;
}
}
return X;
}
FFT中有几个复数运算,自己实现,不想发给你,年轻人还是要自己动手做点东西。N为任意数,正常应该为2的幂次方。
{
float real;
float img;
}COMPLEX;
void reverse(COMPLEX *X,COMPLEX *x,int N) /*输入数组名称和元素个数,实现倒序 */
{
int LH = N/2;
int j = LH;
int N1 = N-2;
int i;
for(i = 1; i <= N1; i++)
{
int k = LH;
X[i] = (i<j ? x[j] : x[i]);
/*
if(i < j)
{
comp T = a[j];
a[j] = a[i];
a[i] = T;
*/
}
while(j >= k)
{
j = j-k;
k = k/2;
}
j = j+k;
}
}
/*
函数功能:对指定长度的采样数据进行快速傅立叶变换,并返回变换值, X = FFT(x)
入口参数:目标采样数据,保存变换值的指针,采样数据长度
出口参数:指向变换值的指针
注意事项:保存结果的空间是在函数外部申请,本函数不处理此内容
/*/
COMPLEX *FFT(COMPLEX *X,COMPLEX *x, unsigned N)
{
unsigned temp=N,L=0,M=0,LE=1,LE1=0,J=0,I=0,IP=0;
COMPLEX U={0,0},W={0,0},T={0,0};
while((temp>>=1)>0) /*获得阶码M*/
{
M++;
}
reverse(X,x,N);
for(L=0;L<M;L++)
{
LE=1<<L; /*LE=2^L,分组间隔*/
LE1 = LE>>1; /*LE1=LE/2,对偶跨距,实际也是一个分组中对偶点的对数*/
U.real = 1.0;
U.img = 1.0;
W.real = cos(PI / LE1);
W.img = sin(PI / LE1);
J = 0;
while(J<LE1)
{
I = J;
while(I < N)
{
IP = I + LE1;
ComMul(X + IP,&U,&T);
ComSub(X + I,&T,X + IP);
ComAdd(X + I,&T,X + I);
I += LE;
}
ComMul(&U,&W,&U);
J++;
}
}
return X;
}
FFT中有几个复数运算,自己实现,不想发给你,年轻人还是要自己动手做点东西。N为任意数,正常应该为2的幂次方。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询