b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)

电脑杂谈  发布时间:2017-05-09 07:10:28  来源:网络整理

plot([0 : PointNum/2 - 1], x1(1:PointNum/2));

grid on

subplot(3,1,2);

matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法

% [REX IMX]

am = sqrt(abs(REX.*REX) + abs(IMX.*IMX));

plot(0:1:PointNum/2 - 1, am(1:PointNum/2));

grid on

subplot(3,1,3);

plot(t, sampletab);

grid on

我还做了与MATLAB原来带有的FFT做比较:

画出的图如下:

第一个是MATLAB自带的FFT函数频谱图

第二个是我自己设计的FFT频谱图

第三个是信号的时域波形

思想已经有了,我以前也改过人家的FFT的C程序但是不是很理解,打算有机会用C语言实现定点FFT,因为在嵌入式上多数用定点FFT,相应的C++版本应该也会写。

下面是网上的一些设计FFT的资料:

N点基-2 FFT算法的实现方法

从图4我们可以总结出对于点数为N=2^L的DFT快速计算方法的流程:

1.对于输入数据序列进行倒位序变换。

该变换的目的是使输出能够得到X(0)~X(N-1)的顺序序列,同样以8点DFT为例,该变换将顺序输入序列x(0)~x(7)变为如图4的x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7)序列。其实现方法是:假设顺序输入序列一次村在A(0)~A(N-1)的数组元素中,首先我们将数组下标进行二进制化(例:对于点数为8的序列只需要LOG2(8)=3位二进制序列表示,序号6就表示为110)。二进制化以后就是将二进制序列进行倒位,倒位的过程就是将原序列从右到左书写一次构成新的序列,例如序号为6的二进制表示为110,倒位后变为了011,即使十进制的3。第三步就是将倒位前和倒位后的序号对应的数据互换。依然以序号6为例,其互换过程如下:

temp = A(6); A(6) = A(3); A(3) = A(6);

实际上考虑到执行效率,如果对于每一次输入的数据都需要这个处理过程是非常浪费时间的。我们可以采用指向指针的指针来实现该过程,或者是采用指针数组来实现该过程。

2.蝶形运算的循环结构。

从图4中我们可以看到对于点数为N =2^L的fft运算,可以分解为L阶蝶形图级联,每一阶蝶形图内又分为M个蝶形组,每个蝶形组内包含K个蝶形。matlab中fft算法根据这一点我们就可以构造三阶循环来实现蝶形运算。matlab中fft算法编程过程需要注意旋转因子与蝶形阶数和蝶形分组内的蝶形个数存在关联。

3.浮点到定点转换需要注意的关键问题

上边的分析都是基于浮点运算来得到的结论,事实上大多数嵌入式系统对浮点运算支持甚微,因此在嵌入式系统中进行离散傅里叶变换一般都应该采用定点方式。对于简单的DFT运算从浮点到定点显得非常容易。根据式(1),假设输入x(n)是经过AD采样的数字序列,AD位数为12位,则输入信号范围为0~4096。为了进行定点运算我们将旋转因子实部虚部同时扩大2^12倍,取整数部分代表旋转因子。之后,我们可以按照(1)式计算,得到的结果与原结果成比例关系,新的结果比原结果的2^12倍。但是,对于使用蝶形运算的fft我们不能采用这种简单的放大旋转因子转为整数计算的方式。因为fft是一个非对称迭代过程,假设我们对旋转因子进行了放大,根据蝶形流图我们可以发现其最终的结果是,不同的输入被放大了不同的倍数,对于第一个输入x(0)永远也不会放大。举一个更加形象的例子,还是以图4为例。从图中可以看出右侧的X(0)可以直接用下式表示:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-46064-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...