打印

授之以渔: 几个例子弄清复立叶变换的应用

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
101
kubuco| | 2010-9-3 08:25 | 只看该作者 回帖奖励 |倒序浏览
圈圈很久前有个讲傅立叶变换的帖子。。可以找来学习。。图文都有生动。。少了LZ 的这么多的代码。建议初学者入门看那个。

使用特权

评论回复
102
wlzhzhlm| | 2010-9-3 11:18 | 只看该作者
顶啊讲啊,不然我们到哪里学啊!

使用特权

评论回复
103
Xflyan| | 2010-9-3 11:30 | 只看该作者
搬个板凳 学习!

使用特权

评论回复
104
xixihaha0| | 2010-9-3 12:59 | 只看该作者
楼主的第一点记得是我毕业那一年吉林省的电子设计大赛的一原装题目,当时记得东北电力的学生直接拿的产品去,老师都帮学生做,哎,数字信息处理的基础都忘了,得翻书温习一下才有些概念

使用特权

评论回复
105
xixihaha0| | 2010-9-3 13:05 | 只看该作者
75# highgear

使用特权

评论回复
106
Quentin| | 2010-9-3 15:03 | 只看该作者
mark

使用特权

评论回复
107
xuyiyi| | 2010-9-3 17:25 | 只看该作者
圈圈很久前有个讲傅立叶变换的帖子。。可以找来学习。。图文都有生动。。少了LZ 的这么多的代码。建议初学者入门看那个。
kubuco 发表于 2010-9-3 08:25



找来看看,写的不错。
圈圈的第三个AT91SAM7S64测试程序横空出世~~~FFT显示频谱~~~
https://bbs.21ic.com/viewthread.php?tid=119652&extra=&highlight=&page=4

使用特权

评论回复
108
zj1| | 2010-9-4 21:29 | 只看该作者
认真听课

使用特权

评论回复
109
张广伟| | 2010-9-4 21:36 | 只看该作者
想听听,不知道楼主什么时间开课!~期待,不要太监就好

使用特权

评论回复
110
我是大婶| | 2010-9-4 21:43 | 只看该作者
顶啊

使用特权

评论回复
111
leexaut| | 2010-9-4 22:25 | 只看该作者
捧场,听讲。

使用特权

评论回复
112
wxw123321| | 2010-9-5 12:10 | 只看该作者
顶起,期待中

使用特权

评论回复
113
cuya| | 2010-9-5 21:53 | 只看该作者
本帖最后由 cuya 于 2010-9-5 22:04 编辑

使用特权

评论回复
114
highgear|  楼主 | 2010-9-5 22:08 | 只看该作者
已经讲完了, fft 没有太多的东西好讲。这样吧, 我放出定点c++ 的 fft 以及逆变换的程序,供大家参考
 
class CComplex
{
public:
short R;
short I;
CComplex() {}
CComplex(short r, short i)  { R = r; I = i; }
void Set(short r, short i) { R = r; I = i; }
CComplex(CComplex& complex) { R = complex.R; I = complex.I; }
inline void operator=(CComplex& complex)  { R = complex.R; I = complex.I; }
void operator+=(CComplex& complex)
{
  R += complex.R;
  I += complex.I;
}
void operator-=(CComplex& complex)
{
  R -= complex.R;
  I -= complex.I;
}
inline void Add(CComplex& c1, CComplex& c2)
{
  R = c1.R + c2.R;
  I = c1.I + c2.I;
}
inline void Sub(CComplex& c1, CComplex& c2)
{
  R = c1.R - c2.R;
  I = c1.I - c2.I;
}
inline void Add(CComplex& c1, CComplex& c2, int shift)
{
  R = (c1.R + c2.R) >> shift;
  I = (c1.I + c2.I) >> shift;
}
inline void Sub(CComplex& c1, CComplex& c2, int shift)
{
  R = (c1.R - c2.R) >> shift;
  I = (c1.I - c2.I) >> shift;
}

inline void Mul(CComplex& c1, CComplex& c2, int shift)
{
  R = (c1.R * c2.R + c1.I * c2.I) >> shift;
  I = (c1.I * c2.R - c1.R * c2.I) >> shift;
}
inline void MulConj(CComplex& c1, CComplex& c2, int shift)
{
  R = (c1.R * c2.R - c1.I * c2.I) >> shift;
  I = (c1.I * c2.R + c1.R * c2.I) >> shift;
}

inline void Shift(int n) { R >>= n; I >>= n; }
};


在嵌入式,构造函数中的 BitReversal, W 数组应该预先离线计算

class CFFT
{
protected:
static const int N = 32;
CComplex W[N];
int BitReversal[N];
public:
CComplex Y[N];
protected:
void ReverseBit()
{
  int rev = 0;
  int t = N/2;
  int mask;
  for (int i = 0; i < N-1; i++) {
   BitReversal = rev;
   mask = t;
   while (rev >= mask) {
    rev -= mask;
    mask >>= 1;
   }
   rev += mask;
  }
  BitReversal[N-1] = N-1;
}
public:
CFFT()
{
  for (int i=0; i<N; i++) {
   W.R = (short) ( ::cos(PI * 2*i / N) * 16384 + 0.5);
   W.I = (short) (-::sin(PI * 2*i / N) * 16384 + 0.5);
  }
  ReverseBit();
}
void Calculate(short* x)
{
  short t;
  int i, j, n, index1, index2, indexW, di;
  CComplex result;
  for(i=0; i<N; i++) {
   n = BitReversal;
   if(n > i) {
    t = x;
    x = x[n];
    x[n] = t;
   }
   }
  for (i=0; i<N; i+=2) {
   t = x[i+1];
   Y.Set(x + t, 0);
   Y[i+1].Set(x - t, 0);
  }
  for (di=N>>2, n=2; n<N; n<<=1, di >>= 1) {
   for (j=0; j<N; j+=(n<<1)) {
    indexW = 0;
    for (i=0; i<n; i++) {
     index1 = i + j;
     index2 = index1 + n;
     result.Mul(Y[index2], W[indexW], 14);
     Y[index2].Sub(Y[index1], result, 1);
     Y[index1].Add(Y[index1], result, 1);
     indexW += di;
    }
   }
  }
}
void Inverse()
    {
  int i, j, n, index1, index2, indexW, di;
  CComplex result;
  for(i=0; i<N; i++) {
   n = BitReversal;
   if(n > i) {
    result = Y;
    Y = Y[n];
    Y[n] = result;
   }
   }
  for (i=0; i<N; i+=2) {
   result = Y[i+1];
   Y[i+1].Sub(Y, result, 1);
   Y.Add(Y, result, 1);
  }
  for (di=N>>2, n=2; n<N; n<<=1, di >>= 1) {
   for (j=0; j<N; j+=(n<<1)) {
    indexW = 0;
    for (i=0; i<n; i++) {
     index1 = i + j;
     index2 = index1 + n;
     result.MulConj(Y[index2], W[indexW], 14);
     Y[index2].Sub(Y[index1], result);
     Y[index1].Add(Y[index1], result);
     indexW += di;
    }
   }
  }
    }
};

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xuyiyi + 1
115
xuyiyi| | 2010-9-6 07:18 | 只看该作者
顶!
highgear老师的沙发!

使用特权

评论回复
116
原野之狼| | 2010-9-7 02:03 | 只看该作者
顶出水面

使用特权

评论回复
117
徒然一生| | 2010-9-7 08:54 | 只看该作者
看下,有那么点兴趣

使用特权

评论回复
118
johnwjl| | 2010-9-7 11:45 | 只看该作者
大师讲课果然不同凡响,我顶!

使用特权

评论回复
119
fover| | 2010-9-7 17:35 | 只看该作者
82# 粉丝
期待你与楼主的讨论切磋,或者更详细的解说,让我们能更深入的掌握单片机傅里叶

使用特权

评论回复
120
zhufdf| | 2010-10-6 15:47 | 只看该作者
好东西 我试试,先下了再说

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则