问题标签 [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.
iphone - 检测来自相机的光脉冲
我正在尝试为 iPhone 实现心跳检测器算法考虑到已经有几个应用程序这样做的事实,这是出于教育目的......
我有这个功能可以让我的框架中的颜色变化......
以及以下函数来获取图像中的主色
但是从每一帧绘制红色分量的序列并没有给我一个可靠的心跳图......
这是正确的方法吗?我正在使用 FFT,但我认为处理信号的频谱以计算峰值是没用的……也许我可以使用 FFT 来应用带有低通滤波器的卷积而不是逆 FFT 来检查这些新数据的峰值......
c++ - 使用 vDSP_deq22(双二阶 IIR 滤波器)进行滤波器后的噪声/失真
我正在为Novocaine开发一个 DSP 类(obj-c++) ,但我的过滤器似乎只会对信号造成噪声/失真。
我在这里发布了我的完整代码和系数:https ://gist.github.com/2702844 但它基本上归结为:
有关完整代码/上下文,请参阅要点。
系数:
(全部除以a0
)
由于我假设系数的顺序为:({ b0/a0, b1/a0, b2/a0, a1/a0, a2/a0 }
请参阅:IIR 用于峰值 EQ 的系数,如何将它们传递给 vDSP_deq22?)
是什么导致失真/噪音(过滤器不起作用)?
ios - 使用 IOS Accelerate Framework 对非二次幂图像进行 2D 信号处理?
//编辑...
我正在稍微编辑我的问题,以解决专门处理非二次幂图像的问题。我有一个基本结构,适用于大小为 256x256 或 1024x1024 的方形灰度图像,但看不到如何推广到任意大小的图像。fft 函数似乎希望您包含宽度和高度的 log2,但随后不清楚如何解压缩结果数据,或者数据是否只是被打乱。我想显而易见的事情是将 npot 图像居中在一个更大的全黑图像中,然后在查看数据时忽略这些位置的任何值。但是想知道是否有一种不那么尴尬的方式来处理 npot 数据。
//...结束编辑
我在使用 Accelerate Framework 文档时遇到了一些问题。我通常会使用 FFTW3,但我无法在实际的 IOS 设备上编译它(参见这个问题)。谁能指出我使用 Accelerate 的一个超级简单的实现,它执行以下操作:
1) 将图像数据转换为可以传递给 Accelerate 的 FFT 方法的适当数据结构。
在 FFTW3 中,最简单的是,使用灰度图像,这涉及将无符号字节放入“fftw_complex”数组中,该数组只是两个浮点数的结构,一个保存实数,另一个保存虚数(虚数在每个像素初始化为零)。
2) 采用此数据结构并对其执行 FFT。
3) 打印出幅度和相位。
4) 对其执行IFFT。
5) 根据 IFFT 产生的数据重新创建原始图像。
尽管这是一个非常基本的示例,但我在使用 Apple 网站上的文档时遇到了问题。Pi 在这里的 SO回答非常有帮助,但我仍然对如何使用 Accelerate 使用灰度(或彩色)2D 图像执行此基本功能感到有些困惑。
无论如何,任何指针或特别是一些处理 2D 图像的简单工作代码都会非常有帮助!
\\\ 编辑 \\\
好的,在花一些时间深入研究 SO 以及pkmital 的 github repo上的文档和一些非常有用的代码之后,我有一些我认为我会发布的工作代码 1)我花了一段时间才弄清楚2)因为我还有几个问题......
初始化 FFT“计划”。假设一个二次方图像:
传入一个字节数组以获得二次方灰度图像并将其转换为 COMPLEX_SPLIT:
对转换后的图像数据运行 FFT,然后获取幅度和相位:
现在您可以对 out_fft 数据运行 IFFT 以获取原始图像...
或者您可以在幅度上运行 IFFT 以获得自相关......
最后,您可以将 ifft 结果放回图像数组中:
我还没有弄清楚如何使用 Accelerate 框架来处理非二次幂图像。如果我在设置中分配了足够的内存,那么我可以进行 FFT,然后进行 IFFT 以获得我的原始图像。但是,如果尝试进行自相关(与 FFT 的幅度),那么我的图像会得到不稳定的结果。我不确定适当填充图像的最佳方法,所以希望有人知道如何做到这一点。(或分享 vDSP_conv 方法的工作版本!)
ios - iOS 音频加速
有人成功使用 OpenGLES2.0 着色器 (GLSL) 进行音频合成吗?
我已经在我的 iOS 应用程序中使用 vDSP 来加速音频,它提供了一个来自 C 代码的简单矢量指令集。vDSP 的主要问题是您必须编写相当于面向向量的汇编语言,因为每个样本的主循环被推入每个原始操作(向量加法、向量乘法)。将表达式编译到这些序列中是着色器语言为您自动化的本质。OpenCL 在 iOS 中不公开。有趣的是,GLSL 是在运行时编译的,这意味着如果大部分声音引擎都可以在 GLSL 中,那么用户可以做出不平凡的补丁贡献。
objective-c - 使用重叠执行缓冲/窗口添加 CMSampleBufferRef
我正在尝试对我使用 iPhone 上的 AVAssetReader 从视频文件中检索的 PCM 音频数据执行一些基本的 DSP 功能。我正在正确读取缓冲区,每个缓冲区的样本数为 8192(默认情况下是这样吗?可以更改吗?)。但是,我需要对不长 8192 个样本的切片执行加窗、fft 和各种其他操作。事实上,我想一次处理 512 个样本,每个切片之间有 50% 的重叠。我一直在深入研究 Apple 的 Accelerate/vDSP 框架,我认为我可以处理处理等等,只是不确定如何以我想要的方式实际拆分我的信号。我有很强的 DSP 背景,但不幸的是,我的 DSP 编程经验几乎以 MATLAB 结束。
任何帮助将不胜感激。
iphone - 如何使用 vDSP 函数进行短时傅里叶变换?
我试图了解如何将 vDSP 函数用于 STFT。所以我使用苹果示例中的 FFT 代码,我可以得到前 1024 帧的 FFT,但是我怎么能得到下一个 1024 - 2047 帧的 FFT 等等,直到文件结束..(在这种情况下,我想象文件的大小是 int f = 10000)。
arrays - Why does order of array declaration affect performance so much?
First, in tuning a frequency analysis function using the Accelerate framework, the absolute system time has consistently been 225ms per iteration. Then last night I changed the order of which two of the arrays were declared and suddenly it went down to 202ms. A 10% increase by just changing the declaration order seems insane. Can someone explain to me why the compiler (which is set to optimize) is not already finding this solution?
Additional info: Before the loop there is some setup of the arrays used in the loop consisting of converting them from integer to float arrays (for Accelerate) and then taking sin and cos of the time array (16 lines long). All of the float arrays (8 arrays x 1000 elements) are declared first in the function (after a sanity check of the parameters). They are always declared the same size (by a constant), because otherwise performance suffered for little shrinkage of the footprint. I tested making them globals, but I think the compiler already figured that out as there is no performance change. The loop is 25 lines long.
---Additions---
Yes, "-Os" is the flag. (default in Xcode anyways: Fastest, Smallest)
(below is from memory - don't try to compile it, cause I didn't put in things like stride (which is 1), etc. However, all of the Accelerate calls are there)
passed parameters: inttimearray, intamparray, length, scale1, scale2, amp
---Current Solution---
I've made some changes as follows:
The arrays are all declared aligned, and zero'd out (I'll explain next) and maxsize is now a multiple of 16
I've zero'd out all of the arrays because now, when the length is less than maxsize, I round the length up to the nearest multiple of 16 so that all of the looped functions operate on widths divisible by 16, without affecting the sums.
The benefits are:
- Slight performance boost
- The speed is nearly constant regardless of order of array declaration (which is now done right before they are needed, instead of all in a big block)
- The speed is also nearly constant for any 16-wide length (i.e. 241 to 256, or 225 to 240...), whereas before, if the length went from 256 to 255, the function would take a 3+% performance hit.
In the future (possibly with this code, as analysis requirements are still in flux), I realize I'll need to take into consideration stack usage more, and alignment/chunks of vectors. Unfortunately, for this code, I can't make these arrays static or globals as this function can be called by more than one object at a time.
matlab - 非对数基数的 Matlab FFT(快速傅里叶变换)函数
我有一个正在开发的应用程序,它利用了Apple 的 Accelerate Framework FFT 函数,我试图让它模仿Matlab 的 FFT 函数的功能。我将当前代码设置为输出方式与我在 matlab 中的输出方式完全相同。唯一不输出相同的情况是数据数组中的元素数量!= 以 2 为底的对数(FFT 技术上必需的)。我想知道是否有人知道 Matlab 函数是如何处理这种情况的。如果我使用苹果代码来做,它会产生不同的结果。
注意:我不是简单地调用 fft(x)。我也 FFT 移位并取绝对值并将其平方。我也在苹果代码中反映了这些,因为它们不受 FFT 的直接影响。他们在事后被调用。
示例 1 - 16 个元素(对数基数 2): 类似的输出
Matlab调用:
*由于篇幅原因省略了苹果代码
苹果输出:
示例 2 - 10 个元素(非对数基数 2):不同的输出
Matlab调用:
*由于篇幅原因省略了苹果代码
苹果输出:
如您所见,它们在第一个示例和第二个示例中显然产生了相同的输出。我已经用正负输入进行了测试,唯一不同的是它们不是对数基数 2。有谁知道 Matlab 如何处理这个问题?也许它用 0 填充数组,直到它的对数基数为 2,然后对某些点进行平均?我做了很多搜索,无法弄清楚在这种特殊情况下他们做了什么来获得他们的输出。
objective-c - 是否可以将结果存储在 vDSP 框架中的输入向量之一中
在 Accelerate Framework 的 vDSP 函数中,所有函数都需要您输入结果向量。如果我不再需要原始输入向量中的任何内容,将输入向量(或输入向量之一)作为结果向量传递是否正确?
我的意思的例子:
这将采用 input_vector 并将 scalar_addition 添加到所有元素。结果将存储在 input_vector 中。
ios - 苹果加速框架——约束幅度而不损失绝对值
我想使用苹果的加速来有效地剪辑音频信号。如果信号大于1或小于-1,我想让它等于1或-1。vDSP_vmaxmg
看起来这几乎就是我要找的东西,但不完全是。文档说它这样做:
输出向量 C 的每个元素是来自输入向量 A 和 B 的对应值的幅值中较大的一个。
所以看起来输出vDSP_vmaxmg
总是输入的绝对值,总是正的。如果我想保留信号输出的绝对值但限制幅度,加速框架可以帮助我吗?