« 上一篇: 系统实时仿真开发环境与应用 下一篇: matlab中循环卷积 »
山城棒棒儿军 @ 2005-01-02 22:27


/************************************************************************
* 离散傅立叶变换与反变换
* 输入: x--要变换的数据的实部
* y--要变换的数据的虚部
*       a--变换结果的实部
*       b--变换结果的虚部
*       n--数据长度
*    sign--sign=1时,计算离散傅立叶正变换;sign=-1时;计算离散傅立叶反变换
************************************************************************/
void dft(double x[],double y[],double a[],double b[],int n,int sign)
{
int i,k;
double c,d,q,w,s;

q=6.28318530718/n;
for(k=0;k<n;k++)
{
w=k*q;
a[k]=b[k]=0.0;
for(i=0;i<n;i++)
{
d=i*w;
c=cos(d);
s=sin(d)*sign;
a[k]+=c*x+s*y;
b[k]+=c*y-s*x;
}
}
if(sign==-1)
{
c=1.0/n;
for(k=0;k<n;k++)
{
a[k]=c*a[k];
b[k]=c*b[k];
}
}
}

最新评论 (点击这里查看更早的所有评论...)


Genial

2006-04-08 23:42

好像功率谱的定义就是那样的吧? ps:我没系统学过信号处理~



ken

2006-04-10 09:38

那为什么频率f也要除以512呢?matlab求离散傅立叶变换的函数fft的计算结果是个数组,那每个数组代表的是什么呢?



Genial

2006-04-10 17:56

频率除以512是得到归一划频率的吧。傅立叶变换得到的结果数组具体说那个意义我也不完全清楚.



xia

2006-06-17 17:05

棒棒你好!下面是我用matlab把你上面的程序中DFT部分又写了一遍,可是结果和fft这个标准函数的差别很大。我觉得你的程序没有问题,可是为什么就不一样呢,麻烦你帮忙看一下,希望你能看到。。。
clear all
close all
N=10;
q=2*pi/N;

x = [1 2 3 4 5 6 7 8]';
y(8)=0;
for k=1:1:8
   w=k*q;
   a(k)=0;
   b(k)=0;
   for i=1:1:8
       d=i*w;
       c=cos(d);
       s=sin(d);
       a(k)=a(k)+c*x(i)+s*y(i);
       b(k)=b(k)+c*y(i)-s*x(i);
   end



Genial

2006-06-17 17:24

为啥你的N=10,后面又是8阶的?将N改为8就可以了吧。



Genial

2006-06-17 17:25

当然,用matlab建议不要这样写,可以如下写:
function Xk = dft(xn, N)
n = [0:N-1];
k = n;
Wn = exp(-j*2*pi/N);
nk = n'*k;
Wnnk = Wn.^nk;
Xk = xn * Wnnk;



xia

2006-06-17 19:01

哎,果然是这样的!N=8,结果就差不多了。但是正负符号是反的。。哪里有出错了呢?还有,我把N理解为频域信号的在一个周期内的采样点个数,这个个数不是多一点比较好么?很显然,fft是根据x序列的个数来决定N值的。可是为什么N的不同会造成很大影响呢?还有,不用for写m文件是不是因为这样速度太慢?非常感谢棒棒的答复!

a =

   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
  55.0000


b =

  15.3884
   6.8819



xia

2006-06-17 19:02

不好意思,结果没贴全。如下:

a =

   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
   5.0000
  55.0000


b=

  15.3884
   6.8819



donna

2006-06-18 22:55

你好:
  我是新手,在调用牛顿拉夫申公式时遇到些问题。急得很!
  在子函数中还有变量



donna

2006-06-18 22:58

初值给定时用字母难道不行?


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定