DFT算法的理解和实现,望各位高手指点指点(谢谢)

DFT的公式:

    

其中X(k)表示DFT变换后的数据,x(n)为采样的模拟信号,公式中的x(n)可以为复信号,实际当中x(n)都是实信号,即虚部为0,此时公式可以展开为:

      

从这个公式可以看出,变换后的数据就是原信号对cossin的相关操作,即进行相乘求和(连续信号即为积分),为什么我要将写在后面呢?因为我觉得在对cossin进行相关操作时,k代表和频率为多少的正弦相关,而nN则是在一个正弦周期内采样N个点,采样间隔为,n用来步进,一次步进,最后进行累加求和,就得出了X(k),《实用数字信号处理》这本书的DFT章节详细的解释了此公式,并且还进行了举例,看了以后明白了不少,另外,DFT之后的数据是对称的,具体原因还是在那本书上面有,在FFT的章节。比如做8DFT,采样信号为x(n),DFT之后的数据为X(k),那么X(0)为直流信号,X(1), X(2), X(3), X(5), X(6), X(7),关于X(4)对称,X(1)=X(7), X(2)=X(6),X(3)=X(5),如下图,是对1+sin(2*PI)进行DFT变换,具体的幅值先不关心,只要知道它是对称的就行了。

接下来就是对公式写程序了,先将公式展开:

在计算机中可以这样展开:

里面有个j,不用管它,我们用两个数组,一个保存sin相关,一个保存cos相关,由于cos为实部,sin为虚部,可以定义以下两个数组:

float real[N];//用来保存cos相关。

float imag[N];//用来保存sin相关。

可以得到如下程序:

for(k=0;k<N;k++)

{

 for(n=0;n<N;n++)

  {

 real[k] = real[k] + x[n] *cos(2*PI*k*n/N) ;

 imag[k] = imag[k] –x[n]*sin(2*PI*k*n/N);

}

}

Real就是cos相关的幅值,imag就是sin相关的幅值

最后将sincos合成一个sin

result[i] = sqrt(real[i] * real[i] +imag[i] * imag[i]);

望各位大神指出我的错误之处,谢谢


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值