有没有人用过Apple FFT
iPhone应用程序或知道我在哪里可以找到一个如何使用它的示例应用程序?我知道Apple发布了一些示例代码,但我不确定如何将它实现到实际项目中.
我正在运行一个用Python实现并使用NumPy的算法.算法中计算成本最高的部分涉及求解一组线性系统(即调用numpy.linalg.solve()
.我想出了这个小基准:
import numpy as np
import time
# Create two large random matrices
a = np.random.randn(5000, 5000)
b = np.random.randn(5000, 5000)
t1 = time.time()
# That's the expensive call:
np.linalg.solve(a, b)
print time.time() - t1
Run Code Online (Sandbox Code Playgroud)
我一直在运行:
sysctl -n machdep.cpu.brand_string
给我Intel(R)Core(TM)i7-4750HQ CPU @ 2.00GHz)c3.xlarge
实例,具有4个vCPU.亚马逊宣称它们为"高频英特尔至强E5-2680 v2(Ivy Bridge)处理器"底线:
我也在其他基于OpenBLAS/Intel MKL的设置上尝试过它,运行时总是与我在EC2实例上得到的(模块化硬件配置)相当.
任何人都可以解释为什么Mac(使用Accelerate Framework)的性能提高了4倍?下面提供了有关NumPy/BLAS设置的更多详细信息.
numpy.show_config()
给我:
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args …
Run Code Online (Sandbox Code Playgroud) 我正在使用EZAudio构建iOS应用程序.它的委托返回一个float**
缓冲区,其中包含指示检测到的卷的浮点值.这个委托被不断调用,它的工作是一个不同的线程.
我想要做的是从EZAudio获取浮点值并将其转换为分贝.
这是我用于获取麦克风数据的简化EZAudio代表:
- (void)microphone:(EZMicrophone *)microphone hasAudioReceived:(float **)buffer withBufferSize:(UInt32)bufferSize withNumberOfChannels:(UInt32)numberOfChannels {
/*
* Returns a float array called buffer that contains the stereo signal data
* buffer[0] is the left audio channel
* buffer[1] is the right audio channel
*/
// Using a separate audio thread to not block the main UI thread
dispatch_async(dispatch_get_main_queue(), ^{
float decibels = [self getDecibelsFromVolume:buffer withBufferSize:bufferSize];
NSLog(@"Decibels: %f", decibels);
});
}
Run Code Online (Sandbox Code Playgroud)
问题是,从以下链接实施解决方案后,我不明白它是如何工作的.如果有人能解释它如何将音量转换为分贝,我将非常感激
该解决方案使用 …
我正在开发iOS应用程序,用户可以在其中应用一组特定的照片过滤器.每个过滤器基本上都是具有特定参数的Photoshop动作集.这些行动是:
我在代码中重复了所有这些操作,使用循环遍历图像中所有像素的算术表达式.但是当我在iPhone 4上运行我的应用程序时,每个过滤器需要大约3-4秒才能应用,这是用户等待的相当多的时间.图像尺寸为640 x 640像素,这是我视图尺寸的2倍,因为它显示在Retina显示屏上.我发现我的主要问题是每次需要调整gamma时调用pow()C函数的级别修改.我当然使用的浮动不是双打,因为ARMv6和ARMv7的双打速度很慢.尝试启用和禁用Thumb并获得相同的结果.
我的应用程序中最简单的过滤器示例,运行速度非常快(2秒).其他过滤器包含更多表达式和pow()调用,从而使它们变慢.
https://gist.github.com/1156760
我见过一些使用Accelerate Framework vDSP矩阵变换进行快速图像修改的解决方案.我也看过OpenGL ES解决方案.我不确定他们能满足我的需求.但可能只是将我的一组变化转换为一些好的卷积矩阵?
任何意见将是有益的.
谢谢,
安德烈.
opengl-es image-processing matrix-multiplication ios accelerate-framework
我正试图从AVAudioPCMBuffer
Swift中生成一个谱图.我安装了一个tap AVAudioMixerNode
并接收带有音频缓冲区的回调.我想将缓冲区中的信号转换为[Float:Float]
字典,其中键表示频率,值表示相应频率上的音频幅度.
我尝试使用Apple的Accelerate框架,但我得到的结果似乎很可疑.我确定这只是我转换信号的方式.
我查看了这篇博客文章以供参考.
这是我有的:
self.audioEngine.mainMixerNode.installTapOnBus(0, bufferSize: 1024, format: nil, block: { buffer, when in
let bufferSize: Int = Int(buffer.frameLength)
// Set up the transform
let log2n = UInt(round(log2(Double(bufferSize))))
let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))
// Create the complex split value to hold the output of the transform
var realp = [Float](count: bufferSize/2, repeatedValue: 0)
var imagp = [Float](count: bufferSize/2, repeatedValue: 0)
var output = DSPSplitComplex(realp: &realp, imagp: &imagp)
// Now I need to …
Run Code Online (Sandbox Code Playgroud) 更新:请参阅下面的其他问题以及更多代码;
我正在尝试编码模糊图像的类别.我的出发点是Jeff LaMarche的样本.虽然这(在其他人提出的修正之后)工作正常,但是对于我的要求来说这是一个数量级太慢 - 在3GS上花费大约3秒来做一个体面的模糊,我想把它降到0.5以下秒为全屏(更快更好).
他提到Accelerate框架作为性能增强,所以我花了最后一天看这个,特别是vDSP_f3x3,根据Apple Documenation
通过使用3x3内核执行二维卷积来过滤图像; 单精度.
完美 - 我有一个合适的滤镜矩阵,我有一个图像...但这是我难倒的地方.
vDSP_f3x3假设图像数据是(float*),但我的图像来自;
srcData = (unsigned char *)CGBitmapContextGetData (context);
Run Code Online (Sandbox Code Playgroud)
并且上下文来自CGBitmapContextCreate和kCGImageAlphaPremultipliedFirst,所以我的srcData实际上是ARGB,每个组件有8位.
我怀疑我真正需要的是带有float组件的上下文,但根据Quartz文档,kCGBitMapFloatComponents仅适用于Mac OS而不是iOS :-(
有没有一种真正快速的方法使用加速框架将我所拥有的整数组件转换为vDSP_f3x3需要的浮点组件?我的意思是我可以自己做,但是当我这样做,然后卷积,然后转换回来,我怀疑我会比现在更慢,因为我可能会像我一样卷入.
也许我的方法不对?
有没有人对我使用vDSP在iPhone上进行一些图像处理有一些提示?我能找到的文档是非常以参考为导向的,并且在涉及到这种事情时并不是非常新手友好.
如果有人有真正快速模糊的参考(和高品质,而不是降低分辨率,然后重新调整我见过的东西,看起来裤子),那将是晶圆厂!
编辑:
谢谢@Jason.我已经完成了它并且它几乎正常工作,但现在我的问题是虽然图像确实模糊,但在每次调用时它都会向左移动1个像素.它似乎也使图像变成黑白,但这可能是另一回事.
这段代码中是否有任何内容显然是错误的?我还没有优化它,它有点粗糙,但希望卷积代码足够清晰.
CGImageRef CreateCGImageByBlurringImage(CGImageRef inImage, NSUInteger pixelRadius, NSUInteger gaussFactor)
{
unsigned char *srcData, *finalData;
CGContextRef context = CreateARGBBitmapContext(inImage);
if (context == NULL)
return NULL;
size_t width = CGBitmapContextGetWidth(context);
size_t height = CGBitmapContextGetHeight(context);
size_t bpr = CGBitmapContextGetBytesPerRow(context);
int componentsPerPixel = 4; // ARGB
CGRect rect = {{0,0},{width,height}};
CGContextDrawImage(context, rect, …
Run Code Online (Sandbox Code Playgroud) 如何解交织float *newAudio
成float *channel1
和float* channel2
和交织它放回newAudio
?
Novocaine *audioManager = [Novocaine audioManager];
__block float *channel1;
__block float *channel2;
[audioManager setInputBlock:^(float *newAudio, UInt32 numSamples, UInt32 numChannels) {
// Audio comes in interleaved, so,
// if numChannels = 2, newAudio[0] is channel 1, newAudio[1] is channel 2, newAudio[2] is channel 1, etc.
// Deinterleave with vDSP_ctoz()/vDSP_ztoz(); and fill channel1 and channel2
// ... processing on channel1 & channel2
// Interleave channel1 and channel2 with vDSP_ctoz()/vDSP_ztoz(); to newAudio …
Run Code Online (Sandbox Code Playgroud) signal-processing objective-c core-audio accelerate-framework
我没有太多的数学背景,但我正在研究的项目的一部分需要单个向量的FFT.matlab函数fft(x)可以准确地满足我的需要,但在尝试设置Accelerate Framework fft函数后,我得到了完全不准确的结果.如果有人对Accelerate Framework fft有更多的专业知识/经验,我可以真正使用一些帮助来试图弄清楚我做错了什么.我根据我在谷歌上发现的一个例子来建立我的fft设置,但是没有教程或任何产生不同结果的东西.
EDIT1:到目前为止基于答案改变了一些东西.它似乎在进行计算,但它不会以任何接近matlab的方式输出它们
这是matlab的fft文档:http://www.mathworks.com/help/techdoc/ref/fft.html
**注意:例如,在两个示例中,x数组将是{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
Matlab代码:
x = fft(x)
Run Code Online (Sandbox Code Playgroud)
Matlab输出:
x =
1.0e+02 *
Columns 1 through 4
1.3600 -0.0800 + 0.4022i -0.0800 + 0.1931i -0.0800 + 0.1197i
Columns 5 through 8
-0.0800 + 0.0800i -0.0800 + 0.0535i -0.0800 + 0.0331i -0.0800 + 0.0159i
Columns 9 through 12
-0.0800 -0.0800 - 0.0159i -0.0800 - 0.0331i -0.0800 - 0.0535i
Columns 13 through 16
-0.0800 - 0.0800i -0.0800 - 0.1197i -0.0800 - 0.1931i -0.0800 - 0.4022i …
Run Code Online (Sandbox Code Playgroud) 任何人都可以推荐一个真正快速的API,理想的NEON优化用于在iPhone上使用CPU在运行时进行YUV到RGB转换吗?令人遗憾的是,加速框架的vImage没有提供任何合适的东西,并且使用vDSP,转换为浮点数和返回看起来不是最理想的,几乎和我自己编写NEON一样多.
我知道如何通过着色器使用GPU,事实上已经这样做了,用于显示我的主视频平面.不幸的是,我还需要在运行时创建并保存显示的子区域的RGBA纹理.这个问题的大部分好答案都涉及着色器,但我不想将GPU用于额外的工作,因为:
(1)虽然我可以使用RenderTextures和我的YUV着色器来转换和缓存区域,但我不想为应用添加任何更多的同步/复杂性.(我已经将纹理从CVTextureCache传递到Unity3D ......在许多情况下,我已经在Unity3D的后面切换状态,并且不想再做任何调试...)
(2)更实际的是我正在编写一个游戏,并且没有任何GPU可供使用(因为游戏通常没有 - 我已经提供了更多关于如何在过去几年中从GPU中获取内容的演示而不是如何放东西......)
(3)在iPad上,我有一个备用核心坐在那里什么都不做.
虽然有很多图书馆可以做YUV到RGBA,但我很乐意节省编写自己的NEON版本的时间.现在我正在使用这样的OpenCV实现:
cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4);
Run Code Online (Sandbox Code Playgroud)
这是正确的,但结束日期缓慢.
如果有人以前看过其他实现(CoreImage?FFMpeg?)并且可以推荐一个我会非常感激.
谢谢,亚历克斯.
嗯......我落后于时代并尝试将一些旧代码移植到新应用程序并且不推荐使用加速器委派.必须有一个替代品.请指出我的文档并让我开始.
ios ×4
iphone ×4
objective-c ×3
audio ×2
fft ×2
amazon-ec2 ×1
blas ×1
core-audio ×1
core-image ×1
core-motion ×1
deprecated ×1
ezaudio ×1
ios5 ×1
matlab ×1
numpy ×1
openblas ×1
opencv ×1
opengl-es ×1
swift ×1
vdsp ×1