使用 CUDA 进行希尔伯特变换

2024-03-30

为了对一维数组进行希尔伯特变换,必须:

  • 对数组进行 FFT
  • 将数组的一半加倍,将另一半归零
  • 反 FFT 结果

我正在使用 PyCuLib 进行 FFTing。到目前为止我的代码

def htransforms(data):
    N = data.shape[0]
    transforms       = nb.cuda.device_array_like(data)          # Allocates memory on GPU with size/dimensions of signal
    transforms.dtype = np.complex64                             # Change GPU array type to complex for FFT 

    pyculib.fft.fft(signal.astype(np.complex64), transforms)    # Do FFT on GPU

    transforms[1:N/2]      *= 2.0      # THIS STEP DOESN'T WORK
    transforms[N/2 + 1: N]  = 0+0j     # NEITHER DOES THIS ONE

    pyculib.fft.ifft_inplace(transforms)                        # Do IFFT on GPU: in place (same memory)    
    envelope_function      = transforms.copy_to_host()          # Copy results to host (computer) memory
    return abs(envelope_function)

我有一种感觉,它可能与 Numba 的 CUDA 接口本身有关...它是否允许像这样修改数组(或数组切片)的各个元素?我认为可能会,因为变量transforms is a numba.cuda.cudadrv.devicearray.DeviceNDArray,所以我想它可能有一些与 numpy 相同的操作ndarray.

简而言之,使用 Numbadevice_arrays,对切片进行简单操作的最简单方法是什么?我得到的错误是

*= 不支持的操作数类型:“DeviceNDArray”和“float”


我会用pytorch https://pytorch.org/

您使用 pytorch 的函数(并且我删除了abs以返回复数值)

def htransforms(data):
    N = data.shape[-1]
    # Allocates memory on GPU with size/dimensions of signal
    transforms       = torch.tensor(data).cuda()
    
    torch.fft.fft(transforms, axis=-1)
    transforms[:, 1:N//2]      *= 2.0      # THIS STEP DOESN'T WORK
    transforms[:, N//2 + 1: N]  = 0+0j     # NEITHER DOES THIS ONE

    # Do IFFT on GPU: in place (same memory)
    return torch.abs(torch.fft.ifft(transforms)).cpu() 

但你的变换实际上与我发现的不同维基百科 https://en.wikipedia.org/wiki/Hilbert_transform#Discrete_Hilbert_transform

维基百科版本

def htransforms_wikipedia(data):
    N = data.shape[-1]
    # Allocates memory on GPU with size/dimensions of signal
    transforms       = torch.tensor(data).cuda()
    
    transforms = torch.fft.fft(transforms, axis=-1)
    transforms[:, 1:N//2]      *= -1j      # positive frequency
    transforms[:, (N+2)//2 + 1: N] *= +1j # negative frequency
    transforms[:,0] = 0; # DC signal
    if N % 2 == 0:
        transforms[:, N//2] = 0; # the (-1)**n term
    
    # Do IFFT on GPU: in place (same memory)
    return torch.fft.ifft(transforms).cpu() 
data = torch.zeros((1, 2**10))
data[:, 2**9] = 1;
tdata = htransforms(data).data;
plt.plot(tdata.real.T, '-')
plt.plot(tdata.imag.T, '-')
plt.xlim([500, 525])
plt.legend(['real', 'imaginary'])
plt.title('inpulse response of your version')
data = torch.zeros((1, 2**10))
data[:, 2**9] = 1;
tdata = htransforms_wikipedia(data).data;
plt.plot(tdata.real.T, '-');
plt.plot(tdata.imag.T, '-');
plt.xlim([500, 525])
plt.legend(['real', 'imaginary'])
plt.title('inpulse response of Wikipedia version')

您的版本的脉冲响应是1 + 1j * h[k] where h[k]是维基百科版本的脉冲响应。如果您正在使用真实数据,则维基百科版本很好,因为您可以使用rfft https://pytorch.org/docs/stable/fft.html#torch.fft.rfft and irfft https://pytorch.org/docs/stable/fft.html#torch.fft.irfft产生一个线性版本

def real_htransforms_wikipedia(data):
    N = data.shape[-1]
    # Allocates memory on GPU with size/dimensions of signal
    transforms       = torch.tensor(data).cuda()
    transforms = -1j * torch.fft.rfft(transforms, axis=-1)
    transforms[0] = 0;
    return torch.fft.irfft(transforms, axis=-1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CUDA 进行希尔伯特变换 的相关文章

  • “扩展”numpy ndarray 的好方法?

    有没有 扩展 numpy ndarray 的好方法 假设我有一个像这样的 ndarray 1 2 3 4 我希望每行通过填充零来包含更多元素 1 2 0 0 0 3 4 0 0 0 我知道一定有一些蛮力的方法可以做到这一点 比如构造一个带有
  • Redis - 错误:值不是有效的浮点数

    我在 Redis 中有一个排序集 我试图通过在Python代码中使用zincrby来更新特定元素的计数器值 例如 conn zincrby usersSet float 1 user1 但它显示错误为 错误 值不是有效的浮点数 我在 cli
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 如何在 Django Admin 的“更改”页面中显示内嵌上传的图像?

    我正在尝试在中显示内联上传的图像 变更列表 页面在 Django 管理中 这是我的代码如下 models py from django db import models class Product models Model name mod
  • Flask/Apache 提交按钮用于文件上传

    我有一个在 apache 后面运行的 Flask 应用程序 在我的 index html 页面上有一个文件上传按钮和一个提交按钮 如下所示
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 代码 zip( *sorted( zip(units, error) ) ) 的作用是什么?

    对于我的申请units and errors始终是数值列表 我尝试用谷歌搜索每个部分的作用 并找出了 zip 的第一部分 它似乎 ziped list zip units errors 只需将单位和误差配对即可生成一个列表 如下所示 uni
  • Python3如何安装.ttf字体文件?

    我想使用 python3 更精确的 Python 3 6 代码在 Windows 10 上安装 ttf 字体文件 我用谷歌搜索 但我发现的唯一的就是这个使用python在windows上安装TTF字体 https stackoverflow
  • 不使用 graphviz/web 可视化决策树

    由于某些限制 我无法使用 graphviz webgraphviz com 可视化决策树 工作网络与另一个世界是封闭的 问题 是否有一些替代实用程序或一些 Python 代码用于至少非常简单的可视化可能只是决策树的 ASCII 可视化 py
  • SQLAlchemy 默认日期时间

    这是我的声明模型 import datetime from sqlalchemy import Column Integer DateTime from sqlalchemy ext declarative import declarati
  • 如何对嵌套函数进行单元测试? [复制]

    这个问题在这里已经有答案了 您将如何对嵌套函数进行单元测试f1 在下面的例子中 def f def f1 return 1 return 2 或者需要测试的函数不应该嵌套吗 有一个类似的问题这个链接 https stackoverflow
  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • RuntimeError:模型类 django_messages.models.Message 未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中

    我正在尝试使用https github com arneb django messages https github com arneb django messages打包我的消息传递内容并尝试了以下操作 pip install git h
  • 如何使用 Python Pandas 制作 DataFrame 切片并在特定切片中“fillna”?

    问题 让我们从 Kaggle 获取泰坦尼克号数据集 我有包含 Pclass 性别 和 年龄 列的数据框 我需要用特定组的中位数填充 年龄 列中的 NaN 如果是来自一等的女性 我想用一等女性的中位数填写她的年龄 而不是整个年龄列的中位数 问
  • python 中的异步编程

    python 中有异步编程的通用概念吗 我可以为一个函数分配一个回调 执行它并立即返回主程序流 无论该函数的执行需要多长时间吗 您所描述的 主程序流程在另一个函数执行时立即恢复 不是通常所说的 异步 又名 事件驱动 编程 而是 多任务 又名
  • 检测计算机何时解锁 Windows

    我用过这个优秀的方法 https stackoverflow com questions 20733441 lock windows workstation using python 20733443锁定 Windows 计算机 那部分工作
  • 在 Mac (Catalina) 上安装 PyGame 时出错 [重复]

    这个问题在这里已经有答案了 我一直在尝试将 PyGame 安装到 Catalina 上的 Mac 上 但不知道如何安装 我收到的错误消息是 SystemExit error command gcc failed with exit stat
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • 为什么 Python exec 中的模块级变量无法访问?

    我正在尝试使用Pythonexec in a project https github com arjungmenon pypage执行嵌入的Python代码 我遇到的问题是在模块级 in an exec声明是难以接近的来自同一模块中定义的
  • 无法在 Python 2.4 中解码 unicode 字符串

    这是Python 2 4 中的 这是我的情况 我从数据库中提取一个字符串 它包含一个变音的 o xf6 此时 如果我运行 type value 它会返回 str 然后我尝试运行 decode utf 8 但收到错误 utf8 编解码器无法解

随机推荐

  • div 不会以 margin: 0 auto 居中;

    我的问题只是将 div 居中 目前 我只有一个简单的 html 文件 我不知道为什么margin 0 auto不工作 这是我的 html 的布局
  • 什么是最简单的 Tomcat/Apache 连接器 (Windows)?

    我在 Windows XP 机器上运行 apache 2 2 和 tomcat 5 5 哪个 tomcat apache 连接器最容易设置并且有详细的文档记录 mod proxy ajp http httpd apache org docs
  • 如何正确使用SyncManager.Lock或Event?

    我使用时遇到问题SyncManager Lock正确 我读了官方文档 https docs python org 3 library multiprocessing html multiprocessing managers SyncMan
  • 如何集中primefaces菜单栏?

    我需要集中 primefaces 菜单栏 我试过这个
  • 使用 Apache Ant 清理陈旧的 .class 文件

    怎样清理陈旧的东西 class文件出自 workdir 给定一组现有的 java文件在 srcdir 我所说的陈旧是指 class从现在开始生成的文件被删除 java文件 我尝试过使用 Ant 映射器和文件集等来想出一些东西 但失败了 删除
  • SlugRelatedField 查询集

    我正在努力找出 SlugRelatedField 的查询集 我的数据是这样的 我有一堆Object属于 a 的实例Project 一个项目有一个独特的 顶 Object Object仅当它们位于不同的下面时才可以具有相同的名称Project
  • 在 C# 中复制带有身份验证的文件

    我正在尝试将文件从本地驱动器复制到服务器上的文件夹之一 服务器上文件夹的名称是 DBFiles 除了用户名 user 和密码 password1 之外 没有人可以访问此内容 在复制文件之前 如果目录不存在 它也会创建该目录 有人可以帮助在创
  • 使用 Google Cloud PubSub 时不断收到“向 Cloud PubSub 发送测试消息时出错...”

    我正在尝试将 Google 的推送 PubSub 设置到我的服务器以接收 Gmail 推送通知 我得到以下范围 https mail google com https mail google com https www googleapis
  • PHP 生成 UL LI , UL LI

    无法弄清楚如何使用 while 循环生成此菜单 这是我的代码的示例 ul li a href Hoofdmenu 1 a ul class sub li a href Submenu 1 1 a li li a href Submenu 1
  • 如何让 CSS 浮动保持在一行?

    我想使用以下命令将两个项目放在同一行上float left对于左侧的项目 我独自实现这一点没有任何问题 问题是 我想要这两个项目stay在同一条线上即使您将浏览器大小调整得很小 你知道 就像桌子一样 目标是防止右侧的物品缠绕无论 如何使用
  • 如何包装 ui 控件(mapbox 地理定位控件)

    我想扩展 更改具有某些功能的地图框地理定位控件 例如 我想飞到而不是跳到当前位置 我想在打开地理控制按钮时添加一些行为 例如防止拖动 我怎么做 我尝试制作包装纸 但后来遇到了一些问题 按钮的颜色在打开时应变为蓝色 但确实如此 不再工作了 我
  • Flutter/Dart DateTime 解析 UTC 并转换为本地

    我正在尝试将 UTC 日期字符串解析为DateTime然后将其解析为本地时间 但是我在将其转换为本地时间时遇到了麻烦 在英国它应该加一 但是当我打印时 isUtc它返回为 false 这就是我现在所拥有的 print widget asse
  • 升级到 Google 通用分析

    我一直在四处寻找 以找出升级到 Universal Analytics 时需要考虑的任何事项 我找到了这个帖子 Google Analytics 升级到异步代码 https stackoverflow com questions 12060
  • VB.NET 中的“空安全”点表示法...或者它是否存在于任何语言中? “安全解引用运算符”或使用 LINQ 的等效操作?

    我正在 VB net 中寻找 安全 点符号 在 VB NET 或任何语言中是否存在这样的东西 我想要做的是 当使用不可为空遗留对象 解决如下问题 如果有一个计划 如果有一个案例 如果它有一个人 那个人的配偶 否则什么都没有 VBS表示 空
  • 在 Mac OS X Yosemite 上安装 pymssql 时出错

    我在 OS X Yosemite 10 10 3 上安装 pymssql 时收到以下错误 有人解决了以下错误吗 我正在使用 FreeTDS v0 91 112 版本 7 1 和 Python 2 7 6 tsql 实用程序连接到 SQL 数
  • sh 和 bash 中 pgrep 的区别

    这是一个测试 bash c pgrep f novalidname sh c pgrep f novalidname 11202 Why is pgrep运行时给出输出sh 据我所知 我的计算机上没有名为novalidname 这可能是一个
  • 链接到外部 css 文件

    我一直在尝试将我在本地计算机中创建的 css 文件链接到我的 html 代码 但它似乎不起作用 我们应该在 html 代码中保存想要链接的 css 文件 或者我们应该如何链接到该文件 作为一个例子 我发布了这个 html 代码
  • 功能证明 (Haskell)

    我没能读懂 RWH 我命令没有人放弃Haskell 函数式编程的技巧 现在我对第 146 页上的这些功能证明很好奇 具体来说 我试图证明 8 5 1sum reverse xs sum xs 我可以做一些归纳证明 但后来我陷入困境 HYP
  • opencv无法保存视频

    我正在尝试使用 opencv 写入方法保存视频 但视频保存为 0 kb 我的代码出了什么问题 import cv2 cap cv2 VideoCapture k1 mp4 assert cap isOpened fgbg cv2 bgseg
  • 使用 CUDA 进行希尔伯特变换

    为了对一维数组进行希尔伯特变换 必须 对数组进行 FFT 将数组的一半加倍 将另一半归零 反 FFT 结果 我正在使用 PyCuLib 进行 FFTing 到目前为止我的代码 def htransforms data N data shap