我发布在matlab中央,但没有得到任何反应,所以我想我会转发在这里。

我最近在Matlab中写了一个简单的例程,在for循环中使用FFT; FFT主导计算。我在mex中写了相同的例程只是为了实验目的,它调用FFTW 3.3库。结果是,对于非常大的数组,matlab例程比mex例程运行得快(约两倍快)。 mex例程使用智慧并执行相同的FFT计算。我也知道matlab使用FFTW,但是它们的版本是可能稍微更优化吗?我甚至使用FFTW_EXHAUSTIVE标志,它仍然大约两倍的大阵列比MATLAB对手慢。此外,我确保我使用的matlab是单线程与“-singleCompThread”标志和我使用的mex文件不是在调试模式。只是好奇,如果这是case – 或者如果有一些优化matlab是使用under the hood,我不知道。谢谢。

这里是mex部分:

void class_cg_toeplitz::analysis() {

// This method computes CG iterations using FFTs

// Check for wisdom

if(fftw_import_wisdom_from_filename("cd.wis") == 0) {

mexPrintf("wisdom not loaded.\n");

} else {

mexPrintf("wisdom loaded.\n");

}

// Set FFTW Plan - use interleaved FFTW

fftw_plan plan_forward_d_buffer;

fftw_plan plan_forward_A_vec;

fftw_plan plan_backward_Ad_buffer;

fftw_complex *A_vec_fft;

fftw_complex *d_buffer_fft;

A_vec_fft = fftw_alloc_complex(n);

d_buffer_fft = fftw_alloc_complex(n);

// CREATE MASTER PLAN - Do this on an empty vector as creating a plane

// with FFTW_MEASURE will erase the contents;

// Use d_buffer

// This is somewhat dangerous because Ad_buffer is a vector; but it does not

// get resized so &Ad_buffer[0] should work

plan_forward_d_buffer = fftw_plan_dft_r2c_1d(d_buffer.size(),&d_buffer[0],d_buffer_fft,FFTW_EXHAUSTIVE);

plan_forward_A_vec = fftw_plan_dft_r2c_1d(A_vec.height,A_vec.value,A_vec_fft,FFTW_WISDOM_ONLY);

// A_vec_fft.*d_buffer_fft will overwrite d_buffer_fft

plan_backward_Ad_buffer = fftw_plan_dft_c2r_1d(Ad_buffer.size(),d_buffer_fft,&Ad_buffer[0],FFTW_EXHAUSTIVE);

// Get A_vec_fft

fftw_execute(plan_forward_A_vec);

// Find initial direction - this is the initial residual

for (int i=0;i

d_buffer[i] = b.value[i];

r_buffer[i] = b.value[i];

}

// Start CG iterations

norm_ro = norm(r_buffer);

double fft_reduction = (double)Ad_buffer.size(); // Must divide by size of vector because inverse FFT does not do this

while (norm(r_buffer)/norm_ro > relativeresidual_cutoff) {

// Find Ad - use fft

fftw_execute(plan_forward_d_buffer);

// Get A_vec_fft.*fft(d) - A_vec_fft is only real, but d_buffer_fft

// has complex elements; Overwrite d_buffer_fft

for (int i=0;i

d_buffer_fft[i][0] = d_buffer_fft[i][0]*A_vec_fft[i][0]/fft_reduction;

d_buffer_fft[i][1] = d_buffer_fft[i][1]*A_vec_fft[i][0]/fft_reduction;

}

fftw_execute(plan_backward_Ad_buffer);

// Calculate r'*r

rtr_buffer = 0;

for (int i=0;i

rtr_buffer = rtr_buffer + r_buffer[i]*r_buffer[i];

}

// Calculate alpha

alpha = 0;

for (int i=0;i

alpha = alpha + d_buffer[i]*Ad_buffer[i];

}

alpha = rtr_buffer/alpha;

// Calculate new x

for (int i=0;i

x[i] = x[i] + alpha*d_buffer[i];

}

// Calculate new residual

for (int i=0;i

r_buffer[i] = r_buffer[i] - alpha*Ad_buffer[i];

}

// Calculate beta

beta = 0;

for (int i=0;i

beta = beta + r_buffer[i]*r_buffer[i];

}

beta = beta/rtr_buffer;

// Calculate new direction vector

for (int i=0;i

d_buffer[i] = r_buffer[i] + beta*d_buffer[i];

}

*total_counter = *total_counter+1;

if(*total_counter >= iteration_cutoff) {

// Set total_counter to -1, this indicates failure

*total_counter = -1;

break;

}

}

// Store Wisdom

fftw_export_wisdom_to_filename("cd.wis");

// Free fft alloc'd memory and plans

fftw_destroy_plan(plan_forward_d_buffer);

fftw_destroy_plan(plan_forward_A_vec);

fftw_destroy_plan(plan_backward_Ad_buffer);

fftw_free(A_vec_fft);

fftw_free(d_buffer_fft);

};

这里是matlab部分:

% Take FFT of A_vec.

A_vec_fft = fft(A_vec); % Take fft once

% Find initial direction - this is the initial residual

x = zeros(n,1); % search direction

r = zeros(n,1); % residual

d = zeros(n+(n-2),1); % search direction; pad to allow FFT

for i = 1:n

d(i) = b(i);

r(i) = b(i);

end

% Enter CG iterations

total_counter = 0;

rtr_buffer = 0;

alpha = 0;

beta = 0;

Ad_buffer = zeros(n+(n-2),1); % This holds the product of A*d - calculate this once per iteration and using FFT; only 1:n is used

norm_ro = norm(r);

while(norm(r)/norm_ro > 10^-6)

% Find Ad - use fft

Ad_buffer = ifft(A_vec_fft.*fft(d));

% Calculate rtr_buffer

rtr_buffer = r'*r;

% Calculate alpha

alpha = rtr_buffer/(d(1:n)'*Ad_buffer(1:n));

% Calculate new x

x = x + alpha*d(1:n);

% Calculate new residual

r = r - alpha*Ad_buffer(1:n);

% Calculate beta

beta = r'*r/(rtr_buffer);

% Calculate new direction vector

d(1:n) = r + beta*d(1:n);

% Update counter

total_counter = total_counter+1;

end

在时间方面,对于N = 50000和b = 1:n,mex需要大约10.5秒,使用matlab为4.4秒。我使用R2011b。谢谢

matlab fft例程,c++ FFTW与Matlab FFT相关推荐

  1. Matlab中N是什么意思,MATLAB中y=FFT(X,N)中的N是什么意思

    matlab傅里叶变换中fft(x,n),x,n分别是什么含义? fft(x,n)是一维快速傅里叶变换,x相当于信号,n是变换点数.离散傅里叶变换DFT的快速算法就是FFT. matlab中FFT函数 ...

  2. 有源电力滤波器matlab仿真, 并联型apf仿真fft分析 谐波电流检测ipiq法

    有源电力滤波器matlab仿真, 并联型apf仿真fft分析 谐波电流检测ipiq法 跟踪电流控制(传统滞环控制 空间电压矢量滞环控制) 总谐波畸变率降至3%以下 ID:695064569089802 ...

  3. DFT的计算、FFT的基础代码、FFT的横纵坐标问题(matlab)

    FFT的定义 FFT:快速傅里叶变换,是DFT的快速算法. DFT(Discrete Fourier Transform):离散傅里叶变换.在DTFT之后,将傅里叶变换的结果也进行离散化,就是DFT. ...

  4. matlab非平稳信号小波和FFT去噪

    文章目录 目录 文章目录 一.非平稳信号 二.FFT 和小波去噪实例 完整代码 一.非平稳信号 在实际的工程应用中,大多数信号可能包含着许多尖峰或突变,而且噪声信号也并不是平衡的白噪声.对这种信号进行 ...

  5. C语言使用CUDA中cufft函数做GPU加速FFT运算,与调用fftw函数的FFT做运算速度对比

    目录 任务介绍 环境所需相关软件下载与安装 C语言:不调用库的GPU加速FFT代码 C语言:调用fftw库的未使用GPU的FFT代码 C语言:调用cufft库的GPU加速FFT gnuplot安装画图 ...

  6. matlab通信工具comm,matlab无线通信例程及simulink仿真

    Matlab Wireless Communications 各种应用例程 802.11b PHY MATLAB Code Description.doc IEEE80211b_PHY_DBPSK.m ...

  7. 深入浅出解释FFT(六)——深入理解fft变换

    (如需交流,请关注公众号:神马观止) FFT(FastFourier Transform,快速傅立叶变换)是离散傅立叶变换的快速算法,也是我们在数字信号处理技术中经常会提到的一个概念.在大学的理工科课 ...

  8. matlab关于噪声课设,基于matlab的有噪声的语音信号处理的课程设计.doc

    基于matlab的有噪声的语音信号处理的课程设计.doc DSP实验课程设计实验报告DSP实验课程设计实验报告姓名学号班级1课程设计题目基于MATLAB的有噪声的语音信号处理的课程设计.2课程设计的目 ...

  9. matlab里面板有什么作用,MATLAB轻松享受GPU的强大功能

    MATLAB轻松享受GPU的强大功能 MATLAB的GPU支持为活跃于许多学科的大量研究人员(不一定是CUDA编程专家)提供了一种加速科学计算的新方法.考虑到MATLAB主要是用于科学计算和工程计算, ...

最新文章

  1. DevExpress Components16.2.6 Source Code 编译
  2. 深度linux win7分区,怎么安装Win7深度操作系统?
  3. java 虚拟机 参数_Java虚拟机的参数
  4. redis java应用_Java+Redis应用(第一章)
  5. PowerDesigner16.5安装
  6. MySQL-03:数据表操作基本命令笔记
  7. 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
  8. plc 上位机编译算法_什么是PLC与DDC PLC与DDC的区别
  9. Debian7桌面屏蔽图标和右键菜单的解决方法。
  10. 智能优化算法:基于梯度的优化算法-附代码
  11. 记一次halo博客ssl证书过期处理过程
  12. LigerUi中表(Grid)控件的相关属性笔记(持续添加中)
  13. 时间(空间)复杂度 O(N) 的理解
  14. 建议71:区分异步和多线程应用场景
  15. 关于x86、x86-64、x64、i386、i486、i586和i686等名词的解释
  16. IntelliJ IDEA 为JAVA 项目添加lib
  17. dlib.get_frontal_face_detector(), Python format 格式化函数 predictor(img, dets[0])
  18. 张洪斌 html css,网页设计与制作张洪斌 刘万辉体设计.doc
  19. 微信平台小游戏AVG开发教程入门
  20. Arcgis水文分析模块小流域划分流程

热门文章

  1. 渗透中poc、exp、payload与shellcode的区别
  2. windows linux C/C++获取操作系统、CPU、内存信息、硬盘、IP和MAC
  3. linux下使用binfmt_misc设定不同二进制的打开程序
  4. openwrt下让telnetl与ssh(dropbear)共存
  5. 关于sql注入之cookie注入
  6. Android开发精要3--Android中的Intent机制
  7. Android中的各种Adapter
  8. html读取url中文件,HTML5基础知识 - JavaScript API - File - 读取文件为DataURL
  9. java byter是字节吗_GitHub - XXQAQ/Byter: 字节对象转换框架,一个基于字节的 Gson/FastJson...
  10. 哪种营销方法效果最差_网络营销推广中如何监控评测网络效果?