社区
数据结构与算法
帖子详情
求fft代码;
lanren_me
2002-12-26 12:27:29
手头有部分代码:但是不知是干吗的。所以可以的话来点注释;
...全文
172
7
打赏
收藏
求fft代码;
手头有部分代码:但是不知是干吗的。所以可以的话来点注释;
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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. ...
matlab
FFT
源
代码
运行 Xk=my
fft
(Xn)与matlab自带的
fft
的输出结果一样 可以替代
fft
学习的好帮手
基于MATLAB的全相位
FFT
代码
王兆华教授的全相位
FFT
算法的标准
代码
,运行平台为MATLAB
STM32F4 ADC采样
FFT
运算测试
代码
模拟信号经过ADC采样后变成数字信号,数字信号可以进行
FFT
运算,在频域中更容易分析信号的特征。此
代码
用STM32F407的ADC-DMA模式采集4096个点的数据,利用DSP库里的
FFT
算法进行快速傅里叶变换,经实测可以使用。
FPGA实现
FFT
(设计报告+源
代码
)
甘地大学电子专业Ray Ranjan Varghese设计的FPGA实现
FFT
,采用的是单精度的浮点,采用IEEE745格式的浮点+ROM RAM的方式成功实现
FFT
,含有设计报告和设计源
代码
,并有测试文件,真的很不错。
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章