给定浮点数或双精度的一维向量,如何使用加速框架中的vDSP库中的函数计算该向量的自相关?
有人会怀疑vDSP_acor()和vDSP_acorD()函数会执行此计算,但文档vDSP_Library.pdf(此处提供)并不能很好地解释函数参数的使用方式.
类似地,vDSP_conv()和vDSP_convD()函数提到了在两个向量之间执行相关和卷积的能力,但是没有为我提供足够的解释或示例代码以便能够成功地使用它们.例如,如果使用过滤器内核来卷积2D矩阵,我会想象需要两次调用vDSP_convD(),使用不同的signalStride值,但文档中省略了这一点.另一个遗漏是如何打包过滤器中的数据.如果用零填充,如果零首先,最后,或者它们是否需要均匀分布在非零条目的两侧,这是否重要?滤波器长度,结果长度和输入长度是否有要求?
有用示例的建议:使用vDSP_acor()和vDSP_conv()实现向量的自相关.频域中两个数组的二进制乘法,打包为真实数据,使用vDSP_fft2d_zrip()进行前向FFT,将在IFT返回非规范化答案之前用于计算自相关函数.在1D和2D阵列上实现高斯核卷积.一般来说这是一个很棒的库(你能说FAST吗?!),但我发现这些特殊功能有点难以理解,上述例子可能会被广泛使用,因为它们在信号处理和图像分析中非常常见.
对vDSP_Library参考文档的维护者的建议:我假设"空间域"和"时域"在整个文档中是等效的.如果没有,请做出区分.另外,请检查所有公式都有明确定义的参数,这些参数与所讨论函数中声明的参数名称相匹配.
脚注:这里我所指的自相关定义为:A [T] = <(X [t] -m)(X [tT] -m)>/v,其中A [T]是滞后T处的自相关, t是信号X的索引,m是所有t的X的平均值,v是所有t的X的方差,并且尖括号<>表示T的所有可用X对的平均值.
我正在尝试创建一个在麦克风数据上运行FFT的应用程序,因此我可以检查输入中最响亮的频率.
我看到有很多获取音频输入的方法(RemoteIO AudioUnit,AudioQueue服务和AVFoundation),但似乎AVFoundation是最简单的.我有这个设置:
// Configure the audio session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:NULL];
[session setMode:AVAudioSessionModeMeasurement error:NULL];
[session setActive:YES error:NULL];
// Optional - default gives 1024 samples at 44.1kHz
//[session setPreferredIOBufferDuration:samplesPerSlice/session.sampleRate error:NULL];
// Configure the capture session (strongly-referenced instance variable, otherwise the capture stops after one slice)
_captureSession = [[AVCaptureSession alloc] init];
// Configure audio device input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
[_captureSession addInput:input];
// Configure audio data output
AVCaptureAudioDataOutput *output = …Run Code Online (Sandbox Code Playgroud) signal-processing core-audio avfoundation ios accelerate-framework
此代码将图像和灰度蒙版图像组合成一个UIImage.它有效,但很慢.
+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *) mask
{
CGImageRef imageReference = image.CGImage;
CGImageRef maskReference = mask.CGImage;
CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
CGImageGetHeight(maskReference),
CGImageGetBitsPerComponent(maskReference),
CGImageGetBitsPerPixel(maskReference),
CGImageGetBytesPerRow(maskReference),
CGImageGetDataProvider(maskReference),
NULL, // Decode is null
YES // Should interpolate
);
CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
CGImageRelease(imageMask);
UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
CGImageRelease(maskedReference);
return maskedImage;
}
Run Code Online (Sandbox Code Playgroud)
我认为Accelerate Framework可以提供帮助.但我不确定.有vImage,它可以做alpha合成.或者也许我想要的是" vImage变换 ".不像CATransform3D而是"转换"图像.
但我需要的是将照片制作成基于蒙版的透明JPEG.
可以使用Accelerate Framework吗?还是有替代方案吗?
我正在使用dgeevAccelerate框架中LAPACK实现的算法来计算矩阵的特征向量和特征值.遗憾的是,Apple文档中没有描述LAPACK功能,仅包含http://netlib.org/lapack/faq.html的链接.
如果你查一下,你会发现前两个参数dgeev是表示是否计算特征向量的字符.在Swift,它是要求的UnsafeMutablePointer<Int8>.当我只是使用时"N",我收到一个错误.的dgeev功能和错误在下面的截图中描述
我该怎么做才能解决这个问题?
我正在尝试编译和运行使用Accelerate Framework的代码(它包括Accelerate/accelerate.h).我在Linux中这样做.我没有Mac,也没有Xcode.我可以去任何地方下载这个库的源代码,或者进行编译吗?
我已经广泛搜索了这个,但没有找到明确的答案.有些网站建议我需要下载LAPACK和BLAS,但我不知道这是否足够.
我正在移植一个过滤器库,该过滤器库目前使用Apple特定的(加速)vDSP功能vDSP_deq22到Android(其中Accelerate不可用).滤波器组是一组带通滤波器,每个滤波器滤波器返回其各自频带的RMS幅度.目前代码(ObjectiveC++,改编自NVDSP)如下所示:
- (float) filterContiguousData: (float *)data numFrames:(UInt32)numFrames channel:(UInt32)channel {
// Init float to store RMS volume
float rmsVolume = 0.0f;
// Provide buffer for processing
float tInputBuffer[numFrames + 2];
float tOutputBuffer[numFrames + 2];
// Copy the two frames we stored into the start of the inputBuffer, filling the rest with the current buffer data
memcpy(tInputBuffer, gInputKeepBuffer[channel], 2 * sizeof(float));
memcpy(tOutputBuffer, gOutputKeepBuffer[channel], 2 * sizeof(float));
memcpy(&(tInputBuffer[2]), data, numFrames * sizeof(float));
// Do the processing
vDSP_deq22(tInputBuffer, 1, coefficients, tOutputBuffer, 1, numFrames);
vDSP_rmsqv(tOutputBuffer, …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用vecLib框架来使程序在Mac OS X 10.7上进行密集的矩阵向量乘法.我做了一个这样简单的程序; 将矩阵a与向量x相乘,并将结果加到向量y上.
#include <vecLib/vectorOps.h>
#include <stdio.h>
float a[8][4] = // the matrix to be multiplied
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f},
};
float x[4] = {1.0f, 2.0f, 4.0f, 8.0f}; // the vector to be multiplied
float y[8] = {0.f, 0.f, 0.f, 0.f, // the result vector
0.f, 0.f, 0.f, 0.f}; …Run Code Online (Sandbox Code Playgroud) 我的vDSP_zrip和AudioUnit使用和配置有问题.实际上我配置了AudioUnit来将打包数据保存为float.我创建一个循环缓冲区,当这个缓冲区已满时,我计算一个fft.我有结果,但我不明白为什么fft输出不好(参见图)
AudioUnit配置:
// describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsPacked|kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1; // mono
audioFormat.mBitsPerChannel = sizeof(float) * 8;
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(float);
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame;
Run Code Online (Sandbox Code Playgroud)
循环缓冲区:
_audioSample = new AudioSample(8192, 44100);
// in recording callback :
for(int i = 0; i < bufferList.mNumberBuffers; ++i)
{
if(!status)
{
if(_sample->needData())
_sample->put((float*)bufferList.mBuffers[i].mData,
bufferList.mBuffers[i].mDataByteSize);
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
vDSP电话:
// get a split complex vector (real signal divided into an even-odd …Run Code Online (Sandbox Code Playgroud) 我一直在使用OpenCV和Apple的Accelerate框架,发现Accelerate的性能很慢,Apple的文档有限.我们举个例子:
void equalizeHistogram(const cv::Mat &planar8Image, cv::Mat &equalizedImage)
{
cv::Size size = planar8Image.size();
vImage_Buffer planarImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = planar8Image.step,
.data = planar8Image.data
};
vImage_Buffer equalizedImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = equalizedImage.step,
.data = equalizedImage.data
};
TIME_START(VIMAGE_EQUALIZE_HISTOGRAM);
vImage_Error error = vImageEqualization_Planar8(&planarImageBuffer, &equalizedImageBuffer, kvImageNoFlags);
TIME_END(VIMAGE_EQUALIZE_HISTOGRAM);
if (error != kvImageNoError) {
NSLog(@"%s, vImage error %zd", __PRETTY_FUNCTION__, error);
}
}
Run Code Online (Sandbox Code Playgroud)
此调用大约需要20ms.这具有在我的应用程序中无法使用的实际意义.也许直方图的均衡本质上很慢,但我也测试了BGRA->灰度,发现OpenCV可以在~5ms内完成,vImage需要~20ms.
在测试其他功能时,我发现了一个项目,该项目创建了一个带有模糊功能(gist)的简单滑块应用程序,我将其清理干净以进行测试.大约~20ms.
是否有一些技巧可以让这些功能更快?
我正在尝试使用 AcceleratevImageHistogramCalculation_ARGBFFFF函数计算图像的直方图,但我得到了一个vImage_Error类型kvImageNullPointerArgument(错误代码是-21772)。
这是完全相同的问题,但我在 Swift 中工作:使用 vImageHistogramCalculation 计算图像的直方图
// Get CGImage from UIImage
var image:UIImage = UIImage(named: "happiness1")!
var img:CGImageRef = image.CGImage
// Create vImage_Buffer with data from CGImageRef
var inProvider:CGDataProviderRef = CGImageGetDataProvider(img)
var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider)
// The next three lines set up the inBuffer object
var height:vImagePixelCount = CGImageGetHeight(img)
var width:vImagePixelCount = CGImageGetWidth(img)
var rowBytes:UInt = CGImageGetBytesPerRow(img)
var data:UnsafePointer<Void> = UnsafePointer<Void>(CFDataGetBytePtr(inBitmapData))
// Setup inBuffer
var inBuffer = vImage_Buffer(data: &data, height: …Run Code Online (Sandbox Code Playgroud)