中易网

求快速傅里叶算法的C语言实现代码

答案:1  悬赏:20  
解决时间 2021-03-08 04:05
求快速傅里叶算法的C语言实现代码
最佳答案
这是源于Numerical Recipes 的关键性的函数,我曾使用过(书本可能有印刷错误,这里给的没有错误)。我不可能给你在这里讲解语句功能,你可以查原书。
isign 1 或 0 是正变换和反变换。调用前,要自己去掉 mean,尾部要自己 padding ( 最简单添0),时间域 和 频率 域 要自己 滤波。 nn 必须是2的整数次方,例如1024,4096。

#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
void jfour1(float ya[], unsigned long nn, int isign)
{
unsigned long n,mmax,m,j,istep,i;
double wtemp,wr,wpr,wpi,wi,theta;
float tempr,tempi;
n=nn << 1;
j=1;
for (i=1;i if (j > i) {
SWAP(ya[j],ya[i]);
SWAP(ya[j+1],ya[i+1]);
}
m=n >> 1;
while (m >= 2 && j > m) {
j -= m;
m >>= 1;
};
j += m;
};
mmax=2;
while (n > mmax) {
istep=mmax << 1;
theta=isign*(6.28318530717959/mmax);
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0;
wi=0.0;
for (m=1;m for (i=m;i<=n;i+=istep) {
j=i+mmax;
tempr = wr * ya[j]- wi * ya[j+1];
tempi = wr * ya[j+1] + wi * ya[j];
ya[j] = ya[i] - tempr;
ya[j+1] = ya[i+1] - tempi;
ya[i] += tempr;
ya[i+1] += tempi;
};
wr = (wtemp=wr) * wpr - wi * wpi + wr;
wi = wi * wpr + wtemp * wpi + wi;
};
mmax=istep;
};
}
#undef SWAP
void jrealft(float ya[], unsigned long n, int isign)
{
void jfour1(float ya[], unsigned long nn, int isign);
unsigned long i,i1,i2,i3,i4,np3,n05;
float c1=0.5,c2,h1r,h1i,h2r,h2i;
double wr,wi,wpr,wpi,wtemp,theta;
n05 = n >> 1;
theta=3.141592653589793/(double) (n05);
if (isign == 1) {
c2 = -0.5;
jfour1(ya,n05,1);
} else {
c2=0.5;
theta = -theta;
};
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0+wpr;
wi=wpi;
np3=n+3;
for (i=2;i<=(n>>2);i++) {
i4=1+(i3=np3-(i2=1+(i1=i+i-1)));
h1r = c1 * (ya[i1] + ya[i3]);
h1i = c1 * (ya[i2] - ya[i4]);
h2r = -c2* (ya[i2] + ya[i4]);
h2i = c2 * (ya[i1] - ya[i3]);
ya[i1] =h1r + wr * h2r - wi * h2i;
ya[i2] =h1i + wr * h2i + wi * h2r;
ya[i3] =h1r - wr * h2r + wi * h2i;
ya[i4] = -h1i + wr * h2i + wi * h2r;
wr= (wtemp=wr) * wpr - wi * wpi + wr;
wi=wi * wpr + wtemp * wpi + wi;
};
if (isign == 1) {
ya[1] = (h1r=ya[1]) + ya[2];
ya[2] = h1r-ya[2];
} else {
ya[1] = c1 * ((h1r=ya[1]) + ya[2]);
ya[2]=c1 * (h1r - ya[2]);
jfour1(ya,n05,-1);
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
天津市辰思科技有限公司怎么去啊,有知道地址
南宋乡子乐沟村卫生所我想知道这个在什么地方
用……刻苦……坚持……成功造句
求广西玉林民歌啊TAT好急好急!
初中生文言文自传,类似《五柳先生传》的文言
怕不鲁在什么地方啊,我要过去处理事情
自来水管能用黑色的PVC管吗?
三星a7108破解电信卡
忘掉一切我的心好像远飞想飞的心却没有那片天
i76700k是不是就算不超频发热和功耗也比6700
唐人街购物广场(北京朝阳)地址在什么地方,想
要你好看在哪里啊,我有事要去这个地方
双鱼座最适合开什么车?
雅安市传承印章公司入网公章制作中心在哪里啊
描写冬天的成语二十个不重复
推荐资讯
票据理财有风险吗
西华县周口中国联通(逍遥镇营业厅)地址是什么
北京林业大学和中国石油大学华东哪个好
语文高手进!!!《绿色的挽歌》阅读!
什么四级试卷好
富德生命人寿农行项目什么时候发二月和一月的
赵炉村地址有知道的么?有点事想过去
小义乃智,大义乃道什么意思
新疆大红枣多少钱一公斤?
平顶山市市政设施监察管理办公室地址有知道的
小区中间是多层楼房,而两边又建的高层对中间
方新村到西桃园怎么走
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?