C++ FFTW3的fftw_plan_dft_r2c_2d()和Eigen::MatrixXd的傅里叶正变换

本文介绍了在C++项目中,使用FFTW3的fftw_plan_dft_r2c_2d()对二维实数矩阵Eigen::MatrixXd进行傅里叶变换时遇到的问题。当输出矩阵与输入矩阵大小相同时,会丢失部分共轭值。通过对比Matlab的fft2输出,发现fftw_plan_dft_r2c_2d()仅提供了一半的频率成分。解决方案是利用输出结果中已包含的共轭部分,通过取共轭和适当排列来补全缺失的共轭值。对于偶数行矩阵,共轭区域的处理方式有所不同,需要将特定区域的元素取共轭并翻转180°来补全结果。
摘要由CSDN通过智能技术生成

项目场景:

C++中,对含有较多数据的二维实数矩阵Eigen::MatrixXd进行傅里叶变换时,ftw_plan_dft_r2c_2d()会比fftw_plan_dft_2d()快一些,但在使用ftw_plan_dft_r2c_2d()时,发现要输出与输入同等大小的矩阵时会缺失一些值(共轭值)。


问题描述

C++中,对含有较多数据的二维实数矩阵Eigen::MatrixXd进行傅里叶变换的时候,ftw_plan_dft_r2c_2d()如果输出与输入同等大小的矩阵时会缺失一些值(共轭值)。

1、C++使用fftw_plan_dft_2d()对实数矩阵进行傅里叶变换:先将MatrixXd赋值给MatrixXcd,然后再使用fftw_plan_dft_2d()。其输出结果和Matlab的结果相同。

#include <iostream>
#include <cmath>
#include "Eigen/Dense"
#include <opencv2/core/eigen.hpp>
#include "fftw3.h"

using namespace std;
using namespace Eigen;

int main() {
    MatrixXd a(5, 6);      //奇数行
    a << 11, 18, 20, 16, 10, 14,
          4,  1,  8, 29, 19, 21,
         17, 27, 15,  9, 25,  5,
         22,  7,  2, 24, 30, 23,
       
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值