matlab实现DFT和FFT

一、DFT(傅里叶变换)

先说一下自己的编写顺序:
1、先用.m文件编写出DFT
2、再将不同值的x(n)和N代入对比变换
3、将多组相同x(n)的用IDFT和DFT的混合图像表示出来,进行对比分析

编写DFT的流程
捕获.PNG

解释:N和x(n)是输入,X(k)是输出。其中W中的n和k可以建立两个循环嵌套,输出最后的数列X(k)。
不过目前我有一个疑问,那就是如何在这个循环中使其连续输出X(k)形成一个序列,而不是一个最终的数值?

我选择将每一个 数值X(k)转换成一行N-1列的矩阵X(k),然后将其们相加即可得到最终的X(k)

第一次写的DFT函数的代码出现了问题,从网上看见一个下图代码,觉得自己原先的思维太累赘了,索性抛弃后进行新分析。我觉得下面这个代码写的很精彩,对该算法理解的很不错,而且数学语言用的很灵活,长见识了

DFT代码:

function Xk=dft(xn,N)
n=0:N-1;  #x的向量个数
k=0:N-1;  #k的向量个数
WN=exp(-j*2*pi/N); #不加添加剂的W
nk=n’*k;     #’*的意思是先将n转置,再乘k;所得出的矩阵,行=x(n)级同n,列=同k或者说n值不同k相同
WNnk=WN.^nk;
Xk=xn*WNnk; #行向量x(n)×W的第a列后会得出一个数值(非数组),此数值=同一个k(即X(k)中的那个)在∑x(n)×W(不同n),得出的
end

命令窗口

N=8;
x=[ones(1,5),zeros(1,N-5)];
n=0:N-1;
X=dft_succeeded(x,N);
magX=abs(X);  #计算幅值
k=0:N-1;
subplot(2,2,1);stem(n,x);
subplot(2,2,2);stem(k,magX);

此为命令窗口中输入的代码。

1.matlab中默认数组为行向量

图形:
捕获.PNG

————————————————————————————————————————

二、FFT算法

首先,我需要明确

什么是FFT?
是通过什么方式缩减计算量的?
通过W,那么W又是如何缩减的?
通过等效,那么怎么在代码中实现主动等效缩减?

通过W的周期性和对称性实现。

理解以后,写代码很快,但是调试过程会需要一些时间。

如果想要在一个脚本文件定义的函数1里面,调用另一个.m文件中的函数,只需要将这两个.m文件放在同一个目录里:
(目录:就是“路径”的意思)

myfft:

function [Y]=myfft(x,N)
  x_odd=x(1:2:end); #取x函数的奇数
  x_even=x(2:2:end); #取x函数的偶数
  X1=dft_succeeded(x_even,N/2);
  X2=dft_succeeded(x_odd,N/2);
  k=0;
  Z=zeros(1,N); #生成一个一行N列的全0矩阵
for k=1:N/2
  Y1=X2(k)*exp(-1i*k*2*pi/N);
  Xk=X1(k)+Y1;
  Xk2=X1(k)-Y1;
  Z(k)=Xk;  
  Z(k+N/2)=Xk2;#一开始Z(k)括号内表示出错了,错误表示成“2k-1”和“2k”,不过看了蝶形图后就改正过来了。原来对应的是"k""k+N/2"的关系
end
  Y=Z;
end

命令窗口代码:

 n=0:7;
x=[zeros(1,4),ones(1,4)];
subplot(2,1,1);
stem(n,x);
N=32;  #N有32个
y=[x,zeros(1,32-8)];
i=0:N-1;
Y=myfft(y,N);
ax=abs(Y); //取正值
subplot(2,1,2);
stem(i,ax);
图像:
捕获.PNG

三、比较mydft和myfft的时间

1.当N分别为210,220,225时,根据实验内容1,2所编写的函数计算运行时间mydft与myfft,同时计算两者实际用时之并,并将结果与公式(3)的理论计算结果进行比较;

公式(3)

在matlab中实现计数功能

在程序两端加上tic和toc:记住是加在同一个'》'里面
tic的作用是开始计数,而toc的作用是一个计数结束,所以可以多次计数

1)N=210
mydft: t=0.339745s
mydft
myfft: t= 0.169710s
myfft
比值:△t=2.00189<理论计算:136.467

有意思的是,同一个程序代码执行后,所显示的时间都不同,原因是:

tic/toc测量到的数值与操作系统本身的时间精度和运行代码时系统的负载有很大关系。如果需要一个更准确的时间估计的话,最好是将那个函数运行多次取平均值。

我发现我的电脑最大能够处理N=2^14的mydft,再大的话就超内存了

2)N=2^12
mydft: t=5.368491 s
myfft: t= 2.602924s
比值:△t=2.0624847<理论计算:455.05556s
3)N=2^13
mydft: t=24.024326s
myfft: t=10.573246s
捕获2.PNG

比值:△t=2.2721807475<理论计算:840.153846s

4)N=2^14
mydft: t= 115.032158 s
2^14——DFT
myfft: t=45.586973
2^14——FFT
比值:△t=2.5233559<理论计算:1560.33333s
比较后发现,随着N的增大,t(DFT)/t(FFT)的比值是一直2大,但在2附近。而且计算机实际运算的时间远远小于理论计算得出的时间。

四、myfft 时间 vs. matlab的fft时间

5、Matlab函数库中已有fft函数用于计算快速傅立叶变换,当N分别为210,213,214时,试分别用函数myfft和fft计算的傅立叶变换,并对两者的时间进行比较。

1)N=210
myfft: t= 0.169710s
fft: t=0.065144 s
2)N=213
myfft: t=10.573246s
fft: t=0.051153 s
3)N=215
myfft: t= 240.854369s
MYFFT
fft: t= 0.051036 s
FFT
3)N=220&25
fft:
FFT代码

1.对于myfft来说,最大能够到215; 但是fft却可以运算到230。可以观察到matlab自带的fft运算速度远远高于myfft。

2.而且两者的波形也不一样,fft的波形和mydft的波形一致。


五、思考题

1、当x(n)的数据长度不是2的整数幂时,计算FFT该怎么处理?

1)若length(x(n)) < N,则通过x=[x,zeros(1,N-n)],在x后面补0,补到N即可。假设N是2的整数幂
2)若length(x(n)) > N,则通过x=x(1:N),取x中的整数幂个数值形成满足条件的x。

2、是否还有其他的FFT的快速计算算法?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352