Spire 发表于 2009-5-4 17:31

使用matlab编写fft函数

闲来无事,自己写了一个fft函数的程序,写完之后与matlab自带的fft进行比较,结果不正确,不知道我的程序里面出现了什么问题,请高手指点一二。程序在附件里。

Spire 发表于 2009-10-12 16:46

居然这么久都没有人来看这个帖子。
这个问题已经解决了。

ChaChing 发表于 2009-10-12 22:56

回复 沙发 Spire 的帖子

怎没人来看这个帖子? 不是破百了!:@)
而且LZ的副档应该直接贴, 不然我的系统开启会乱码
还有可以的话建议LZ与大家分享你的成果, 做个结束!

[ 本帖最后由 ChaChing 于 2009-10-12 23:01 编辑 ]

Spire 发表于 2009-10-13 09:22

贴出程序,希望对大家有帮助。不过人们都用自带的fft函数,谁会用这个呢,哈

clear; clc;

for kk=1:1024; %%生成一个含有1024个数的数组data(正式使用的时候load文件)
   data(kk)=kk;
end


N=1024; %%数组总元素个数
n=10; %%2的幂指数,也就是2^10=1024,n也等于快速傅里叶变换时的总行数
j=1; %%初始化j,方便在变换数组元素次序的时候使用

for ii=1:N %%这个for循环的结果使原来数组次序改变,如数组1 2 3 ……14 15 16经过此循环以后变为
%%以下次序:1 9 5 13 3 11 7 15 2 10 6 14 4 12 8 16
if j>ii
   temp=data(j); data(j)=data(ii); data(ii)=temp;
end
m=N/2;
while m>=2 && j>m-1
   j=j-m; m=m/2;
end
j=j+m;
end

a=data; %%将变换次序以后的数组赋值给a

%%以下是蝴蝶算法
for r=1:n %%最外层循环是蝴蝶算法的总行数
M=2^(n-r); %%M为第r行的组数(比如第一行有2^(n-1)组,第二行有2^(n-2)组……最后一行只有一组)
for m=1:M %%m为当前计算所在的行数
%%以下两个for循环处于嵌套循环的最内层,在同一组内,前一半的计算公式和后一半的计算公式不一样
for j=1:(2^(r-1))
W=cos(pi*(j-1)/2^(r-1))-i*sin(pi*(j-1)/2^(r-1));
b(j+(m-1)*(2^(r)))=a(j+(m-1)*(2^(r)))+W*a(j+(2^(r-1))+(m-1)*(2^(r)));
end
for j=(2^(r-1)+1):(2^r)
W=-cos(pi*(j-1-2^(r-1))/2^(r-1))+i*sin(pi*(j-1-2^(r-1))/2^(r-1));
b(j+(m-1)*(2^(r)))=a(j-(2^(r-1))+(m-1)*(2^(r)))+W*a(j+(m-1)*(2^(r)));
end
end
%%用新的数组b覆盖原来的数组a,用于下一行的计算
for j=1:N, a(j)=b(j); end
end


[ 本帖最后由 ChaChing 于 2009-10-13 11:57 编辑 ]

xushuai0794 发表于 2009-10-16 09:37

我挺欣赏楼住的,我喜欢你这种追根就地的性格,这才是真正的学习:@D :@D

ChaChing 发表于 2009-10-16 11:59

其实代码可以优化下, 如
for kk=1:1024, data(kk)=kk; end
可改为data=; ...

Spire 发表于 2009-10-27 08:52

谢谢楼上二位!
页: [1]
查看完整版本: 使用matlab编写fft函数