数字信号处理实验FFT快速傅里叶变换C语言.docxVIP

  • 19
  • 0
  • 约9.28千字
  • 约 15页
  • 2017-02-28 发布于重庆
  • 举报

数字信号处理实验FFT快速傅里叶变换C语言.docx

数字信号处理实验FFT快速傅里叶变换C语言

数字信号处理实验(第八章FFT)一、实验内容针对典型序列,用C语言编程实现基2-FFT,并与MATLAB自带的FFT函数的计算结果进行比较。二、实验工具1.VC++6.02.matlab2012三、实验涉及知识图1按时间抽选的基2—FFT算法根据蝶形运算图,如图1,可以看出,一个点基2-FFT运算由n级蝶形运算构成,每一个蝶形结构完成下属基本迭代运算:式中m表示第m列迭代,k,j为数据所在行数。上式的蝶形运算如图2所示。图2四、实验设计思路首先,根据基2-FFT的算法特点,可以整理出程序设计的大致思路。基2-FFT主要运用的就是蝶形运算来降低进行DFT运算时的运算量。因为是基2,所以进行DFT计算的点数N必须的。程序设计中主要解决3个问题,变址运算,复数运算,节点距离运算,及旋转因子的计算。下面对这三个模块进行说明。变址运算由蝶形图我们可以看出,FFT的输出X(k)是按正常顺序排列在存储单元中,即按X(0),X(1),…,X(7)的顺序排列,但是这时输入x(n)却不是按自然顺序存储的,而是按x(0),x(4),…,x(7)的顺序存入存储单元,所以我们要对输入的按正常顺序排列的数据进行变址存储,最后才能得到输出的有序的X(K)。通过观察,可以发现,如果说输出数据是按原位序排列的话,那么输入数据是按倒位序排列的。即如果输入序列的序列号用二进制数,则到位序就为。我们需将输入的数据变为输出的倒位序存储,这里用雷德算法来实现。下面给出雷德算法。假如使用A[I]存的是顺序位序,而B[J]存的是倒位序。例如 ? N = 8 的时候,倒位序顺序 ? ? ? ? ?二进制表示 ? ? ?倒位序顺序0 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 000 ? ? ? ??0004 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100 ? ? ? ? 0012 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 010 ? ? ? ? 010 ? ? ? ? ??6 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 110 ? ? ? ? 0111 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 001 ? ? ? ? 1005 5 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 101 ? ? ? ? 1013 6 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 011 ? ? ? ? 1107 7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 111 ? ? ? ? 111由上面的表可以看出,按自然顺序排列的二进制数,其下面一个数总是比其上面一个数大1,即下面一个数是上面一个数在最低位加1并向高位进位而得到的。而倒位序二进制数的下面一个数是上面一个数在最高位加1并由高位向低位进位而得到。I、J都是从0开始,若已知某个倒位序J,要求下一个倒位序数,则应先判断J的最高位是否为0,这可与k=N/2相比较,因为N/2总是等于100..的。如果kJ,则J的最高位为0,只要把该位变为1(J与k=N/2相加即可),就得到下一个倒位序数;如果K=J,则J的最高位为1,可将最高位变为0(J与k=N/2相减即可)。然后还需判断次高位,这可与k=N\4相比较,若次高位为0,则需将它变为1(加N\4即可)其他位不变,既得到下一个倒位序数;若次高位是1,则需将它也变为0。然后再判断下一位。复数运算由于每一个蝶形结构完成的迭代运算为算式中涉及到了复数的运算,而计算机是不能自己实现复数运算的,所以需要我们自己设计进行复数运算的程序。迭代运算式中,= cos(2πr/N)- jsin(2πr/N)我们设 = R(j) + jI(j), = R(K) + jI(K) ,而我们最后希望得到的DFT结果是复数的模,根据它的模来绘制频谱,所以这里我们定义X(k)=相关程序我们编译为:c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real;根据迭代运算的式子,我们可以将其分解为:R(K)+jI(K)=R(K)+jI(K)+[ R(j) + jI(j)]*[ cos(2πr/N)-jsin(2πr/N)];继续分解得到下列两式: R(K)= R(K)+ R(j) cos(2πr/N)+ I(j) sin (2πr/N) I(K)=I(K)-R(j) sin(2πr/N)+I(j)cos (2πr/N) 同理R(j)= R(K)- R(j) cos(

文档评论(0)

1亿VIP精品文档

相关文档