问题标签 [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.
signal-processing - 加速框架 vDSP、FFT 成帧
我正在尝试使用 Apple 的 vDSP 在录制的音频文件上实现 FFT 计算(假设它是单声道 PCM)。
我在这里进行了研究,发现以下主题非常有用:
例如,我们为 FFT 配置了 frame_size N = 1024 个样本,log2n=10:
代码中的某处:
根据我对 FFT 使用的理解,我现在缺少的是如何获得大型音频文件的完整频谱,让我们假设总共 12800 个样本。
问: 我是否需要将原始数据分成大小为 1024 个样本的帧(~ 12800 / 1024 = 13 帧),然后分别对每个帧执行 FFT,然后以某种方式将 13 个 FFT 结果平均化为结果频谱?如果假设正确,那么如何进行平均?
我真的很感激任何帮助。
objective-c - 在 MATLAB 文件的 Objective-C 中执行 FFT
对于我正在进行的当前项目,我需要在修改 FFT 以读取实时数据之前,使用 Accelerate Framework 在 MATLAB 中生成的正弦波上测试我在 Objective-C 中实现的 FFT。但是,我对如何将 MATLAB 文件加载到我的 Xcode 项目中,然后用我的 FFT 测试文件有点迷失......有人知道从哪里开始吗?
performance - OpenCL 慢——不知道为什么
我通过尝试优化 mpeg4dst 参考音频编码器来自学 OpenCL。我通过在 CPU 上使用矢量指令实现了 3 倍的加速,但我认为 GPU 可能会做得更好。
我专注于计算 OpenCL 中的自相关向量,这是我的第一个改进领域。CPU代码是:
在我的测试文件中,这个函数大约需要 188 毫秒才能完成。
这是我的 OpenCL 方法:
这就是它的名称:
根据 Instruments 的说法,我的 OpenCL 实现似乎需要大约 13 毫秒,大约 54 毫秒的内存复制开销 (gcl_memcpy)。
当我使用更大的测试文件时,2 声道音乐 1 分钟 vs 6 声道 1 秒,而 OpenCL 代码的测量性能似乎相同,CPU 使用率下降到 50% 左右,整个程序需要大约 2 倍的时间来运行。
我在 Instruments 中找不到导致此问题的原因,而且我还没有阅读任何内容表明我应该预期在进出 OpenCL 时会有非常沉重的开销。
signal-processing - vDSP 怎么了?
在尝试使用 zrvmul、vvsinf 和 vvcosf(在 vForce.h 中定义)之类的函数时,我得到“没有匹配函数”错误。我#包括加速框架,并在构建阶段将其链接起来。此外,我正在使用其他加速功能,如 vDSP_fft_zip 没有问题。
当然,我可以使用 for 循环来解决这个问题。但是任何人都可以为我说明情况吗?有没有办法仍然使用 vForce 功能?如果有怎么办?
signal-processing - 用于信号合成的重叠添加
如果这个问题非常基本,我深表歉意。
我正在使用 FFT 将音频信号(目前是纯正弦波)从时域转换到频域,然后返回时域以比较与原始信号的差异。
目前我这样做:
- 采用非重叠帧(例如每帧 1024 个样本)。
- FFT 该帧
- iFFT 频域信息
- 将输出发送到扬声器
编辑(1):
这似乎现在可以工作(参见没有和有窗口的图像,其中输入=棕色,输出=蓝色)。
结束编辑 (1)
现在我想执行overlapp-add 方法:
- 采用50% 重叠的帧(样本0-1023、512-1535、1024-2047...)
- 将Hanning 窗口应用于ecah 帧
- FFT
- iFFT
- ?? ? 这是我的问题!!
所以在我的 iFFT 结束时,我有一个 1024 个样本的输出帧。这是否意味着我需要将前 512 个样本发送给扬声器,而其他 512 个样本 (512-1023) 应该保存在缓冲区中以添加到下一帧的前 512 个样本中?是这么简单还是我误解了什么?
谢谢!
audio - 音频分析合成中的重叠添加
我编写了一些将音频信号(当前为正弦波)作为输入的代码,并执行以下操作:
n
取(1024) 个样本的帧- 应用 FFT
- 应用 iFFT
- 播放输出
通过这个过程,输出信号与输入信号基本相同。
现在,在第二次尝试中,我做了:
- 从输入中获取重叠帧
- 应用窗口函数
- 快速傅里叶变换
- 快速傅里叶变换
- 重叠输出帧
在步骤 1 中,如果我使用 2 的幂(4、8、256...)的跳跃大小(跳到下一帧的样本数)来获取重叠帧,则输出声音很平滑并且类似于原始输入声音,但是对于任何其他的跃点大小,声音开始减弱。这发生在输入信号的任何频率上。问题 1. 为什么只有 hop size 为 2^n 时声音才流畅?.
目前我使用汉宁窗。当跳数较大(例如 512)时,输出声音的音量低于跳数较小(例如 64)时的音量。这似乎是一种预期行为,因为小跳数意味着用更多帧重构样本,因此添加了更多信号。问题 2. 有没有办法正确缩放输出信号,使音量类似于原始信号?
谢谢!
ios - iOS:在 64 位中使用 vDSP 功能
在 iOS 中,我有一个依赖于vDSP_vgathr的函数调用,它是 Apple Accelerate 框架的成员:
我看到了一个与我得到的错误有关的问题EXC_I386_GPFLT
,以及 64 位系统和非规范指针。我见过的解决方案(和另一个tgmath.h
)建议包括,但是当使用(成功编译)时,它什么也不做,我仍然得到EXC_I386_GPFLT
.
我尝试了许多其他潜在的解决方案,包括类型转换各种对象和不同的函数调用。我怎样才能使这个函数调用在 64 位架构下工作?
ios - 加快对向量中的分量求和
我想通过将四个块中的组件相加来从另一个数组创建一个数组,例如:
我想加快这一进程。我查看了 iOS 中可用的库,例如 vDSP 和 vForce,但没有找到任何适合的库。最接近的候选者是 vDSP_vswsum,但这不是我想要的。有没有人有关于如何加快速度的提示?
ios - 使用 Accelerate 框架 (vDSP) 和 Novocaine 的带通滤波器录音
我对信号处理相当陌生,所以请多多包涵。我正在尝试实现一个带通滤波器以应用于从 iPad 获得的录音。录音已使用 ExtFile 函数和 AudioBufferList 转换为 Float32 指针。采样率为 44100Hz。录音长约 9 秒(大约 396900 个样本),包含 2-6kHz 的啁啾声和一些环境噪声。我需要对 2-6kHz 频率范围内的录音进行带通滤波,以便找出啁啾声发生的时间点。我参考了以下资源来创建带通滤波器:
https://github.com/bartolsthoorn/NVDSP/blob/master/NVDSP.mm
https://github.com/bartolsthoorn/NVDSP/blob/master/Filters/NVBandpassFilter.m
我的问题是,我可以简单地将用于记录的浮点值数组传递给上面的带通滤波器吗?我已经尝试过了,但我不确定它是否有效,因为它似乎只是减少了数组中每个值的值。通过录音后我应该看到什么
但是,我看到一些资源说我首先需要使用 FFT 将值从时域转换为频域。我已经尝试使用一些 vDSP 函数来执行以下代码:
但我不明白这个函数返回了什么。如果在将记录传递给过滤器之前确实需要应用 FFT,那么需要从 calculateFFT 函数返回什么然后传递给过滤器?
提前致谢。
ios - 从 vDSP_conv 返回的奇怪结果
我一直在使用 Accelerate 框架进行一些音频信号处理,并且一直在使用该vDSP_conv
函数来执行一些互相关。通常,返回的值是这样的(左列是数组索引,右列是从返回后该索引处的数组值vDSP_conv
):
但有时结果看起来像这样,没有明显的原因:
得到这些结果后,我再次运行程序,它们又回到了原始(正确)结果。有没有其他人经历过这种情况或对为什么会发生有任何想法?