📄 库函数.txt
字号:
实验内容:
用c语言实现512点的FFT算法,对给定文件进行FFT变换。
实现方法:利用DSP提供的几个库函数对数据进行变换,在主函数中调用。
调用的库函数有:twidfftrad2_fr16 cabs_fr16 rfft_fr16
以下对这三个库函数的算法进行说明:
1.twidfftrad2_fr16
创建FFT蝶形算法中的旋转因子数组w[]
主要是利用循环,欧拉公式,及角度的对称性对数组的每一项进行赋值
具体就不赘述了。
2.cabs_fr16
用于对FFT结果输出的复数进行求模运算,然后作为整个程序的结果,并画图。
3.cfft_fr16
对复数数据实现快速傅里叶变换的程序。
主要的方法是用三重循环实现整个蝶形运算。
程序的实现流程图如下:
(1)保护现场,保存一些程序中需要用的寄存器数据;
(2)读取一些计算用的初始数据,输入数据复制到输出数组中;
(3)因为按时间抽取的算法第一层的蝶形运算旋转因子都为常数1,故先进行一次蝶形运算,并将运算结果保存到原来的数据段中。
(4)紧接着再进行一次蝶形运算,旋转因子位w[0]和w[n/4]也比较简单,进行原位运算。
(5)判断原始输入数据的长度,=4:直接跳转到结束代码段;=8:跳转到最后一次蝶形运算的代码段;>8:进行三重循环的蝶形运算算法。
(6)最后一次蝶形运算只有一组蝶形运算,是数据的前半部分和后半部分进行对应的运算。
(7)结束程序,恢复现场。
4.rfft_fr16
对实数数据实现快速傅里叶变换的程序。
主体是调用cfft_fr16程序进行复数变换,再将输入实数放入到这些复数中。
最简单的方法是将实数最为复数的实部或虚部,在将n个复数变换,不过这种方法处理的是n个数据,运算量比较大,库函数采用的是下面这种方法:
将原实数数据的偶数部分作为复数的实部,奇数部分作为复数的虚部系数。当然实部和虚部系数是两个相邻的实数组成,这样就得到了一个只有n/2
个复数的数据,再对它进行变换和其他运算,就可得到原始数据的变换,这样的处理使得处理的数据减半,运算量大大减少,是一种优化算法。
程序的实现流程图如下:
(1)进行一些适当的参数处理,以便调用cfft_fr16.
(2)调用cfft_fr16,得到一组数据,里面有n/2个数据。
(3)利用上面的数据得到我们需要的结果,先保护现场。
(4)利用循环的方法,利用缓冲存储空间,分别求出原数据奇偶数项的各自的傅里叶变换结果。
具体是要求出cfft_fr16运行结果中数据的周期性共轭分量和周期性反共轭分量。
(5)由奇偶项的傅里叶变换求出整个数据的变换。这一实现利用了下面这两个公式:
X[k]=X1[k]+w[k]X2[k], X[k+n/2]=X1[k]-w[k]X2[k]
程序中是利用两部分计算,前一部分计算0~n/2的结果,使用循环和各种简单的加减运算实现。
第二部分计算后一半的结果。
(6)程序结束,恢复现场。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -