汇编语言实现的FFT算法

合集下载

dsp11

dsp11

; AR3
1 st original input
;累加原始数据到 A ;A右移8位,即A/256,输入数据取平均
; AR3
1 st original input
;B=A-(*FFT_INPUT) ;B=(*FFT_INPUT)-A,即将原始数据去除直流分量 ;除以2以防止溢出后存入原址
②将输入序列位倒序存储,以使算法结束后的输出序列为自然顺序。 首先,将 2N 点的实输入序列拷贝到标记为 FFT_ORIGIN 的连续内存空间中,理解为一 个 N 点的复数序列 d(n)。时序列中索引为偶数的作为 d(n)的实部,索引为奇数的作为 d(n) 的虚部。这一部就是压缩。然后,将得到的复数序列位倒序存储到数据处理缓冲区 fft_data。 0C00h 0C01h 0C02h 0C03h …… 0CFCh 0CFDh 0CFEh 0CFFh R(0)=a(0) I(0)=a(1) R(64)=a(128) I(64)= a(129) …… R(63)=a(126) I(63)=a(127) R(127)=a(254) I(127)=a(255) 0D00h 0D01h 0D02h 0D03h …… 0DFCh 0DFDh 0DFEh 0DFFh a(0) a(1) a(2) a(3) …… a(252) a(253) a(254) a(255)
2
中的,其中的C语言程序如下: #include<stdio.h> # include<stdib.h> int signal(int x)(方波子程序) {int t=x%8; if(t<=3)return 1; else return –1; } void main0 { int i,j,k; FILE*fp; Int mm[256]; for(i=0;i<=255;i++) mm[i]=(sin(3.141593536*i/4+3.1414/16)*(-32768)/2);正弦波程序 //mm[i]=signal(i)*(-32768)/2; k=0; for(i=0;i<=255;i++) { fp=fopen(“sinsin.txt”, “a”); if(k%8=0) fprintf(fp, “\n .word”); fprintf(fp, “0%xh,”mm[i]); fclose(fp); k++; }} 在程序中由于要用到位到序地址计算,如果用汇编则必须使得所分的首地址为整数, 为避免这种情况,采用查表的方法进行位地址的计算,而该表也是由 C 语言生成的其程序 如下: #include<stdio.h> #include<stdib.h> #include<math.h> void main0 { int num[256],i,m=0,n,k,q; FILE*fp; for(i=0;i<=255;i++) {num[i]=I; printf(“%d,”,num[i]); } for(i=0;i<=255;i++) { q=num[i]; for(k=0;k<=7;k++) {

4套DSP(数字信号处理)经典考试试卷

4套DSP(数字信号处理)经典考试试卷

39~32保护位31~16高阶位15~0低阶位11、填空题(共30分,每空1分)1.DSP的狭义理解为数字信号处理器,广义理解为数字信号处理方法。

2.在直接寻址中,指令代码包含了数据存储器地址的低 7 位。

当ST1中直接寻址编辑方式位CPL =0 时,与DP相结合形成16位数据存储器地址;当ST1中直接寻址编辑方式位CPL =1 时,加上SP基地址形成数据存储器地址。

3.TMS320C54有两个通用引脚,BIO和XF, BIO 输入引脚可用于监视外部接口器件的状态; XF 输出引脚可以用于与外部接口器件的握手信号。

4.累加器又叫做目的寄存器,它的作用是存放从ALU或乘法器/加法器单元输出的数据。

它的存放格式为5.桶形移位器的移位数有三中表达方式:立即数; ASM ;T低6位6.DSP可以处理双16位或双精度算术运算,当 C16=0 位双精度运算方式,当 C16=1为双16位运算方式。

7.复位电路有三种方式,分别是上电复位;手动复位;软件复位。

8.立即数寻址指令中在数字或符号常数前面加一个 # 号,来表示立即数。

9.位倒序寻址方式中,AR0中存放的是 FFT点数的一半。

10.一般,COFF目标文件中包含三个缺省的段:.text 段;.data 段和.bss 段。

11.汇编源程序中标号可选,若使用标号,则标号必须从第一列开始;程序中可以有注释,注释在第一列开始时前面需标上星号或分号,但在其它列开始的注释前面只能标分号。

12.’C5402有23条外部程序地址线,其程序空间可扩展到 1M ,内程序区在第0页。

13.指令执行前有关寄存器及数据存储器单元情况如下图所示,请在下图分别填写指令执行后有关寄存器及数据存储器单元的内容。

ADDA 00 00002700 C 1 C 1AR3 0101AR3 01000100h 15000100h 1500*AR3+,14,AA 00 00001200数据存储器2、 简答(共40分)1. TMS320C54x 有多少条16位总线?这些总线各有什么作用?(6分)答:’C54x 共有4组8条16位总线1条程序总线(PB ):传送取自程序存储器的指令代码和立即操作数。

(完整word版)基于DSP的快速傅立叶变换(FFT)的实现(汇编语言)

(完整word版)基于DSP的快速傅立叶变换(FFT)的实现(汇编语言)

快速傅立叶变换(FFT )的实现一、实验目的1.了解FFT 的原理及算法;2.了解DSP 中FFT 的设计及编程方法;3.熟悉FFT 的调试方法;二、实验原理FFT 是一种高效实现离散付立叶变换的算法,把信号从时域变换到频域,在频域分析处理信息。

对于长度为N 的有限长序列x (n ),它的离散傅里叶变换为:(2/)j N nk N W e π-=,称为旋转因子,或蝶形因子。

在x (n )为复数序列的情况下,计算X (k ):对某个k 值,需要N 次复数乘法、(N -1)次复数加法;对所有N 个k 值,需要2N 次复数乘法和N (N -1)次复数加法。

对于N 相当大时(如1024)来说,直接计算它的DFT 所作的计算量是很大的,FFT 的基本思想在于: 利用2()j nk N N W e π-=的周期性即:k N k N N W W +=对称性:/2k k N N N W W +=-将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。

按时间抽取的FFT ——DIT FFT 信号流图如图5.1所示:图5.1 时间抽取的FFT —DIT FFT 信号流图FFT 算法主要分为以下四步。

第一步 输入数据的组合和位倒序∑=-=10)()(N n nk N W n x k X把输入序列作位倒序是为了在整个运算最后的输出中得到的序列是自然顺序。

第二步 实现N 点复数FFT第一级蝶形运算;第二级蝶形运算;第三级至log2N 级蝶形运算;FFT 运算中的旋转因子N W 是一个复数,可表示:为了实现旋转因子N W 的运算,在存储空间分别建立正弦表和余弦表,每个表对应从0度到180度,采用循环寻址来对正弦表和余弦表进行寻址。

第三步 功率谱的计算X (k )是由实部()R X k 和虚部()I X k 组成的复数:()()()R I X k X k jX k =+;计算功率谱时只需将FFT 变换好的数据,按照实部()R X k 和虚部()I X k 求它们的平方和,然后对平方和进行开平方运算。

fft算法原理

fft算法原理

fft算法原理FFT算法是快速傅里叶变换( Fast Fourier Transform)的缩写,它是一种高效的计算离散傅里叶变换(DFT)的方法。

傅里叶变换是一种将一个时域信号转换为频域信号的数学技术,广泛应用于信号处理、图像处理、通信等领域。

FFT算法的核心思想是将一个N点的DFT分解为多个较小规模的DFT运算。

具体而言,假设输入序列为x(n),其中n表示时间(或空间)上的一个离散点。

FFT算法将输入序列分为偶数下标和奇数下标的子序列,分别进行递归的FFT运算。

然后将结果重新组合,得到原始序列的DFT。

首先将输入序列x(n)分为两个子序列x_odd(n)和x_even(n),其中偶数下标的元素属于x_even(n),奇数下标的元素属于x_odd(n)。

然后分别对这两个子序列进行递归的FFT运算,得到两个部分的DFT结果X_odd(k)和X_even(k)。

然后将这两个部分的DFT结果重新组合,得到整个输入序列x(n)的DFT结果X(k)。

具体而言,可以利用旋转因子的性质,将X_odd(k)和X_even(k)重新组合成为X(k)的一半。

具体的计算公式如下:X(k) = X_even(k) + W_N^k * X_odd(k)X(k+N/2) = X_even(k) - W_N^k * X_odd(k)其中,k表示频域的一个离散点,取值范围为0到N/2-1;N表示输入序列的长度;W_N表示旋转因子,计算公式为W_N^k = e^(-j*2π*k/N)。

通过递归的方式,FFT算法可以将一个N点的DFT计算时间复杂度从O(N^2)降低为O(NlogN),大大提高了计算效率。

总之,FFT算法利用分治思想将一个N点的DFT分解为多个较小规模的DFT运算,并通过旋转因子的性质将结果重新组合,从而实现快速的傅里叶变换计算。

它在信号处理和频谱分析等领域得到了广泛的应用,并成为了现代科学和工程中的重要算法之一。

基于DSP的通用FFT算法在电网谐波检测中的应用

基于DSP的通用FFT算法在电网谐波检测中的应用

[ 摘 要 ] 随 着 D P在 数 字化 处理和数 字控 制 系统领 域 日渐成 为一 项成 熟的技 术 , 种基 于 D P S 一 S
的快 速傅 立叶 变换 ( F ) 实现 方法被提 出。该 算 法采 用汇 编语 言 实现 , 采 用 目前控 制领 域 最 FT 的 r 并
高性 能 的处理 器 T S 2 F 8 X系列 D P对 采 样信 号进 行 FT 算 , 快速 检 测 出 电网 中三 相 电 M 30 2 1 S F r运 能 压、 电流 的各 次谐波 , 以进行 谐 波 的 实 时分析 处理 。通 过 实验 和现 场运 行 , 证 了算 法 的正 确性 验 和 高速性 , 可作 为一种 通 用的 算法应 用 于谐 波检 测 。 [ 键词 ] D P F ; 波检 测 关 S ;FT 谐 r [ 中图分 类号 ] T 3 P3 2 [ 文献标 识码 ] A [ 文章 编号 ] 10 .30 20 )302 .5 050 1 (07 0.0 80
及 家庭 中 的应 用 日益广泛 , 波所 造 成 的危 害 日趋 谐 严 重…。世 界各 国都对谐 波 问题 予 以充 分 的关 注 。
国际上 召开 了多次 有关谐 波 问题 的学 术 会议 , 少 不
计算 处 理 能力 和 A M 完 善 的 显 示 功 能研 发 而 成 R 的 。该 便携 式 电能 质 量 监 测分 析 仪 能 实 时 提供 电 压、 电流 、 功功 率 、 功功 率 、 有 无 功率 因素 、 率 等 电 频
基 于 A M 40 + T 最 新 定 点 R 21 I D P 芯 片 S
2 0世纪 7 0年 代 以来 , 由于 电 力 电子 技 术 的飞 速发展 , 各种 电力 电子装 置在 电力 系统 、 工业 、 通 交

fft算法c语言实现

fft算法c语言实现

fft算法c语言实现快速傅里叶变换(FFT)是一种高效的离散傅里叶变换算法,用于计算信号在频域的表示。

下面是一个简单的使用 C 语言实现的 FFT 算法示例,它可以用于对输入的时域信号进行离散傅里叶变换。

```c#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 16// 复数结构体typedef struct {double real;double imag;} Complex;// 初始化复数void initComplex(Complex *c, double real, double imag) {c->real = real;c->imag = imag;}// FFT 算法void fft(Complex *c, int n) {int i, j, k;Complex w, u, v;// 层次遍历for (i = 1; i < n; i <<= 1) {// 旋转因子w.real = cos(2 * M_PI * i / n);w.imag = -sin(2 * M_PI * i / n);for (j = 0; j < n; j += i) {for (k = 0; k < i / 2; k++) {u.real = c[j + k].real;u.imag = c[j + k].imag;v.real = c[j + i / 2 + k].real;v.imag = c[j + i / 2 + k].imag;c[j + k].real = u.real + w.real * v.real - w.imag * v.imag; c[j + k].imag = u.imag + w.real * v.imag + w.imag * v.real; c[j + i / 2 + k].real = u.real - w.real * v.real + w.imag * v.imag; c[j + i / 2 + k].imag = u.imag - w.real * v.imag - w.imag * v.real; }}}}// 打印复数void printComplex(Complex c) {printf("%f + %fi\n", c.real, c.imag);}int main() {Complex c[N];// 输入的时域信号for (int i = 0; i < N; i++) {c[i].real = rand() / RAND_MAX;c[i].imag = rand() / RAND_MAX;}printf("输入的时域信号:\n");// 打印输入的时域信号for (int i = 0; i < N; i++) {printComplex(c[i]);}fft(c, N);printf("经过 FFT 变换后的频域信号:\n");// 打印经过 FFT 变换后的频域信号for (int i = 0; i < N; i++) {printComplex(c[i]);}return 0;}```上述代码是一个简单的 C 语言实现的 FFT 算法示例。

利用汇编语言进行F2812编程实现FFT分析常用的库文件-7

利用汇编语言进行F2812编程实现FFT分析常用的库文件-7
; void (*calc)(void *);
; void (*mag)(void *);
; void (*win)(void *);
; }FFTxxxC;
; FFT - Computation Routine (FFT128R_calc)
;===============================================================================
; * This routine takes the 128 point complex data sequence, in bit
; Originator : Advanced Embeeded Control
; Texas Instruments Inc.
;
; Description : This file contain source code for complex FFT
.def _CFFT32_calc
COS45K_LSW .set 799Bh
COS45K_MSW .set 5A82h
;===============================================================================
Xr(0),Xi(0),Xr(1),Xi(1)...Xr(127)&Xi(127)
;===============================================================================
;
; void FFT128C_init(void)
; This function copies the Twiddle factors from load time address to

FFT算法及IIR、FIR滤波器的设计资料

FFT算法及IIR、FIR滤波器的设计资料

《DSP原理及其应用》实验设计报告实验题目:FFT算法及滤波器的设计摘要随着信息科学的迅猛发展,数据采集与处理是计算机应用的一门关键技术,它主要研究信息数据的采集、存储和处理。

而数字信号处理器(DSP)芯片的出现为实现数字信号处理算法提供了可能。

数字信号处理器(DSP)以其特有的硬件体系结构和指令体系成为快速精确实现数字信号处理的首选工具。

DSP芯片采用了哈佛结构,以其强大的数据处理功能在通信和信号处理等领域得到了广泛应用,并成为研究的热点。

本文主要研究基于TI的DSP芯片TMS320c54x的FFT算法、FIR滤波器和IIR滤波器的实现。

首先大概介绍了DSP和TMS320c54x的结构和特点并详细分析了本系统的FFT变换和滤波器的实现方法。

关键词:DSP、TMS320c54x、FFT、FIR、IIRAbstractWith the rapid development of information science, data acquisition and processing is a key technology of computer applications, the main research of it is collection, storage and processing of information data. The emergence of the digital signal processor (DSP) chip offers the potential for the realization of the digital signal processing algorithm. Digital signal processor (DSP), with its unique hardware system structure and instruction system become the first tool of quickly and accurately realize the digital signal processing.DSP chip adopted harvard structure, with its powerful data processing functions in the communication and signal processing, and other fields has been widely applied, and become the research hot spot.This paper mainly studies the FFT algorithm based on TMS320c54x DSP chip of TI, the realization of FIR filter and IIR filter. First introduced the DSP and TMS320c54x briefly, then analyzed in detail the structure and characteristics of the system of the realization of FFT transform and filter method.Keyword: DSP、TMS320c54x、FFT、FIR、IIR1.绪论1.1课题研究的目的和意义数字信号处理器(DSP)已经发展了多20多年,最初仅在信号处理领域内应用,近年来随着半导体技术的发展,其高速运算能力使很多复杂的控制算法和功能得以实现,同时将实时处理能力和控制器的外设功能集于一身,在控制领域内也得到很好的应用。

FFT算法

FFT算法

{O.O,-1.O},{-0.707107,-0.707107}}; //8点FFT的W参数
struct compx EE(struct compx,struct com compx,int);
//FFT函数申明
main()
{FFT(s,8);}
因子WN内在的对称性和周期性,从而大大加快了运算 的速度。
第2页
2021/12/8
在基数为2的FFT中,设N=2M,则总共有M级运算,每级中有N/2个2点FFT 蝶形运算。基2的DIT FFT蝶形如图11.16所示。
图11.16 基2的DIT FNF蝶形运算
第3页
2021/12/8
图11.17是8点DIT FFT的一种信号流图。
第5页
2021/12/8
#include “math.h”
struct compx{float real;float imag;}; //复数结构体定义
struct compx s[9];
//FFT输入和输出,均从s[1]开始存放
struct compx iw[4]={{1.0,0.0 },{O.707107,-0.707107},
语音信号及单片机处理
FFT算法
DFT是连续傅立叶变换的离散形式。模拟信号x(t)的连续 时间傅立叶变换可以表示为:
X (w) x(t)e jwtdt
x(t)经抽样后变为x(nT),T为抽样周期。离散信号x(nT)的 傅立叶变换可以表示为:
N 1
X (k ) x(n)WNnk n0
式中, WN e, j称2为/ N蝶形因子FFT算法利用了蝶形
xin[i].real=xin[i].real+t.real;
xin[i].imag=xin[i].imag+t.imag;

FFT算法详解

FFT算法详解

FFT算法详解快速傅里叶变换(Fast Fourier Transform, FFT)算法是一种高效的计算离散傅里叶变换(Discrete Fourier Transform, DFT)的方法,广泛应用于信号处理、图像处理、通信等领域。

本文以详细的解释为主,全面讲解FFT算法。

傅里叶变换将一个信号从时域转换到频域,即将信号表示为不同频率分量的叠加。

如果信号为离散的,则称为离散傅里叶变换(DFT)。

DFT 的计算复杂度为O(N^2),其中N是信号的长度。

然而,通过观察DFT的计算过程,我们可以发现其中存在着很多重复计算。

FFT算法就是通过减少这些重复计算的方式,降低了DFT的计算复杂度到O(NlogN)。

FFT算法的核心思想是DFT分治思想,将DFT递归地分解为更小的DFT,最终合并得到原始信号的DFT结果。

具体来说,FFT算法将长度为N 的信号分为两半,分别计算这两部分信号的DFT,然后再将它们合并成N/2个长度为2的DFT,重复这个过程直到计算得到最小粒度的DFT。

假设N为2的整数次幂,一个长度为N的信号X可以表示为X=x[0],x[1],...,x[N-1]。

FFT的计算可以分为两个步骤:分解和合并。

分解步骤:1.如果N=1,直接返回x;2.将长度为N的信号X分为两半,分别记作X0和X1,其中X0=x[0],x[2],...,x[N-2],X1=x[1],x[3],...,x[N-1];3.对X0和X1分别递归地执行FFT计算,得到长度为N/2的结果Y0和Y1;4.构造长度为N的结果Y,其中Y[k]=Y0[k]+W_N^k*Y1[k],其中W_N=e^(-2πi/N),0<=k<N/2;5.返回Y。

合并步骤:将长度为N/2的结果Y0和Y1合并为长度为N的结果Y,其中Y[k]=Y0[k]+W_N^k*Y1[k],其中W_N=e^(-2πi/N),0<=k<N/2通过分解和合并的操作,FFT算法可以高效地计算DFT。

FFT算法设计(含程序设计)

FFT算法设计(含程序设计)

FFT算法设计(含程序设计)FFT算法设计(含程序设计)一、概述FFT(快速傅里叶变换)是一种高效的计算DFT(离散傅里叶变换)的算法,它可以将一个长度为N的复数序列在O(NlogN)的时间复杂度内进行变换。

FFT广泛应用于信号处理、图像处理、通信系统等领域。

二、FFT算法原理1. DFT的定义离散傅里叶变换(DFT)用于将一个时域上的离散信号转换为频域上的复数序列。

对于长度为N的输入序列x(n),DFT的定义如下:![DFT公式](_GAurfrs2PgxzRvUZ6PhAA.png)其中,W是N次单位根的复数。

2. FFT的基本思想FFT是通过分治法将一个长度为N的DFT问题分解成多个长度小于N的DFT问题来求解的。

其基本思想如下:当N为奇数时,将输入序列分成两部分,奇数下标部分和偶数下标部分;分别对奇数下标部分和偶数下标部分进行长度为N/2的DFT变换;利用旋转因子进行结果合并。

通过以上步骤,可以将一个长度为N的DFT问题转化为两个长度为N/2的DFT问题。

3. 快速傅里叶变换的递归算法快速傅里叶变换(FFT)是一种基于递归的计算DFT的算法。

其基本过程如下:若N=1,则直接返回输入序列作为结果;将输入序列分成两部分,奇数下标部分和偶数下标部分;对奇数下标部分和偶数下标部分分别进行FFT变换;利用旋转因子进行结果合并。

通过递归的方式,可以将一个长度为N的DFT问题分解为多个长度为1的DFT问题,从而实现FFT的求解。

三、FFT算法实现下面是一个基于C语言的FFT算法的实现示例:cinclude <stdio.h>include <math.h>include <complex.h>define PI 3.149323846void fft(complex double x, int n) {if (n == 1) {return;}complex double odd = malloc(sizeof(complex double) (n / 2));complex double even = malloc(sizeof(complex double) (n / 2));for (int i = 0; i < n / 2; i++) {even[i] = x[2 i];odd[i] = x[2 i + 1];}fft(odd, n / 2);fft(even, n / 2);for (int k = 0; k < n / 2; k++) {complex double t = cexp(-I 2 PI k / n) odd[k];x[k] = even[k] + t;x[k + n / 2] = even[k] t;}free(odd);free(even);}int mn() {int n;printf(\。

(完整word版)fft算法代码注释及流程框图

(完整word版)fft算法代码注释及流程框图
typedef struct
{
double real;
double img;
}complex; //定义复数型变量的结构体
void fft(); //快速傅里叶变换函数声明
void initW(); //计算W(0)~W(size_x-1)的值函数声明
void change(); //码元位置倒置函数函数声明
scanf("%d",&size_x);
printf("Please input the data in x[N]:(such as:5 6)\n"); /*输入序列对应的值*/
for(i=0;i<size_x;i++)
scanf("%lf %lf",&x[i].real,&x[i].img);
initW(); //计算W(0)~W(size_x-1)的值
}
}
void change() //输入的码组码位倒置实现函数
{
complex temp;
unsigned short i=0,j=0,k=0;
double t;
for(i=0;i<size_x;i++)
{
k=i;
j=0;
t=(log(size_x)/log(2));
while((t--)>0)
{
j=j<<1;
printf("\n");
else
printf("-j%.4f\n",fabs(x[i].img));
//如果虚部的值小于-0.0001,输出-jx.img的形式
}

FFT快速算法C程序

FFT快速算法C程序

FFT快速算法C程序FFT(快速傅里叶变换)算法是一种用于计算离散傅里叶变换的高效算法。

它通过分治策略将长度为N的序列递归地分解为两个长度为N/2的子序列,然后将计算结果合并在一起。

这个算法的时间复杂度为O(NlogN),比传统的DFT(离散傅里叶变换)算法要高效许多。

以下是一个使用C语言实现的FFT算法的示例代码:#include <stdio.h>#include <math.h>//定义复数类型typedef structdouble real;double imag;//计算序列长度为N的FFTif (N <= 1)return;}//将输入序列划分为偶数项和奇数项for (int i = 0; i < N/2; i++)even[i] = x[2*i];odd[i] = x[2*i+1];}//递归计算偶数项和奇数项的FFTFFT(even, N/2);FFT(odd, N/2);//计算每个频谱点的值for (int k = 0; k < N/2; k++)W.real = cos(2*M_PI*k/N);W.imag = -sin(2*M_PI*k/N);t.real = W.real * odd[k].real - W.imag * odd[k].imag; t.imag = W.real * odd[k].imag + W.imag * odd[k].real; x[k].real = even[k].real + t.real;x[k].imag = even[k].imag + t.imag;x[k+N/2].real = even[k].real - t.real;x[k+N/2].imag = even[k].imag - t.imag;}//输出复数序列for (int i = 0; i < N; i++)printf("(%f + %fi) ", x[i].real, x[i].imag);}printf("\n");int maiint N = 4;x[0].real = 1;x[0].imag = 0;x[1].real = 2;x[1].imag = 0;x[2].real = 3;x[2].imag = 0;x[3].real = 4;x[3].imag = 0;printf("输入序列: ");FFT(x,N);printf("FFT结果: ");return 0;以上代码实现了一个简单的FFT算法,通过输入一个长度为N的复数序列,计算其FFT结果并输出。

FFT的C语言算法实现

FFT的C语言算法实现

FFT的C语言算法实现FFT算法的基本思想是将一个N点离散信号转换成N个频率分量。

它使用了分治思想,通过递归将问题分解为较小规模的子问题,最终合并子问题的结果得到最终结果。

以下是FFT的C语言算法实现:```#include <stdio.h>#include <math.h>//计算复数的实部double real(double x)return x;//计算复数的虚部double imag(double x)return -x; // i的平方为-1//复数相加return a + b;//复数相乘return a * b;//快速傅里叶变换主函数void fft(double* real_input, double* imag_input, int N, double* real_output, double* imag_output)//如果输入序列长度为1,直接返回if (N == 1)real_output[0] = real(real_input[0]);imag_output[0] = imag(imag_input[0]);return;}//创建长度为N/2的偶数序列和奇数序列输入double* even_real_input = (double*)malloc(sizeof(double) * (N/2));double* even_imag_input = (double*)malloc(sizeof(double) * (N/2));double* odd_real_input = (double*)malloc(sizeof(double) * (N/2));double* odd_imag_input = (double*)malloc(sizeof(double) * (N/2));//将输入序列按奇偶分组for (int i = 0; i < N/2; i++)even_real_input[i] = real_input[2*i];even_imag_input[i] = imag_input[2*i];odd_real_input[i] = real_input[2*i+1];odd_imag_input[i] = imag_input[2*i+1];}//计算偶数序列的FFTdouble* even_real_output = (double*)malloc(sizeof(double) * (N/2));double* even_imag_output = (double*)malloc(sizeof(double) * (N/2));fft(even_real_input, even_imag_input, N/2, even_real_output, even_imag_output);//计算奇数序列的FFTdouble* odd_real_output = (double*)malloc(sizeof(double) * (N/2));double* odd_imag_output = (double*)malloc(sizeof(double) * (N/2));fft(odd_real_input, odd_imag_input, N/2, odd_real_output, odd_imag_output);//合并子问题的结果for (int i = 0; i < N/2; i++)double k_real = cos(2 * M_PI * i / N);double k_imag = sin(2 * M_PI * i / N);}//释放内存free(even_real_input);free(even_imag_input);free(odd_real_input);free(odd_imag_input);free(even_real_output);free(even_imag_output);free(odd_real_output);free(odd_imag_output);int mai//测试数据double real_input[] = {1, 2, 3, 4};double imag_input[] = {0, 0, 0, 0};int N = sizeof(real_input) / sizeof(double);double* real_output = (double*)malloc(sizeof(double) * N); double* imag_output = (double*)malloc(sizeof(double) * N);fft(real_input, imag_input, N, real_output, imag_output);//输出傅里叶变换结果for (int i = 0; i < N; i++)printf("%.2f + %.2fi\n", real_output[i], imag_output[i]);}//释放内存free(real_output);free(imag_output);return 0;```在FFT函数中,先判断输入序列的长度,如果长度为1,直接返回结果。

dsp_实现FFT报告

dsp_实现FFT报告

实验报告一、实验目的学习和掌握FFT 的定点DSP 实现原理及C28X 编程的技巧,并通过CCS 的图形显示工具,观察输入/输出信号波形以及它们的频谱变化。

二、实验要求在CCS 环境中用汇编语言,编写实现FFT 的程序及连接器命令文件,编译调试程序,并通过CCS 的图形显示工具观察输入/输出信号波形以及频谱变化。

三、实验原理(1) 位反转在DIF-FFT 蝶形运算结构中,输出X(k)按正常顺序存放在存储单元中,即按X(0)、X(1)、X(2)、…X(6)、X(7)的顺序排列,输入x(n)是按x(0)、x(4)、x(2) …x(3)、x(7)的顺序进行寻址。

反转实现用“*BR0++”寻址方式即可。

(2) 蝶形运算如果蝶形运算的两个输入相距B 个点,应用原位运算,则P N L L L W B J X J X J X )()()(11++⇐-- P N L L L W B J X J X B J X )()()(11+-⇐+--式中,第L 级的旋转因子指数LM J p -•=2,12...2,1,01-=-L J ,L=1,2, …, M=log 2N, B=12-L(3) 基2DIT-FFT 运算流图(3)算法流程图四、实验环境软件环境:CCS3.1硬件环境:无五、实验过程、数据记录、处理及结论1、实验步骤本实验需要使用C28X汇编语言来实现FFT,并通过CCS的图形显示工具观察输入\输出信号波形以频谱的变化。

实验步骤如下:(1) 启动CCS,通过project创建工程文件。

(2) 编写CMD文件和汇编源程序。

(3) 编译、连接、单步执行,检查程序的语法错误,检查程序逻辑错误。

(4) 完成编译、连接。

然后选择File/Load Program命令将OUT文件装入。

点RUN启动程序运行。

(5) 借助view/Graph 设置观察波形,并记录。

2、波形记录输入单频正弦波,起始地址FirstIn 。

波形图一所示,他的频谱如图二所示图一图二输出单频正弦波频谱,起始地址V AR_FIRST,波形如图三所示图三3、实验结论输入单频正弦波结果输出脉冲波形很好的验证了FFT程序的逻辑和代码编程的正确性。

FFT算法详解

FFT算法详解

FFT算法详解快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效的计算傅里叶变换的算法。

傅里叶变换是一种将信号从时域转换到频域的方法,它能够将一个时域上的信号表示为一系列不同频率的正弦和余弦函数。

FFT算法的基本思想是将一个N点的离散傅里叶变换分解为多个较小规模的离散傅里叶变换,并利用这些较小规模的变换的结果快速计算出原始信号的傅里叶变换。

这种分治的思想使得FFT算法的时间复杂度为O(NlogN),远远优于朴素的傅里叶变换算法的时间复杂度O(N^2)。

下面详细介绍FFT算法的过程:1.假设有一个长度为N的输入序列x[n],其中n从0到N-1、首先将序列x[n]划分为偶数下标序列x_e[n]和奇数下标序列x_o[n],即x_e[n]=x[2n]和x_o[n]=x[2n+1]。

2.分别对序列x_e[n]和x_o[n]进行FFT变换。

对于每个序列,可以继续进行递归的分解,将其划分为更小规模的序列,直到序列长度为1为止。

3.利用蝴蝶运算的方法,将两个较小规模的FFT变换的结果合并为一个较大规模的FFT变换的结果。

蝴蝶运算是指将两个复数相乘后加到另一个复数上的运算。

4.重复第3步,直到所有序列都合并为一个长度为N的FFT变换。

上述步骤可以通过递归的方式实现,也可以通过迭代的方式实现。

下面介绍一种迭代的方式:1.初始化一个长度为N的输入序列x[n],将其按照倒位序重新排列,得到一个新的序列X[n]。

具体的排列方式为,将x[n]的二进制位反转后所得到的二进制数转换为十进制数。

2.设置一个变量m,初始值为2(即每两个元素合并为一个的步长),进行迭代。

3. 对于每个步长m,分别计算W_m^0, W_m^1, ..., W_m^{m-1}的值,其中W_m^k = e^{-2 \pi i k/m}。

这些值可以预先计算并保存,以减少重复计算。

4.对于每个步长m,将序列X[n]划分为m个长度为N/m的子序列,分别为X_0[n],X_1[n],...,X_{m-1}[n]。

汇编语言实现斐波那契数列

汇编语言实现斐波那契数列

汇编语言实现斐波那契数列汇编语言是一种底层的计算机语言,与机器指令一一对应。

在汇编语言中,我们可以直接操作计算机的寄存器和内存单元,以实现一些复杂的功能。

斐波那契数列是一个非常经典的数学问题,它定义如下:第n个斐波那契数F(n)是由前两个斐波那契数F(n-1)和F(n-2)相加而得到的,即F(n)=F(n-1)+F(n-2)。

在汇编语言中,我们可以通过迭代或递归的方式来计算斐波那契数列。

下面,我将使用汇编语言x86架构下的MASM汇编工具来实现斐波那契数列的计算。

首先,我们需要使用以下代码定义常量FIB_INDEX,来指定要计算斐波那契数列的下标。

我们以FIB_INDEX=10为例。

```FIB_INDEXEQU10```接下来,我们需要定义一个数组来存储斐波那契数列的值。

由于斐波那契数列的长度是不确定的,我们可以选择一个适当的长度来存储数列,这里选择长度为20。

```.datafib_values DWORD 20 DUP(?)```接下来,我们需要编写代码来计算斐波那契数列。

由于斐波那契数列的每个数都是前两个数之和,所以我们可以使用循环来计算。

首先,我们需要将前两个斐波那契数F(0)和F(1)赋值给数组fib_values的前两个元素。

```mov fib_values[0], 0 ; F(0)mov fib_values[4], 1 ; F(1)```接下来,我们可以使用一个循环来计算后续的斐波那契数。

我们使用寄存器ecx来保存循环计数器,其中ecx的初始值为2,表示数组fib_values的下标为2的元素。

```mov ecx, 2 ; 循环计数器```然后,我们可以使用循环来计算斐波那契数列。

在每次循环中,我们将前两个斐波那契数相加,并将结果存储在数组fib_values的当前位置。

```mov eax, fib_values[ecx-4] ; 前一个斐波那契数F(n-1)mov ebx, fib_values[ecx-8] ; 前两个斐波那契数F(n-2)add eax, ebx ; F(n) = F(n-1) + F(n-2)mov fib_values[ecx*4], eax ; 存储结果到数组fib_valuesinc ecx ; 循环计数器自增cmp ecx, FIB_INDEX+1 ; 比较循环计数器和FIB_INDEX+1```最后,我们可以使用以下代码来打印斐波那契数列的结果。

定点DSP上FFT汇编算法和精度分析

定点DSP上FFT汇编算法和精度分析

法和乘法运算会产生舍入和截断误差。
对 于 F 0 芯 片 而 言 ,参 与运 算 的数 是 1 26 6位整 型 数 ,但 实 际数 字 运 算过 程 中 的数 不 一定 是 整 数 :定点
1T ¥ 2 F 0 M 3 0 2 6的 结 构
数字 处理 芯 片 F 0 26是采 用 高性 能静 态 C S 成 MO 集 电路 工 艺制 造 的 ,结构 是 以 T 3 0 2x系 列 为基 础 MS 2C x

图 2 碟 形 节 信 号流 图
( ) DF X , ] 七 = T[ (z =∑X , ” k 0 1 2 一 ) 1 ) (z (= , , …N 1 ( ) )
¨=0
图 2中 , m表 示 第 m级 迭代 , 、 为 数据 所 在 行 , k i 由碟形 节 信号 流 图可 以看 出 ,某 一 级 的两 个 节 点 问的 蝶形 运 算 结 果 为下 一级 k 两 节 点 的输 入 变量 , 其 、i 与
可 以表示 不 同大 小 和不 同精 度 的小数 。
X () .k
X k = 一 七 + ( ) ) (
. ) ( J
2时 域基 2的 FI算 法 F
X 一() ., () J ( ) + 一 J ) (
离散 信 号 X ( 的傅 立 叶 变换 可 以表 示 为 : n )
威 胁 ,谐 波被 认 为是 电 网的一 大 公 害 。因此 ,对 电力
程 序 存储 器和 数 据存 储 器具 有 各 自的总 线结 构 此 总 线 结 构 结 合 4级 流 水线 操 作 ,使 F 0 26的 处理 能 力 达
系统谐 波 问题 的研 究 已被 人 们逐 渐 重 视 。谐 波 问题 涉

DSP课程设计——FFT的DSP实现

DSP课程设计——FFT的DSP实现

FFT的DSP实现简介:快速傅里叶变换是一种高效实现离散傅里叶变换的的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。

一.设计目的:1.加深对DFT算法原理和基本性质的理解;2。

熟悉FFT的算法原理和FFT子程序的算法流程和应用;3.学习用FFT对连续信号和时域信号进行频谱分析的方法;4.学习DSP中FFT的设计和编程思想;5.学习使用CCS的波形观察窗口观察信号波形和频谱情况.二.设计内容:用DSP汇编语言及C语言进行编程,实现FFT运算,对输入信号进行频谱分析。

三.设计原理:1.离散傅里叶变换DFT:对于长度为N的有限长序列x(n),它的离散傅里叶变换(DFT)为1X(k)= ∑∞=0*) (nWnx N—nk ,k=0,1,2……N-1 (1)式中,W N=e-j*2π/N,称为旋转因子或蝶形因子.从DFT的定义可以看出,在x(n)为复数序列的情况下,对某个k值,直接按(1)式计算X(k) 只需要N次复数乘法和(N—1)次复数加法。

因此,对所有N个k值,共需要N2次复数乘法和N(N-1)次复数加法。

对于一些相当大有N值(如1024点)来说,直接计算它的DFT所需要的计算量是很大的,因此DFT运算的应用受到了很大的限制.2.快速傅里叶变换FFT旋转因子W N有如下的特性.对称性: W N k+N/2=—W N k周期性:W N n(N—k)=W N k(N-n)=W N—nk利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。

FFT就是利用了旋转因子的对称性和周期性来减少运算量的.FFT的算法是将长序列的DFT分解成短序列的DFT.例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一2半,继续进行分解可以大大减少计算量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编下的FFT算法实现;----------------------------------------------------------- ; 快速付里叶变换子程序;; 入口 : 一维四字节浮点数数组的首地址 ;;; 以 2 为基β的值,信号抽样的点数 = 2^β;;; 出口 : 在原数组的位置保存结果的值;;; 补充说明 :;; 1. 该子程序所需 RAM 的容量为 2^β*12 字节,另外需要;; 少量的堆栈作为临时变量的存储空间;;; 2. 所需 RAM 空间以输入的首地址为基址,向增加的方向;; 扩展;;; 应用举例 :;; PUSH #0A000H ; 数组首地址压栈; PUSH #6 ; β值压栈; CALL FFT;;----------------------------------------------------------- PROC FFTFFT: LD FFT_CX,2[SP]LD FFT_AX,#0001H ;SHL FFT_AX,FFT_CL ; 计算采样点数PUSH FFT_AX ; 将采样点数压栈SHL FFT_AX,#1 ;LD FFT_BX,6[SP] ; 根据采样点数,ADD FFT_BX,FFT_AX ; 计算出其余PUSH FFT_BX ; 三个被占用ADD FFT_BX,FFT_AX ; 空间的首地址;PUSH FFT_BX ; 并依次将首地址SHL FFT_AX,#1 ;ADD FFT_BX,FFT_AX ; 压栈;PUSH FFT_BX ;LD FFT_CX,6[SP]LD FFT_FX,#2LOOP1:CLR FFT_AXSUB FFT_EX,FFT_CX,#1LD FFT_BX,FFT_EXLD FFT_DX,10[SP]LOOP2:SHL FFT_AX,#1 ;SHR FFT_EX,#1 ; 产生倒序数ADDC FFT_AX,0 ;DJNZW FFT_DX,LOOP2 ;SHL FFT_AX,#2SHL FFT_BX,#2 ; FFT_AX : 产生源地址 ADD FFT_AX,12[SP] ; FFT_BX : 产生目的地址 ADD FFT_BX,2[SP] ; 输入数据按倒序排列BMOV FFT_AX,FFT_FX ;DJNZW FFT_CX,LOOP1 ;LD FFT_AX,12[SP]LD FFT_BX,4[SP]LD FFT_DX,#0080HST FFT_DX,[FFT_AX]+ST 0,[FFT_AX]ST 0,[FFT_BX]+ST 0,[FFT_BX]LD FFT_AX,#0DB82H ; 计算分度值SUB FFT_AX,10[SP] ; 即,(2*π)/(2^β)PUSH #490FH ; 的值PUSH FFT_AX ;LD FFT_BX,SPLD FFT_EX,16[FFT_BX]ADD FFT_EX,#4 ;PUSH [FFT_BX] ;PUSH 2[FFT_BX] ; 计算分度的余弦,PUSH FFT_EX ; 结果存入PR[1]CALL FCOS4 ;LD FFT_BX,SPPUSH [FFT_BX] ;PUSH 2[FFT_BX] ; 计算分度的正弦PUSH #FFT_AX ;CALL FSIN4 ; 分度值已完成使命,ADD SP,#4 ; 故收回其使用空间LD FFT_EX,4[SP] ; 将结果取负,ADD FFT_EX,#4 ; 存入PI[1];XOR FFT_BX,#8000H ; 同时,FFT_AX.FFT_BX ST FFT_AX,[FFT_EX] ; 保存PI[1]的ST FFT_BX,2[FFT_EX] ; 值LD FFT_EX,12[SP] ;ADD FFT_EX,#4 ; 取出PR[1]的值PUSH 2[FFT_EX] ; 压入堆栈,作为PUSH [FFT_EX] ; 后面计算的常数使用PUSH FFT_BX ; 将PI[1]的值压入堆栈,PUSH FFT_AX ; 作为后面计算的常数使用SUB SP,#8 ; 予留四个字空间LD FFT_CX,#2LOOP3:PUSH FFT_CX ; FFT_CX : 相当于I的值SUB FFT_DX,FFT_CX,#1 ; FFT_DX : 相当于J的值 SHL FFT_DX,#2ADD FFT_DX,30[SP]LD FFT_BX,SPADD FFT_EX,FFT_BX,#6PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 14[FFT_BX]PUSH 16[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,22[SP]LD FFT_BX,SPADD FFT_EX,FFT_BX,#2PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 10[FFT_BX]PUSH 12[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_EX,[SP]SHL FFT_EX,#2ADD FFT_EX,30[SP]PUSH 6[FFT_BX]PUSH 8[FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH FFT_EXCALL FSUB4LD FFT_BX,SPLD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,30[SP]ADD FFT_EX,SP,#6PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 10[FFT_BX]PUSH 12[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_CX,[SP]SUB FFT_DX,FFT_CX,#1SHL FFT_DX,#2ADD FFT_DX,22[SP]ADD FFT_EX,SP,#2PUSH [FFT_DX]+PUSH [FFT_DX]PUSH 14[FFT_BX]PUSH 16[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPLD FFT_EX,[SP]SHL FFT_EX,#2ADD FFT_EX,22[SP]PUSH 6[FFT_BX]PUSH 8[FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH FFT_EXCALL FADD4LD FFT_DX,24[SP]SHR FFT_DX,#1POP FFT_CXINC FFT_CXCMP FFT_CX,FFT_DXJC NEXT1JMP LOOP3NEXT1:ADD SP,#16PUSH FFT_DXLOOP5:PUSH FFT_DX ; 产生一个奇偶交替的SHL FFT_DX,#1 ; 计数序列SUB FFT_CX,FFT_DX,#1 ; FFT_CX : 奇数序列SUB FFT_DX,#2 ; FFT_DX : 偶数序列SHL FFT_CX,#2 ;SHL FFT_DX,#2 ;ADD FFT_CX,6[SP] ; FFT_CX : FR[OLD]的首地址ADD FFT_DX,6[SP] ; FFT_DX : FR[EVEN]的首地址PUSH FFT_CX ;PUSH 2[FFT_DX] ; VR在堆栈中的存放PUSH [FFT_DX] ; 顺序为高位在前,低位在后LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_CX]PUSH 2[FFT_CX]PUSH FFT_DXCALL FADD4LD FFT_CX,4[SP]LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_CX] ;PUSH 2[FFT_CX] ; 完成第一级PUSH FFT_CX ; 蝶形单元的CALL FSUB4 ; 运算ADD SP,#6 ; 该循环退出时,POP FFT_DX ; [SP]的值仍然DJNZW FFT_DX,LOOP5 ; 保存N/2NFFT2:LD FFT_EX,2[SP] ; DO FI[I]=0.0 UNTIL I=64,1,I-- LD FFT_CX,8[SP]LOOP55:PUSH FFT_CXDEC FFT_CXSHL FFT_CX,#2ADD FFT_CX,FFT_EXST 0,[FFT_CX]ST 0,2[FFT_CX]POP FFT_CXDJNZW FFT_CX,LOOP55NEXT22:PUSH #2PUSH [SP]LD FFT_AX,16[SP]DEC FFT_AXLOOP6:PUSH FFT_AXLD FFT_AX,6[SP]SHR FFT_AX,#1ST FFT_AX,6[SP]LD FFT_AX,4[SP]ST FFT_AX,2[SP]SHL FFT_AX,#1ST FFT_AX,4[SP]LD FFT_CX, 6[SP]LOOP7:PUSH FFT_CXLD FFT_CX,4[SP]LOOP8:PUSH FFT_CXLD FFT_AX,[SP]DEC FFT_AXLD FFT_EX,10[SP]MULU FFT_CX,FFT_AX,FFT_EXSHL FFT_CX,#2PUSH FFT_CX ; NILD FFT_BX,4[SP]DEC FFT_BXLD FFT_EX,10[SP]MULU FFT_CX,FFT_BX,FFT_EXADD FFT_CX,FFT_AXLD FFT_DX,FFT_CXSHL FFT_CX,#2PUSH FFT_CX ; NKLD FFT_CX,12[SP]SHR FFT_CX,#1ADD FFT_CX,FFT_DXSHL FFT_CX,#2PUSH FFT_CX ; NJLD FFT_AX,30[SP] ; PR的首地址LD FFT_BX,20[SP] ; FR的首地址ADD FFT_AX,4[SP]ADD FFT_BX,[SP] ;SUB SP,#4 ; 先调整堆栈指针LD FFT_EX,SP ; 再进行浮点数运算 PUSH [FFT_AX] ; 在并发环境下PUSH 2[FFT_AX] ; 至关重要PUSH [FFT_BX] ;PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_AX,26[SP] ; PI的首地址LD FFT_BX,22[SP] ; FI的首地址ADD FFT_AX,8[SP] ;ADD FFT_BX,4[SP] ; 先调整堆栈指针 SUB SP,#4 ; 再进行浮点数运算LD FFT_EX,SP ; 在并发环境下PUSH [FFT_AX] ; 至关重要PUSH 2[FFT_AX] ;PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPSUB SP,#4LD FFT_EX,SPPUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FSUB4 ; PODDRLD FFT_AX,42[SP] ; PR的首地址 LD FFT_BX,30[SP] ; FI的首地址 ADD FFT_AX,16[SP]ADD FFT_BX,12[SP]ADD FFT_EX,SP,#8PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_AX,34[SP] ; PI的首地址 LD FFT_BX,32[SP] ; FR的首地址 ADD FFT_AX,16[SP]ADD FFT_BX,12[SP]ADD FFT_EX,SP,#4PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_BX]PUSH 2[FFT_BX]PUSH FFT_EXCALL FMUL4LD FFT_BX,SPSUB SP,#4LD FFT_EX,SPPUSH 8[FFT_BX]PUSH 10[FFT_BX]PUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH FFT_EXCALL FADD4 ; PODDILD FFT_BX,FFT_AX ADD FFT_AX,16[SP] ADD FFT_BX,18[SP] LD FFT_EX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_EX]PUSH 6[FFT_EX]PUSH FFT_AXCALL FSUB4LD FFT_AX,34[SP] LD FFT_BX,FFT_AX ADD FFT_AX,16[SP] ADD FFT_BX,18[SP] LD FFT_EX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH [FFT_EX]PUSH 2[FFT_EX]PUSH FFT_AXCALL FSUB4LD FFT_AX,36[SP] ADD FFT_AX,18[SP] LD FFT_EX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH 4[FFT_EX]PUSH 6[FFT_EX]PUSH FFT_AXCALL FADD4LD FFT_AX,34[SP] ADD FFT_AX,18[SP] LD FFT_EX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_EX]PUSH 2[FFT_EX]PUSH FFT_AXCALL FADD4ADD SP,#22POP FFT_CXDJNZW FFT_CX,NEXT3 POP FFT_CXDJNZW FFT_CX,NEXT4 POP FFT_AXJMP NEXT6NEXT3:JMP LOOP8NEXT4:JMP LOOP7NEXT5:JMP LOOP6NEXT6:ADD SP,#6LD FFT_CX,6[SP] LOOP9:PUSH FFT_CXDEC FFT_CXSHL FFT_CX,#2LD FFT_AX,4[SP] ADD FFT_AX,FFT_CX SUB SP,#4LD FFT_BX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH FFT_BXCALL FMUL4LD FFT_AX,6[SP] LD FFT_CX,4[SP] DEC FFT_CXSHL FFT_CX,#2ADD FFT_AX,FFT_CX SUB SP,#4LD FFT_BX,SPPUSH [FFT_AX]PUSH 2[FFT_AX]PUSH [FFT_AX]PUSH 2[FFT_AX]PUSH FFT_BXCALL FMUL4LD FFT_BX,SPPUSH [FFT_BX]PUSH 2[FFT_BX]PUSH 4[FFT_BX]PUSH 6[FFT_BX]PUSH #FFT_AXCALL FADD4ADD SP,#8LD FFT_CX,[SP]DEC FFT_CXSHL FFT_CX,#2ADD FFT_EX,FFT_CXPUSH FFT_AXPUSH FFT_BXPUSH FFT_EXCALL FSQRTPOP FFT_CXDJNZW FFT_CX,LOOP9LD FFT_AX,8[SP]ST FFT_AX,12[SP]ADD SP,#12RETPROCEND:END;===========================================================签名:路漫漫其修远兮,吾将上下而求索艾诺仪器公司。

相关文档
最新文档