什么是 numpy.fft.rfft 和 numpy.fft.irfft 及其在 MATLAB 中的等效代码

2023-11-26

我正在将 python 代码转换为 MATLAB,其中一个代码使用 numpy rfft。在numpy的文档中,它说的是真实输入。

计算实际输入的一维离散傅里叶变换。

所以我在MATLAB中使用的是abs,但结果不同。

Python代码

ffta = np.fft.rfft(a) 

MATLAB代码

ffta = abs(fft(a));

我误解了什么?


numpy 中的实数 FFT 使用实值函数的傅立叶变换可以说是“斜对称”的事实,即频率值k是频率值的复共轭N-k for k=1..N-1(正确的术语是厄米特)。所以rfft仅返回结果中与非正频率相对应的部分。

对于大小的输入N the rfft函数返回对应于等于或低于频率的 FFT 输出部分N/2。因此输出为rfft是有尺寸的N/2+1 if N是偶数(所有频率来自0 to N/2), or (N+1)/2 if N是奇数(从 0 到(N-1)/2)。观察函数floor(n/2+1)返回偶数和奇数输入大小的正确输出大小。

所以要重现rfft在Matlab中

function rfft = rfft(a)
     ffta = fft(a);
     rfft = ffta(1:(floor(length(ffta)/2)+1));
end

例如

a = [1,1,1,1,-1,-1,-1,-1];
rffta = rfft(a)

会产生

rffta =

 Columns 1 through 3:

   0.00000 + 0.00000i   2.00000 - 4.82843i   0.00000 + 0.00000i   

 Columns 4 through 5:

   2.00000 - 0.82843i   0.00000 + 0.00000i
   

现在将其与 python 进行比较

>>> np.fft.rfft(a)
array([ 0.+0.j        ,  2.-4.82842712j,  0.-0.j        ,  
        2.-0.82842712j,  0.+0.j        ])

再现 irfft

重现基本功能irfft你需要从中恢复丢失的频率rfft输出。如果所需的输出长度是偶数,则可以根据输入长度计算输出长度:2 (m - 1)。否则应该是2 (m - 1) + 1.

下面的代码可以工作。

function out = irfft(x, even)
    if nargin == 1
        even = true;
    end
    % `n`: the output length
    % `s`: the variable that will hold the index of the highest
    %      frequency below N/2, s = floor((n+1)/2)
    N = numel(x);  % function assumes 1D input
    if even
        n = 2 * (N - 1);
        s = N - 1;
    else
        n = 2 * (N - 1) + 1;
        s = N;
    end
    outf = zeros(1, n);
    outf(1:N) = x;
    outf(N+1:n) = conj(x(s:-1:2));
    out = ifft(outf);
end

现在你应该有

>> irfft(rfft(a))
ans =

   1.00000   1.00000   1.00000   1.00000  -1.00000  -1.00000  -1.00000  -1.00000

and also

abs( irfft(rfft(a)) - a ) < 1e-15

对于奇数输出长度,你会得到

>> irfft(rfft(a(1:7)),even=false)
ans =

   1.0000   1.0000   1.0000   1.0000  -1.0000  -1.0000  -1.0000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 numpy.fft.rfft 和 numpy.fft.irfft 及其在 MATLAB 中的等效代码 的相关文章

随机推荐

  • 如何通过 php 中的网络服务发送/获取文件

    这可能吗 发送文件的正确方法是什么 thanks 如果您希望网络服务上传 下载文件 我不知道 无论如何你可以使用curl http fr php net curl 从其他网络服务器上传 下载文件 要从用户处获取上传到 Web 服务的某些文件
  • JavaScript 音频的未来?

    我正在教孩子们如何向他们的 JavaScript 游戏和网页添加音频 我了解 HTML5 音频 API 现在刚刚了解各种浏览器的问题 令人惊讶的是 IE 根本不支持 WAV 等 不过 显然有一个新的网络音频标准我不知道 Chrome 完全支
  • 在 PHP 中显示两个日期之间的所有周数[重复]

    这个问题在这里已经有答案了 任何人都可以告诉如何在 PHP 中显示两个日期之间涵盖的所有周数 日期可能是不同的年份 如果我使用开始日期为 2011 09 16 结束日期为 2011 09 21 它将显示第 37 周和第 38 周 你可以使用
  • 从 Javascript 端调用 Qt 函数 (QWebView)

    我有一个 Qt 项目 可以将任何 HTML 页面加载到 Web 视图中 我有以下代码main cpp file include mainwindow h include
  • 如何在 iText 生成的 PDF 中添加图像到我的标题?

    我正在使用 iText 生成 PDF 我创建了一个自定义 PdfPageEventHelper 来向每个页面添加页眉 和页脚 我的问题是我不知道如何添加图像 因此它显示在 标题框 中 我只知道如何将图像添加到文档内容本身 如果有意义的话 这
  • 如何从 URL 下载文件并将其保存在 Rails 中?

    我有一个要保存在本地的图像的 URL 以便我可以使用 Paperclip 为我的应用程序生成缩略图 下载和保存图像的最佳方式是什么 我研究了 ruby 文件处理 但没有遇到任何问题 尝试这个 require open uri open im
  • C++ - 在派生类上使用的 typeid() 不返回正确的类型

    也许我误解了继承在这里的工作原理 但这是我的问题 我有一个 Option 类 以及一个从它派生的 RoomOption 类 我有另一个 Room 类 它包含一个shared ptrs 向量 在 main 中 我向该向量添加了 RoomOpt
  • “Ultra Find”的 Visual Studio 扩展发生了什么?

    Ultra Find 的 Visual Studio 扩展发生了什么 我在这个网站和互联网上看到了关于这个据称很棒的扩展的参考资料 这里有几个链接 http blog arainia com 2010 08 ultra find getti
  • 如何使用 Google Apps 脚本将公式添加到 Google 表格?

    如何添加如下公式 SUM A1 A17 使用 Google Apps Script for Google Sheets 访问一系列字段 这是使用以下方法完成的设置公式对于选定的单元格 下面是如何执行此操作的示例 var ss Spreads
  • 获取 ReferenceError:找不到变量:角度

    我对 yeoman 及其使用的所有工具都很陌生 我在 yeoman 中创建了一个测试项目 并尝试在 jasmine 中运行测试规范 我已经使用cmd安装了jasmine插件 npm 安装 grunt contrib jasmine save
  • 使用WeifenLuo DockPanel套件

    我刚刚下载了罗维芬 Dock Panel Suite 并尝试使用它 但我找不到有关如何使用它的具体文档 我已经解决了一些问题 终于有了一些开始的东西 这是我所做的 我创建了一个 ToolboxWindow 类 如下所示 Public Cla
  • C/C++ 和 Python 之间共享内存

    有没有办法共享内存以在 C C 和 python 之间共享 openCV 图像 C 中的 MAT 和 python 中的 numpy 图像 不需要多平台 我在linux中做 我认为在mmap或类似的想法之间共享 我有两个正在运行的进程 一个
  • 为什么检查 isinstance(something, Mapping) 这么慢?

    我最近比较了性能collections Counter to sorted用于比较检查 如果某些迭代包含相同数量的相同元素 而大迭代的性能Counter一般好于sorted对于短的可迭代对象来说要慢得多 Using line profile
  • Laravel-Core:为什么 Laravel 多次存储别名?

    Laravel 在 Application php 的核心中注册了很多默认实现 如下所示 url gt Illuminate Routing UrlGenerator Illuminate Contracts Routing UrlGene
  • 查看编译器生成的默认函数?

    有什么方法可以查看由 VC 2008 等编译器为未定义它们的类生成的默认函数 例如默认复制构造函数 默认赋值运算符 吗 随着clang编译器 你可以通过传递来看到它们 ast dump争论 Clang 仍处于开发阶段 但您已经可以将它用于以
  • Spring JDBC + Postgres SQL + Java 8 - 从/到 LocalDate 的转换

    我使用的是 Postgres SQL 9 2 Spring JDBC 版本 4 0 5 和 Java 8 Java 8 引入了新的日期 时间 API 我想使用它 但遇到了一些困难 我已经创建了表 TABLE A CREATE TABLE T
  • 如何在Python中向后循环? [复制]

    这个问题在这里已经有答案了 我正在谈论做类似的事情 for i n i gt 1 i do something with i 我可以想出一些方法在 python 中做到这一点 创建一个列表range 1 n 1 并反转它 使用while a
  • 有没有办法阻止 Erlang 服务器自动启动 epmd?

    如果 epmd Erlang 端口映射器守护进程 尚未运行 Erlang 服务器将自动生成它 我更愿意使用 systemd 作为单独的服务来管理 epmd 这样 如果我在一台主机上运行多个 Erlang 服务器 例如 RabbitMQ 和
  • 新的 NET 标准 Microsoft.Azure.ServiceBus 中的 NamespaceManager.GetQueue.MessageCount 等效项是什么?

    新的 NET 标准 Microsoft Azure ServiceBus 中的 NamespaceManager 相当于什么 我使用 WindowsAzure ServiceBus 来执行诸如计算队列中的消息数之类的操作 var names
  • 什么是 numpy.fft.rfft 和 numpy.fft.irfft 及其在 MATLAB 中的等效代码

    我正在将 python 代码转换为 MATLAB 其中一个代码使用 numpy rfft 在numpy的文档中 它说的是真实输入 计算实际输入的一维离散傅里叶变换 所以我在MATLAB中使用的是abs 但结果不同 Python代码 ffta