C语言 快速傅立叶变换叶Microsoft Word 文档Word格式.docx
- 文档编号:22547641
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:17
- 大小:98.77KB
C语言 快速傅立叶变换叶Microsoft Word 文档Word格式.docx
《C语言 快速傅立叶变换叶Microsoft Word 文档Word格式.docx》由会员分享,可在线阅读,更多相关《C语言 快速傅立叶变换叶Microsoft Word 文档Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
关键词:
快速傅立叶变换的原理(FFT),离散傅里叶变换,信号的处理及正弦波的和时间轴,频率。
引言
通过我们对快速傅立叶变换的了解,快速傅立叶变换知道它是能够满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。
在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换,快速傅立叶变换(fastfouriertransform简称fft)作为时域和频域转换的分析工具,广泛应用在数字通信、音频信号处理、图像处理、谱估计、雷达信号处理、地震勘探等各领域中。
实现原理
1、算法分析:
(1)在本程序中运用到了for,if....else等的循环语句。
还用到了数组来编辑
(2)在编辑的过程中还用到数组的方法加以编辑,更加易实现。
(3)在fft的软件实现中,比较有名的库有fftpack,mkl及fftw等。
而fft是离散傅立叶变换的快速算法,也可用于计算离散傅立叶变换的逆变换。
快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程,以及正弦波的变换等等。
对于复数序列{x(n)}(n=0,1,2,...,n-1),则该复数序列的离散傅立叶变换为[1]:
x(k)=x(n)w,k=0,1,2,...n-1其中w=e,直接按照上述变换公式的计算复杂度是o(n);
快速傅里叶变换(fft)可以计算出与直接计算相同的结果,但只需要计算复杂度o(nlog(n))。
而实现fft的算法有amdcoremathjmffte,fftw3等,fftw以其在各个平台上的优秀表现,应用相当的广泛。
(5)傅立叶变换是数字信号处理中的基本操作,广泛应用于表述及分析离散时域信号领域。
但由于其运算量与变换点数N的平方成正比关系,因此,在N较大时,直接应用DFT算法进行谱变换是不切合实际的。
然而,快速傅立叶变换技术的出现使情况发生了根本性的变化。
本文主要描述了采用FPGA来实现2k/4k/8k点FFT的设计方法
(6)然而常规的傅立叶变换算法并不适用于嵌入式控制系统,原因是运算量太大(涉及到复数运算),比如离散的傅立叶变换等同于用序列Y(n×
1列矢量)乘以n×
n矩阵Fn,需要n×
n次乘法。
若定义n=1024,则是104,8576次乘法运算。
(7)快速傅立叶变换(FFT)是离散傅立叶变换的快速算法,它是根据离散傅立叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅立叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
(8)设xf(n)为N项的复数序列,FFT只是DFT的一种计算机快速算法,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N2次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。
这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。
继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
(9)由于,在编辑一个程序需要使用的是即快速又简单的方法进行运算,那要即节约时间又能很快的完成编程,那样不是很好吗?
所以说:
就运用了此算法。
2、实现这个算法的技术难点:
(1)用FFT来对处理器要在一个指令周期能完成乘和累加的工作,因为复数运算要多次查表相乘才能实现。
计算过程中的蝶形运算是复数运算,要分开实部和虚部分别计算,想想这是多么繁琐的事情。
我们在win-tc上使用C语言一样可以对复数直接进行加、减、乘、除运算。
而在PC上运算这种类型的算法一般不考虑时间和空间,多一两秒的运行时间不会有什么灾难性的结果。
(2)间接寻址,可以实现增/减1个变址量,方便各种查表方法。
FFT要对原始序列进行反序排列,处理器要有反序间接寻址的能力。
所以,在数字信号的分析处理应用中,DSP比其它的处理器有绝对的优势,因为DSP完全具备以上条件。
这就是单片机(51系列,AVR,PIC等等)或ARM处理器很少用来进行数字信号分析的原因。
(3)正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取,在算法的技术上有一定的难.
3、流程图如下图:
N
Y
N
N
Y
N
4、数据字典:
(1)快速傅立叶程序数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合.它由数据(项、结构、流、存储、处理过程)等五部分组成。
(2)快速傅立叶有处理数据字典(Datadictionary)过程是一种用户可以访问的记录数据库和应用程序元数据的目录。
主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。
被动数据字典是指修改时必须手工更新其内容的数据字典。
数据字典是一个预留空间,一个数据库,这是用来储存信息数据库本身。
然而我们在进行快速傅立叶变换的过程中,是对信号的进行传播,
(3)数据字典则是系统中各类数据描述的集合,是进行详细的数据收集和数据分析所获得的主要成果.
(4)在本次编程的路途中我们运用到的数据有:
输入的点数N1024,2*3.141592654/N等等。
5、开发及运行环境:
Win-TC2.0.
小结
通过对本程序的了解和运用让我知道快速傅立叶变换具有很强的重要性,对于快速傅立叶变换,我们就可以从信号的频域特征去分析信号。
发信号是看尤其在无线通信系统中,傅立叶变换的重要性就更加明显了,无论是设计者还是测试工程师,在工作中都会和傅立叶变换打交道。
它是以波的形式对物体经进形转播得,来实现对数字的出现,以用于在嵌入式系统中实现傅立叶变换。
在编辑的过程中我遇到了很多的问题,就是它的流程图画法是非常的难画,一不细心就会画扎,我做的不是那么让人满意,还需要完善的是执行时所想要看到的东西是否完美。
参考文献
(1)林家翘、西格尔著《自然科学中确定性问题的应用数学》,科学出版社,北京。
原版书名为C.
(2)马维祯,殷瑞祥.DFT(2m)通用递归分解算法.电子学报,1988,16
(2):
43~53
(3)王中德.快速变换的历史与现状.电子学报,1989,17(5):
103~111
(4)章敏晋.图象处理和分析(上册).北京:
清华大学出版社,1999.245~246
(5)胡广书.数字信号处理.北京:
清华大学出版社,1997.82~83
附录(源程序清单)
#include<
stdio.h>
graphics.h>
math.h>
#defineN1024
#definedw2*3.141592654/N
rect()
{
intx,y,i;
for(i=6;
i<
=72;
i+=6)
gotoxy(i/2+25,24);
printf("
%d"
i/6);
}
for(x=0;
x<
=640;
x+=20)
line(x,400-(rand()%50+50),x,360);
setbkcolor(0);
setcolor
(2);
line(630,350,640,360);
line(630,370,640,360);
line(0,360,640,360);
line(x,355,x,360);
line(200,0,210,10);
line(200,0,190,10);
line(200,0,200,480);
for(y=0;
y<
=40;
y+=20)
line(200,y,205,y);
if(getch()==27)exit(0);
}z
wave()
inti,f;
floatx,y,a,b,c,d,e,r;
charch;
for(;
;
)
{
cleardevice();
a=rand()%10000/1000+1.0;
b=1/a;
c=0.0;
d=0.0;
e=0.0;
textcolor
(2);
delay(100);
=getmaxx();
x+=0.1)
putpixel(x,a*sin(b*(x-getmaxx()/2+e)+c)+getmaxy()/2+d,2);
rect();
}
voidmain()
intdriver=DETECT,mode;
inti,k;
longxi=0,xr=0;
floatxf[N];
longxt[N];
floatxfr[N],xfi[N];
longws[N],wc[N];
k="
);
scanf("
&
k);
initgraph(&
driver,&
mode,"
"
for(i=0;
N/2;
i++)
ws[i]=511*sin(dw*i);
N;
{xt[i]=511+511*6*sin(dw*i)+511*2*sin(2*dw*i);
if(i*k<
N)
{if(i*k<
N/2)
N/4)
xr=xr+xt[i]*ws[N/4+i*k];
xi=xi+xt[i]*ws[i*k];
else{xr=xr+xt[i]*(-ws[-N/4+i*k]);
xi=xi+xt[i]*ws[i*k];
else
N*3/4)
{xr=xr+xt[i]*(-ws[-N/4+i*k]);
xi=xi+xt[i]*(-ws[i*k-N/2]);
else{xr=xr+xt[i]*ws[i*k-3*N/4];
{if(i*k%N<
if(i*k%N<
{xr=xr+xt[i]*ws[N/4+i*k%N];
xi=xi+xt[i]*ws[i*k%N];
else{xr=xr+xt[i]*(-ws[-N/4+i*k%N]);
xi=xi+xt[i]*ws[i*k%N];
{xr=xr+xt[i]*(-ws[-N/4+i*k%N]);
xi=xi+xt[i]*(-ws[i*k%N-N/2]);
else{xr=xr+xt[i]*ws[i*k%N-3*4/N];
xfr[k]=2*xr/(N*511.0*511.0);
xr=%f"
xfr[k]);
xfi[k]=2*xi/(N*511.0*511.0);
xi=%f"
xfi[k]);
xf[k]=sqrt(xfr[k]*xfr[k]+xfi[k]*xfi[k]);
printf("
xf[k]=%f"
xf[k]);
getch();
wave();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 快速傅立叶变换叶Microsoft Word 文档 语言 快速 傅立叶 变换 Microsoft
![提示](https://static.bdocx.com/images/bang_tan.gif)