社区
数据结构与算法
帖子详情
求fft代码;
lanren_me
2002-12-26 12:27:29
手头有部分代码:但是不知是干吗的。所以可以的话来点注释;
...全文
175
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
学习的好帮手
STM32F4 ADC采样
FFT
运算测试
代码
模拟信号经过ADC采样后变成数字信号,数字信号可以进行
FFT
运算,在频域中更容易分析信号的特征。此
代码
用STM32F407的ADC-DMA模式采集4096个点的数据,利用DSP库里的
FFT
算法进行快速傅里叶变换,经实测可以使用。
FPGA实现
FFT
(设计报告+源
代码
)
甘地大学电子专业Ray Ranjan Varghese设计的FPGA实现
FFT
,采用的是单精度的浮点,采用IEEE745格式的浮点+ROM RAM的方式成功实现
FFT
,含有设计报告和设计源
代码
,并有测试文件,真的很不错。
STM32进行
FFT
傅里叶变换 CUBEMX
5. **编写应用
代码
**:在生成的
代码
基础上,编写实际的
FFT
应用。通常包括读取输入数据、预处理(如窗函数应用)、调用
FFT
函数、处理结果(如计算功率谱密度)以及将结果输出或存储。 6. **内存管理和优化**:由于...
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章