问题标签 [vdsp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 以波动的时间间隔捕获的线性重采样数据点,到固定的时间间隔,迅速
我想将一些在波动时捕获的指标线性插值到固定的时间间隔。
Accelerate
提供vDSP_vlint但我正在努力弄清楚如何为我的应用程序实现它。
ios - 使用 Accelerate Framework 将分贝转换为音量
我正在构建某种音频推子效果。
我正在使用 vDSP_vdbcon 将音量缓冲区转换为分贝,在 db-space 中应用一些修改,并希望使用加速框架将分贝缓冲区转换为音量。
谢谢!
c - vDSP FFT2d Swift 结果虚部错误
我正在使用 Accelerate 框架中的 vDSP 在来自网格的二维数组中执行 fft2d 操作。
问题是我在虚部得到了一个 0 数组,它与使用 pylab.fft2 的 python 中的相同操作不匹配。
如果我增加数组大小,结果不会为零,但无论如何都不匹配,所以我做错了。
有人可以帮我一把吗?这是我的第一个堆栈溢出问题,但我现在被困了两个星期。
这是网格(此示例为 4x8)
这是 fft2 函数:
最后,这是我用于将数组从/到 2d 到 1d 打包和解包的函数
我将不胜感激有关此的任何信息,如果最容易使其像在 python 中一样工作,我可以将其更改为 C 或 Objective-C。
迅速的结果:
蟒蛇结果:
提前致以诚挚的问候和感谢!!
编辑 1
这是相同代码的 C 版本:http: //pastebin.com/C9RPgu68
这是python代码: http: //pastebin.com/rr4e6rku
c - 3D 中的矢量加速欧几里得距离
我需要执行一个非常常见且简单的矩阵运算。
但是我需要它快,真的快...
我已经在考虑多线程实现,但是现在我只想看看在单个处理器上我能多快得到它。
矩阵运算如下:
我正在计算点向量 (A) 和参考点 (B) 之间的欧几里得距离。
这些点位于 3D 空间中,每个点都有一组 X、Y 和 Z 坐标。
因此,点的向量由三个浮点数组来描述,其中包含每个点的 X、Y、Z 坐标。
输出是另一个长度为 N 的向量,其中包含数组中每个点与参考点之间的距离。
三个 XYZ 阵列排列为 Nx3 矩阵的列。
在内存中,矩阵按行优先顺序排列为一维数组,其中依次包含 X、Y 和 Z 列的值。
由于我们需要在取平方根之前向矩阵的每个成员添加一个标量,因此整个事情稍微复杂了一点。
以下是纯 C 代码中的例程:
…这里是简单的 Accelerate 实现(使用 vDSP 和 VecLib):(
请注意,所有处理都是就地执行的)
在 vDSP 库中,唯一可用于计算向量之间距离的函数是:
也许我遗漏了一些东西,但据我所知,它们都不支持计算 3D 距离所需的三个输入向量。
有几点需要注意:
(1)我没有比较距离,所以我不能忍受平方距离。我需要真实的距离,因此计算平方根是绝对必要的。
(2) 如果您真的认为这样做会显着加快代码速度,那么取平方根倒数是可能的。
我的印象是我没有充分利用 Accelerate 框架的潜力。
我正在寻找更智能、更简洁的东西,在更少的函数调用中做更多的工作。以其他方式重新排列内存也可以,但是我认为内存布局还是不错的。
我也愿意接受有关在英特尔处理器上工作的其他高度优化/矢量化线性代数库的建议。我不在乎它们是商业解决方案还是开源解决方案,只要它们的性能快速且强大。
问题是:Accelerate 框架中实现比上述更快的代码的最佳功能或功能组合是什么?
我正在运行 Mac OS X El Capitan 的 MacBook Pro(Retina,15 英寸,2014 年中)上的 Xcode 7 中进行开发。
谢谢。
ios - iOS - iOS 的简单重采样音频功能
我正在使用 Novocaine 录制音频,用于音频处理 iOS 应用程序。我有一个自定义音频过滤器,我在录制后应用它。现在我希望以 8kHz 重新采样音频。所以基本上我需要一个简单的模块/函数,我在其中传递音频数据缓冲区,并简单地获得重采样音频。
我在互联网上查看过,但没有找到符合我对 iOS 要求的通用重采样音频数据解决方案。
请帮助我,我将非常感谢你。
signal-processing - 在 IOS 中高效生成正弦波
为运行 IOS 的设备生成正弦波的最有效方法是什么。出于练习的目的,假设频率为 440Hz,采样率为 44100Hz,样本数为 1024。
一个普通的 C 实现看起来像。
为了利用 Accelerate Framework 和 vecLib vvsinf 函数,可以将循环更改为仅执行加法。
但是,就效率而言,我应该尽可能地应用 vvsinf 函数吗?
我不太了解 Accelerate 框架,不知道我是否也可以替换循环。我可以使用 vecLib 或 vDSP 函数吗?
就此而言,是否可以使用完全不同的算法来用正弦波填充缓冲区?
swift - 来自 vDSP_meanD 的奇怪值
我正在使用 vDSP_meanD 函数来确定数据集的平均值(与数组的连续差异)
我正在使用的代码如下
在线程块中调用函数 F
F函数在具有不同变量实例的多个调度块中被调用,然后我得到从vDSP_meanD返回的值的不同值是否有任何可能发生这种情况的上下文?线程调用可能对此有一些影响吗?任何“灯”将不胜感激
swift - vDSP_conv() 结果不正确
与 MATLAB 实现相比,尝试使用 Accelerate 中的 vDSP_conv() 进行卷积时,我得到的结果不一致。在使用此函数计算卷积时,有几篇关于奇怪结果的 StackOverflow 帖子,但据我所知,我正确使用了该框架,并结合了其他 Stack Overflow 帖子的建议。这是我的代码:
据我所知,我正在按照此处的 Accelerate 框架文档中的说明进行正确的零填充
我定义了两个测试数组A: [Float] = [0, 0, 1, 0, 0]
和B: [float] = [1, 0, 0]
.
在 MATLAB 中,当我运行 时conv(A, B)
,我得到[0, 0, 1, 0, 0, 0, 0]
.
但是,当我运行上面的 vDSP 时,conv()
我得到了[1, 0, 0, 0, 0, 0, 0]
.
我的实施有什么问题?我已经检查了很多次,并查看了我能找到的所有 SO 帖子,但仍然无法解释这种不一致。
除此之外,还有比我这里更有效的方法来对数组进行零填充吗?为了保持x
不可变,我创建了新xPadded
数组,但毫无疑问有一种更有效的方法来执行此填充。
** 编辑 ** 正如 Martin R 所建议的,我k.count -1
在数组的开头和结尾处平均填充,如下所示。
使用此代码,conv(A, B)
仍然返回 [1, 0, 0, 0, 0, 0, 0]。
我正在调用该函数,如下所示:
ios - 如何使用数字插值对音频进行上采样
我想获取一个包含 N 个音频数据点的数组并对其进行上采样,以便有 L*N 个点。我知道一个准确的方法是在每个原始点之间填充 L-1 个零点,然后低通信号。根据这个 4 分钟的视频https://www.youtube.com/watch?v=sJslC6TuCoc我应该以 Pi / L 的频率低通,然后在结果中添加 L 增益以正确上采样我的信号。我在这个低通过步骤时遇到了问题,我的结果音频信号根本听不到。有人能帮我一下吗?这个“低通”真的更像带阻滤波器还是什么?
我的低通算法在此处注明(系数在“LPF”下标记的双二阶传递函数): http: //music.columbia.edu/pipermail/music-dsp/1998-October/054185.html
arrays - 将 ArraySlice 与 Accelerate 函数一起使用的更好方法?
我有一些非常大的数组,我必须对其执行数百万次计算。在 Objective-C 中,数组将存储为 NSData,我会将它们抽象为 C 数组以使用 Accelerate 函数(求和、加法等)。但是,(考虑到到处使用指针的明显问题)我希望更多地使用边界检查 Swift 数组是否已内置。因此,我可以使用嵌套的 withUnsafeBufferPointer 来处理两个数组。
首先,将指针重铸为预期类型似乎很奇怪,因为编译器已经知道如何转换 [Double] 本身(在块内传递的指针是 type UnsafeBufferPointer<Double>
,而 vDSP 函数是期望的UnsafePointer<Double>
(同样,没有如果我将数组变量本身传递给它))。其次,不得不嵌套withUnsafeBufferPointer
看起来很奇怪,虽然我了解用法。最后,如果我使用ArraySlice<Double>
作为输入参数类型,那么我不能将函数泛化为双精度数组和该数组的切片。
有一个更好的方法吗?