资源简介
FFT算法的MPI实现源代码,编程风格还行,易于理解
代码片段和文件信息
#include
#include
#include
#include “mpi.h“
#define MAX_N 50
#define PI 3.1415926535897932
#define EPS 10E-8
#define V_TAG 99
#define P_TAG 100
#define Q_TAG 101
#define R_TAG 102
#define S_TAG 103
#define S_TAG2 104
typedef enum {FALSE TRUE}
BOOL;
typedef struct
{
double r;
double i;
} complex_t;
complex_t p[MAX_N] q[MAX_N] s[2*MAX_N] r[2*MAX_N];
complex_t w[2*MAX_N];
int variableNum;
double transTime = 0 totalTime = 0 beginTime;
MPI_Status status;
void comp_add(complex_t* result const complex_t* c1 const complex_t* c2)
{
result->r = c1->r + c2->r;
result->i = c1->i + c2->i;
}
void comp_multiply(complex_t* result const complex_t* c1 const complex_t* c2)
{
result->r = c1->r * c2->r - c1->i * c2->i;
result->i = c1->r * c2->i + c2->r * c1->i;
}
/*
* Function: shuffle
* Description: 移动f中从beginPos到endPos位置的元素,使之按位置奇偶
* 重新排列。举例说明:假设数组f,beginPos=2 endPos=5
* 则shuffle函数的运行结果为f[2..5]重新排列,排列后各个
* 位置对应的原f的元素为: f[2]f[4]f[3]f[5]
* Parameters: f为被操作数组首地址
* beginPos endPos为操作的下标范围
*/
void shuffle(complex_t* f int beginPos int endPos)
{
int i;
complex_t temp[2*MAX_N];
for(i = beginPos; i <= endPos; i ++)
{
temp[i] = f[i];
}
int j = beginPos;
for(i = beginPos; i <= endPos; i +=2)
{
f[j] = temp[i];
j++;
}
for(i = beginPos +1; i <= endPos; i += 2)
{
f[j] = temp[i];
j++;
}
}
/*
* Function: evaluate
* Description: 对复数序列f进行FFT或者IFFT(由x决定),结果序列为y,
* 产生leftPos 到 rightPos之间的结果元素
* Parameters: f : 原始序列数组首地址
* beginPos : 原始序列在数组f中的第一个下标
* endPos : 原始序列在数组f中的最后一个下标
* x : 存放单位根的数组,其元素为ww^2w^3...
* y : 输出序列
* leftPos : 所负责计算输出的y的片断的起始下标
* rightPos : 所负责计算输出的y的片断的终止下标
* totalLength : y的长度
*/
void evaluate(complex_t* f int beginPos int endPos
const complex_t* x complex_t* y
int leftPos int rightPos int totalLength)
{
int i;
if ((beginPos > endPos)||(leftPos > rightPos))
{
printf(“Error in use Polynomial!\n“);
exit(-1);
}
else if(beginPos == endPos)
{
for(i = leftPos; i <= rightPos; i ++)
{
y[i] = f[beginPos];
}
}
else if(beginPos + 1 == endPos)
{
for(i = leftPos; i <= rightPos; i ++)
{
complex_t temp;
comp_multiply(&temp &f[endPos] &x[i]);
comp_add(&y[i] &f[beginPos] &temp);
}
}
else
{
complex_t tempX[2*MAX_N]tempY1[2*MAX_N] tempY2[2*MAX_N];
int midPos = (beginPos + endPos)/2;
shuffle(f beginPos endPos);
for(i = leftPos; i <= rightPos; i ++)
{
comp_multiply(&tempX[i] &x[i] &x[i]);
}
evaluate(f beginPos midPos tempX tempY1
leftPos rightPos totalLength);
evaluate(f midPos+1 endPos tempX tempY2
leftPos rightPos total
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 57350 2010-01-27 10:19 新建文件夹\data.txt
文件 24 2003-07-14 02:22 新建文件夹\dataIn.txt
文件 21553 2010-01-27 10:22 新建文件夹\dataout.txt
文件 10722 2003-07-14 03:19 新建文件夹\fft.c
文件 471 2003-07-14 02:22 新建文件夹\readme.txt
目录 0 2010-04-14 16:51 新建文件夹
----------- --------- ---------- ----- ----
90120 6
- 上一篇:碰撞检测的算法及一些算法的代码实现,包含一些论文
- 下一篇:黑白棋回溯算法及论文
相关资源
- Design_compiler经典教程
- 龙书《编译原理》(Compilers:Principle
- FFT(快速傅里叶变换)的FPGA实现
- Writing A Compiler In Go.pdf
- DFT Compiler Scan User Guide Version E-2010.12
- FFT快速傅立叶变换)图文并茂
- fftw-3.3.4.tar.gz安装包
- NUFFT算法及说明
- STM32F103通过DMA传输进行快速FFT.rar
- fftw-3.2.1.rar
- synopsys公司的Design Compiler license生成工
- myplot.rar
- 数字信号处理-快速傅里叶变换FFT实验
- 64点FFT变换
- FFT FPGA VERILOG 可综合,申请加精
- 基于FFT和小波变换的电力系统谐波检
- 综合与Design Compiler
- FFT在STM32处理器上的实现完整代码
- xilinx FFT核手册
- stm32实现4096点FFT
- 时域抽取法快速傅里叶变换FFT(以R
- Design Compiler student guide-学习手册
- 基于CUDA 的矩阵乘法和FFT 性能测试
- OpenCV 1.0.0 patch for ffmpeg errors
- stm32_fft_AD9220.zip
- delphi反编译工具 Decompiler v1.1.0.194
- 第四章_快速傅里叶变换(FFT).ppt
- FFT实现OFDM的原始论文
- Advanced Compiler Design and Implementation (高
- stm32AD采集通过fft求信号频率
评论
共有 条评论