求fft算法!!需注解!!

angeling2009 2009-08-18 01:58:05
加精
采集到一组sin数据,求出dft,并计算低于3赫兹的线数。谢谢各位了!!网上的不适用。。
...全文
1449 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickys2080 2011-05-07
  • 打赏
  • 举报
回复
我这里有一个,自己写的:http://www.jxust3jia1.com/bbs/viewthread.php?tid=10849&extra=page%3D1
angeling2009 2009-09-23
  • 打赏
  • 举报
回复
sin曲线的dft已经实现了 dft是从时域到频域的转换 低于3hz 就是转换为频域后 x(k)所对应的频率值
angeling2009 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhiyong1985 的回复:]
#define PI 3.1415926
int FFT_1D(double * y, double * x, int f, int n)
{//y为原始离散信号或者变换后的实部序列,x为原始信号或者变换后的虚部序列
//f=1为傅立叶反变换,f=-1为傅立叶正变换
//n为数据个数,必须为2的整数次幂
    int i,i0,i1,j,l1,ns,n1,k;
    double s,c,s1,c1,sc,x1,y1,t;
    if(fabs(f)!=1.0)
        return(-1);
    sc=PI;
    j=0;
    for(i=0;i <n-1;++i)
    {
        if(i <j)
        {
            t=x[i];x[i]=x[j];x[j]=t;
            t=y[i];y[i]=y[j];y[j]=t;
        }
        k=n/2;
        while(k <=j)
        {
            j-=k;
            k/=2;
        }
        j=j+k;
    }
    ns=1;
    while(ns <=n/2)
    {
        c1=cos(sc);s1=sin(f*sc);
        c=1.0;s=0.0;
        for(l1=0;l1 <ns;++l1)
        {
            for(i0=l1;i0 <n;i0+=2*ns)
            {
                i1=i0+ns;
                x1=x[i1]*c-y[i1]*s;
                y1=y[i1]*c+x[i1]*s;
                x[i1]=x[i0]-x1;
                y[i1]=y[i0]-y1;
                x[i0]+=x1;
                y[i0]+=y1;
            }
            t=c1*c-s1*s;
            s=s1*c+c1*s;
            c=t;
        }
        ns*=2;sc/=2.0;
    }
    if(f <0.0)
    {
        for(i=0;i <n;++i)
        {
            x[i]/=(double)n;
            y[i]/=(double)n;
        }
    }
    return(0);
    //TODO: Add your source code here
}
[/Quote]

单步时,第一个if循环就自己退出了。。。
tiandyoin 2009-08-25
  • 打赏
  • 举报
回复
http://download.csdn.net/source/783300
lhy 2009-08-25
  • 打赏
  • 举报
回复
一句话:楼主先回家看书。
g8613724 2009-08-25
  • 打赏
  • 举报
回复
看不懂...
bigtigerlu 2009-08-24
  • 打赏
  • 举报
回复
不知楼主想用C做,还是Matlab做,采样率0.25,单位是什么。如果是Hz,根本就做不出来;如果是s,4Hz的采样率也做不到3Hz.因为正弦是双谱线,只能分清2Hz到下的频率,上面的频率模糊了;ms也不对,4K有采样率有点大了,做完2048FFT后,一个点的分辨率为1.95Hz。分辨率太低了。我不知你的原始信号频率范围与精度要求,但我想采样率应在几十赫兹到几百赫兹之间比较合适。
另外关于计算,Matlab就不说了,如果用C,网上有开源的FFT计算程序,外国人写的,G一下就可以。我曾经用过很好使,多少点的都可以。
wolcott2387 2009-08-24
  • 打赏
  • 举报
回复
学习
scguest 2009-08-24
  • 打赏
  • 举报
回复
lz还是靠自己的好.
对速度有要求么?要是没有照着书上的算法写就行了,仔细看不难的.
要是对速度有要求,个人的经验是将一些比较固定的结果用宏定义的方式定义好,能不用for就不要用.这样至少能提高一倍的速度~
liumin3285 2009-08-24
  • 打赏
  • 举报
回复
接分!~
songcan123 2009-08-24
  • 打赏
  • 举报
回复
学习
lovetomjerry2005 2009-08-24
  • 打赏
  • 举报
回复
LZ处理的可能是个振动问题,不过没有说清楚,无法提供有效的帮助。
hhwei1985 2009-08-24
  • 打赏
  • 举报
回复
up
Focus_Mark 2009-08-23
  • 打赏
  • 举报
回复
路过。顶了
fabr8 2009-08-23
  • 打赏
  • 举报
回复
都是强人 到这里长知识 以后还要努力学习啊
jarrysong 2009-08-23
  • 打赏
  • 举报
回复
来学习下.
nixiang12 2009-08-23
  • 打赏
  • 举报
回复
mark
zzmoutmans 2009-08-23
  • 打赏
  • 举报
回复
回帖是一种美德!
jokenit 2009-08-22
  • 打赏
  • 举报
回复
路过...
angeling2009 2009-08-22
  • 打赏
  • 举报
回复
小女在这里谢谢大家的支持和热心帮助。。。共同进步。。。
加载更多回复(48)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧