社区
数据结构与算法
帖子详情
求fft代码;
lanren_me
2002-12-26 12:27:29
手头有部分代码:但是不知是干吗的。所以可以的话来点注释;
...全文
167
7
打赏
收藏
求fft代码;
手头有部分代码:但是不知是干吗的。所以可以的话来点注释;
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lanren_me
2002-12-29
打赏
举报
回复
大大:
问题是:比如:采样N个点,每个点的值为float值;
那么这个float值是实数还是虚数???怎么转化为复数啊???
strafer
2002-12-28
打赏
举报
回复
wa, 楼上大哥的程序风格像是大公司的, 变量都选那么长的!!!
eastsun
2002-12-28
打赏
举报
回复
void HPFAST_OneDimension_FFT_Trans(
_complex_digital_array the_src_sign_array,
_complex_digital_array& result_sign_array )
{
_complex_digital_array src_sign_array;
src_sign_array = the_src_sign_array;
int nInputSignAmount = src_sign_array.GetSize( );
result_sign_array.RemoveAll( );
if( ! Is2MiNumber( nInputSignAmount ) )
return;
int nInputSignLog2Mi = GetLog2( nInputSignAmount );
if( nInputSignLog2Mi <= 0 )
{
result_sign_array = src_sign_array;
return;
}
result_sign_array.InitBySize( nInputSignAmount );
////////////////////////////////////////////////////////////
int nMiIndex = 0;
////////////////////////////////////////////////////////////
int nDotIndex = 0;
for( nDotIndex = 0; nDotIndex < nInputSignAmount; nDotIndex ++ )
{
int m = nDotIndex;
int is = 0;
for( nMiIndex = 0; nMiIndex < nInputSignLog2Mi; nMiIndex ++ )
{
int j = m / 2;
is = 2 * is + ( m - 2 * j );
m = j;
}
_complex_digital temp_des_digital;
_complex_digital temp_src_digital;
temp_src_digital = src_sign_array.GetAt( is );
temp_des_digital = temp_src_digital;
result_sign_array.SetAt( nDotIndex, temp_des_digital );
}//这个循环完成置换。
double dGuiyiCoefficient = 2.0 * PI / nInputSignAmount;
_complex_digital temp_digital0;
temp_digital0.HP_SetRealAndVirtualValue( 1.0, 0.0 );
_complex_digital temp_digital1;
temp_digital1.HP_SetRealAndVirtualValue( cos( dGuiyiCoefficient ), - sin( dGuiyiCoefficient ) );
{
src_sign_array.SetAt( 0, temp_digital0 );
src_sign_array.SetAt( 1, temp_digital1 );
}
_complex_digital base_trans_digital = temp_digital1;
for( nDotIndex = 2; nDotIndex < nInputSignAmount; nDotIndex ++ )
{
_complex_digital the_pre_digital = src_sign_array.GetAt( nDotIndex - 1 );
_complex_digital current_digital;
current_digital = the_pre_digital * base_trans_digital;
src_sign_array.SetAt( nDotIndex, current_digital );
}//这个循环完成基本的单点变换。
for( nDotIndex = 0; nDotIndex < nInputSignAmount - 1; nDotIndex += 2 )
{
_complex_digital current_digital = result_sign_array.GetAt( nDotIndex );
_complex_digital next_digital = result_sign_array.GetAt( nDotIndex + 1 );
_complex_digital origen_current_digital = current_digital;
current_digital += next_digital;
next_digital = origen_current_digital - next_digital;
result_sign_array.SetAt( nDotIndex, current_digital );
result_sign_array.SetAt( nDotIndex + 1, next_digital );
}
int m = nInputSignAmount / 2;
int nv = 2;
for( nMiIndex = nInputSignLog2Mi - 2; nMiIndex >= 0; nMiIndex -- )
{
m = m / 2;
nv = 2 * nv;
for( nDotIndex = 0; nDotIndex <= ( m - 1 ) * nv; nDotIndex += nv )
{
int jjs = 0;
for( jjs = 0; jjs < ( nv / 2 ); jjs ++ )
{
int nOffset = nDotIndex + jjs + nv / 2;
_complex_digital temp_src_mj_digital = src_sign_array.GetAt( m * jjs );
_complex_digital temp_result_offset_digital = result_sign_array.GetAt( nOffset );
_complex_digital the_product_digital = temp_src_mj_digital * temp_result_offset_digital;
_complex_digital the_result_index_add_jjs_digital = result_sign_array.GetAt( nDotIndex + jjs );
temp_result_offset_digital = the_result_index_add_jjs_digital - the_product_digital;
the_result_index_add_jjs_digital += the_product_digital;
result_sign_array.SetAt( nOffset, temp_result_offset_digital );
result_sign_array.SetAt( nDotIndex + jjs, the_result_index_add_jjs_digital );
}
}
}
result_sign_array /= ( 1.0 * nInputSignAmount );
}
lanren_me
2002-12-27
打赏
举报
回复
能否解释一下:实数表,虚数表
dcyu
2002-12-27
打赏
举报
回复
在频域方面会有复频率出现,因此就需要建立n个复数的抽样点,
实数表,虚数表是这n个点各自的实部和虚部。
比如四个采样点为:1+j2 , 2+j3 , 4+j5 , 67+j12
它们的实数表,虚数表是两个一维数组:
{1,2,4,67},{2,3,5,12}
dcyu
2002-12-26
打赏
举报
回复
72. 函数名:_FFT
功能:FFT变换
用法:void _FFT(double *fr, double *fi, int n, int flag)
参数:fr:采样点的实数表,fi:采样点的虚数表,n:采样点个数,flag:flag=0表示求Fourier变换,flag=1表示求逆Fourier变换
返回:无
void _FFT(double *fr, double *fi, int n, int flag)
{
int mp,arg,q,cntr,p1,p2;
int i,j,a,b,k,m;
double sign,pr,pi,harm,x,y,t;
double *ca,*sa;
ca=(double *)calloc(n,sizeof(double));
sa=(double *)calloc(n,sizeof(double));
if(ca==NULL||sa==NULL) Error("calloc error in _FFT!");
j=0;
if(flag!=0)
{
sign=1.0;
for(i=0;i<=n-1;i++)
{
fr[i]=fr[i]/n;
fi[i]=fi[i]/n;
}
}
else
sign=-1.0;
for(i=0;i<=n-2;i++)
{
if(i<j)
{
t=fr[i];
fr[i]=fr[j];
fr[j]=t;
t=fi[i];
fi[i]=fi[j];
fi[j]=t;
}
k=n/2;
while(k<=j)
{
j-=k;
k/=2;
}
j+=k;
}
mp=0;
i=n;
while(i!=1)
{
mp+=1;
i/=2;
}
harm=2*M_PI/n;
for(i=0;i<=n-1;i++)
{
sa[i]=sign*sin(harm*i);
ca[i]=cos(harm*i);
}
a=2;
b=1;
for(cntr=1;cntr<=mp;cntr++)
{
p1=n/a;
p2=0;
for(k=0;k<=b-1;k++)
{
i=k;
while(i<n)
{
arg=i+b;
if(k==0)
{
pr=fr[arg];
pi=fi[arg];
}
else
{
pr=fr[arg]*ca[p2]-fi[arg]*sa[p2];
pi=fr[arg]*sa[p2]+fi[arg]*ca[p2];
}
fr[arg]=fr[i]-pr;
fi[arg]=fi[i]-pi;
fr[i]+=pr;
fi[i]+=pi;
i+=a;
}
p2+=p1;
}
a*=2;
b*=2;
}
free(ca);
free(sa);
}
dcyu
2002-12-26
打赏
举报
回复
Fast Fourier Transform 是信号处理常用的简化计算的算法
7种
FFT
代码
和测试程序
本压缩包包含7种不同的
FFT
代码
和测试程序,并给出各个
FFT
程序的性能对比数据。更详细的信息请参见http://topic.csdn.net/t/20060328/11/4644901.html。 这7种
FFT
代码
包括。 1. galois_godel()给出的程序 2. ...
FFT
程度
代码
(快速计算
FFT
)
FFT
程度
代码
(快速计算
FFT
)
FFT
程度
代码
(快速计算
FFT
)
FFT
C++
代码
FFT
C++
代码
我自己写的!
基于MATLAB的全相位
FFT
代码
王兆华教授的全相位
FFT
算法的标准
代码
,运行平台为MATLAB
matlab
FFT
源
代码
运行 Xk=my
fft
(Xn)与matlab自带的
fft
的输出结果一样 可以替代
fft
学习的好帮手
数据结构与算法
33,007
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章