离散傅里叶变换:如何正确使用 fftshift 和 fft

2023-12-19

我想对 numpy 数组 Y 进行数值计算。为了进行测试,我使用高斯函数 Y = exp(-x^2)。 (符号)傅立叶变换为 Y' = 常数 * exp(-k^2/4)。

import numpy
X = numpy.arange(-100,100)
Y = numpy.exp(-(X/5.0)**2)

天真的方法失败了:

from numpy.fft import *
from matplotlib import pyplot

def plotReIm(x,y):
    f = pyplot.figure()
    ax = f.add_subplot(111)
    ax.plot(x, numpy.real(y), 'b', label='R()')
    ax.plot(x, numpy.imag(y), 'r:', label='I()')
    ax.plot(x, numpy.abs(y), 'k--', label='abs()')
    ax.legend()


Y_k = fftshift(fft(Y))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

real(Y_k) 在正值和负值之间跳跃,这对应于跳跃阶段,该阶段不存在于符号结果中。这当然是不可取的。 (从技术上讲,结果是正确的,abs(Y_k) 给出了预期的幅度,ifft(Y_k) 是 Y。)

这里,函数 fftshift() 将数组 k 单调递增并相应地改变 Y_k。将此操作应用于两个向量不会改变 zip(k, Y_k) 对。

此更改似乎解决了该问题:

Y_k = fftshift(fft(ifftshift(Y)))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

如果需要单调 Y 和 Y_k,这是使用 fft() 函数的正确方法吗?

上式的逆运算为:

Yx = fftshift(ifft(ifftshift(Y_k)))
x = fftshift(fftfreq(len(Y_k), k[1] - k[0]))
plotReIm(x,Yx) 

对于这种情况,文档 http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.ifft.html?highlight=ifft#numpy.fft.ifft明确指出 Y_k 的排序必须与 fft() 和 fftfreq() 的输出兼容,我们可以通过应用 ifftshift() 来实现。

这些问题已经困扰我很长时间了: fft() 和 ifft() 的输出和输入数组是否总是这样a[0] should contain the zero frequency term, a[1:n/2+1] should contain the positive-frequency terms, and a[n/2+1:] should contain the negative-frequency terms, in order of decreasingly negative frequency[numpy 参考],其中“频率”是自变量?

答案关于高斯的傅里叶变换不是高斯 https://stackoverflow.com/questions/5398304/fourier-transform-of-a-gaussian-is-not-a-gaussian-but-thats-wrong-python/5398901#5398901没有回答我的问题。


FFT 可以被认为是产生一组向量,每个向量都有幅度和相位。 fft_shift 操作将零相位角的参考点从 FFT 孔径的边缘更改为原始输入数据矢量的中心。

完成此操作后,结果的相位(以及复数矢量的实数分量)有时不会那么“跳跃”,特别是如果某些输入函数被加窗,使其在 FFT 孔径边缘周围不连续。或者,如果输入围绕 FFT 孔径中心对称,则 FFT 结果的相位在 fft_shift 后将始终为零。

fft_shift 可以通过 N/2 的矢量旋转来完成,或者通过简单地翻转 FFT 结果中的交替符号位来完成,这可能对 CPU dcache 更友好。

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

离散傅里叶变换:如何正确使用 fftshift 和 fft 的相关文章

随机推荐

  • devicePixelRatio可以小于1吗

    由于某种原因 任何小于 1 的像素比值在我的渲染算法中都不起作用 值 0 没有意义 但 0 5 则有意义 有没有可能devicePixelRatio返回 0 到 1 之间的值 如果您将浏览器缩放设置为小于 100 则 DPR 可能小于 1
  • 制作(从源代码安装)python 而不运行测试

    我从源码 tar 编译 python 一切正常 但测试运行了 2 小时和两次 如何绕过这些测试 0 16 20 178 405 test inspect 0 16 26 179 405 test int 0 16 27 180 405 te
  • 如何在 tvOS 中打开 GameCenter

    如何在 tvOS 中打开游戏中心排行榜 我已将此代码用于我的 iPhone 游戏 排行榜标识符 在 tvOS 上不可用 我计划在 AppleTV 上使用相同的排行榜 这将是同一个游戏 非常感谢您的帮助 斯特凡 IBAction func h
  • xsl 在 xml 中定义

    我在 movie xml 中的前几行如下
  • 当子文件夹具有相同名称时,Airflow Packaged Dags(压缩)会发生冲突

    我们正在建立一个 Airflow 框架 多个数据科学家团队可以在其中协调他们的数据处理管道 我们开发了一个 Python 代码库来帮助他们实现 DAG 其中包括各种包和模块中的函数和类 还有 Operator 子类 每个团队都会将自己的 D
  • 语言验证消息

    我在用ASP NET MVC 5 我正在尝试获取消息ValidationMessageFor法语 xxx 字段为必填项 gt Le champ xxx est manquant 我已经在两台服务器上部署了我的网站 Windows Serve
  • 如何检测和调试多线程问题?

    这是后续这个问题 https stackoverflow com questions 493311 how to write safe correct multi threaded code in net 我在这一点上没有得到任何意见 这是
  • 使用 websocket 处理连接丢失

    我最近设置了一个工作正常的本地 WebSocket 服务器 但是我在理解应该如何处理客户端或服务器都不是故意启动的连接突然丢失时遇到了一些麻烦 即 服务器断电 以太网电缆拔出等 我需要客户端知道连接是否在 10 秒内丢失 客户端 连接很简单
  • 如何将h1和h2写在同一行?

    我有一个页面 我只想制作一个标题 该标头是一个 h1 文本左对齐 并且 h2 右对齐 在同一行 在它们之后 hr 到目前为止 我的代码如下所示 如果您测试它 您会发现它是错误的 h1 align left Title h1 h2 align
  • 如何以整数形式反转 RGB 颜色?

    给定 32 位无符号整数形式的 RGB 颜色 例如 0xFF00FF 如何反转它 获得负颜色 而不使用位移操作提取其各个分量 我想知道是否可以仅使用按位运算 AND OR XOR 更准确地说 使用最少指令数的算法是什么 我觉得就是这么简单
  • 如何从 JSESSIONID 加载 Java HttpSession?

    我想获得JavaHttpSession通过 JSESSIONID 是否可以 如果是 怎么办 您基本上需要手动将它们全部收集在一个Map https docs oracle com en java javase 17 docs api jav
  • android应用程序可以检查手机的版本吗

    我想编写一个使用动态壁纸的应用程序 仅版本 7 及更高版本支持此功能 应用程序是否可以检查 Android 手机的版本 并根据版本运行不同的代码 例如使用动态壁纸或静态背景 你有一个代码示例吗 这需要特殊权限吗 假设您需要 Android
  • 使用pauseOnConnect 通过 https 传递连接

    我正在使用pauseOnConnect选项开启net createServer 允许我将连接传递给我使用集群创建的工作人员 server net createServer pauseOnConnect true function conne
  • 使用Spring boot和javafx会消耗大量内存吗?

    我愿意在我的 JavaFX 应用程序中使用 Spring boot 技术 以获得其依赖注入的优势 但我想知道对内存的影响 因为你知道任何带有 组件 符号的类都会被加载到 MetaSpace 因为 Spring boot 会从中创建一个静态对
  • Laravel 的 5.3 通行证和 api 路线

    我正在使用 Laravel Framework 版本 5 3 9 新下载的内容没有通过作曲家添加任何内容 除了 laravel passport 1 0 我做了中建议的所有事情docs https laravel com docs mast
  • Visual Studio 2010 代码覆盖率 - 找不到由检测实用程序创建的备份文件

    我尝试在 VS 2010 中运行代码覆盖率 但遇到以下错误 不生成覆盖范围信息 代码覆盖率就地检测 无法完全备份二进制文件 MyProject dll 找不到由检测实用程序创建的备份文件 MyProject dll orig 检查为测试运行
  • 使用 PHP/MySQL 比较标签组以查找相似性/分数

    如何将一组标签与数据库中另一个帖子的标签进行比较以获取相关帖子 我想做的是将帖子上的一组标签与另一个帖子的标签进行比较 但不是每个标签单独 假设您想根据帖子中的标签获取真正相关的项目 然后从最相关到 最不相关的顺序显示它们 每次都必须显示三
  • 如何在 C# 中发出 HTTP 请求 [重复]

    这个问题在这里已经有答案了 我如何在 Windows 中用 C 发出卷曲请求或 我想使用此参数发出网络请求 它应该收到有效的响应 request curl http www1 bloomingdales com api store v2 s
  • Spark阶段交换的意义

    谁能解释一下我的 Spark DAG 中的 Spark 阶段中交换的含义 我的大部分阶段要么以交换开始 要么以交换结束 1 WholeStageCodeGen gt 交换 2 交换 gt WholeStageCodeGen gt SortA
  • 离散傅里叶变换:如何正确使用 fftshift 和 fft

    我想对 numpy 数组 Y 进行数值计算 为了进行测试 我使用高斯函数 Y exp x 2 符号 傅立叶变换为 Y 常数 exp k 2 4 import numpy X numpy arange 100 100 Y numpy exp