【傅里叶变换】 关于 Matlab ifft(Y,n) 在C#中实现遇到的问题

关于傅里叶变换的定义,用法这里不讨论,纯理论的东西,大家大学学过工程数学的都知道,包括信号处理的课程也会重点讲解这些理论,关于时域,频域,离散,连续这些东西,也没什么好说的了,都是基础,到工程上面运用知道怎么回事就可以了,如果想了解下面有个博文写的比较详细供大家参考,就不重复造轮子了

快速傅里叶变换学习(超详细,附代码实现)

最近在做一个仿生学的全聚焦声学影像图-AIM项目,就是利用信号来模拟探头,设定探头的参数进行模拟成像,由于我们的工程是C#的,需要将matlab转到C#进行开发,这里就用到了 fft 和 ifft

对应到C #中 需要引入mathnet.numerics 这个库

Matlab ifft(Y,n) 对应 C# 中的 这个方法 Fourier.Inverse(src, FourierOptions.Matlab);

然后入到了一个问题, 当Y,也就是输入为一维数组的时候,没有问题,当Y为矩阵的时候,也就是对应到C#中 输入是 [,] 二维数组
我的做法是将 输入的二维数组转为一维,然后使用Fourier.Inverse(src, FourierOptions.Matlab);进行逆变换,但是得到的结果和Matlab中的不一致

为什么会不一致呢?

Matlab : ifft(Y,n)

C# :Fourier.Inverse(Y, FourierOptions.Matlab);

Y为矩阵 ,C#中是 二维数组

我想起了这个Fourier.Inverse2D
在这里插入图片描述
然后我发现输入都是一维的,不支持2维, 头大了

一头雾水,出去转了一圈,回头一想,还是看看 ifft 的参数说明

在这里插入图片描述
原来ifft 当Y是二维的时候,是按列处理的,那 C#中我也可以按列处理来得到一致的结果,于是我在C#中重写了ifft

 /// <summary>
        /// 对应Matlab中的 ifft(Y) :eg:如果 Y 是矩阵,则 ifft(Y,n) 返回该矩阵每一列的逆变换, n 通过用尾随零填充 Y 以达到 n 行
        /// </summary>
        /// <param name="input"></param>
        /// <param name="n"></param>
        /// <returns></returns>
        public static Complex[,] Ifft2D(Complex[,] input, int n)
        {
            int rows = input.GetLength(0);
            int cols = input.GetLength(1);

            // 零填充或截断数据
            Complex[,] paddedFreqData = new Complex[n, cols];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    if (i < rows)
                    {
                        paddedFreqData[i, j] = input[i, j];
                    }
                    else
                    {
                        paddedFreqData[i, j] = Complex.Zero;
                    }
                }
            }

            // 对每一列进行逆傅里叶变换
            Complex[,] output = new Complex[n, cols];
            for (int j = 0; j < cols; j++)
            {
                var col = new Complex[n];
                for (int i = 0; i < n; i++)
                {
                    col[i] = paddedFreqData[i, j];
                }
                Fourier.Inverse(col, FourierOptions.Matlab);
                for (int i = 0; i < n; i++)
                {
                    output[i, j] = col[i];
                }
            }

            return output;
        }

最后我验证了一下,还TMD 真别说,对了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以说,还是得多动动脑子呀~~

下班了,祝大家端午节快乐!

相关推荐

  1. 变换图像处理应用

    2024-06-08 08:06:01       54 阅读
  2. 实验五:图像变换

    2024-06-08 08:06:01       25 阅读
  3. 变换例题

    2024-06-08 08:06:01       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 08:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 08:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 08:06:01       82 阅读
  4. Python语言-面向对象

    2024-06-08 08:06:01       91 阅读

热门阅读

  1. 公司面试题总结(一)

    2024-06-08 08:06:01       25 阅读
  2. 正则表达式

    2024-06-08 08:06:01       30 阅读
  3. Spring Boot 常用注解

    2024-06-08 08:06:01       27 阅读
  4. Ajax + Easy Excel 通过Blob实现导出excel

    2024-06-08 08:06:01       29 阅读
  5. ARCGIS 几种SHP融合、拼接等方法

    2024-06-08 08:06:01       31 阅读
  6. 【微信小程序】连接蓝牙设备

    2024-06-08 08:06:01       32 阅读
  7. amis 事件动作 和 行为按钮 常用用法

    2024-06-08 08:06:01       28 阅读