与vDSP_conv苹果执行自相关框架加速 [英] Perform autocorrelation with vDSP_conv from Apple Accelerate Framework
问题描述
我需要执行一个数组(向量)的自相关,但我无法找到正确的方式来做到这一点。我相信,我需要从加快框架方法vDSP_conv,但我不能跟着如何成功地设置它。扔我送行最多的东西是2个输入的需要。也许我有错功能,但我无法找到一个单一的矢量操作。
的文档可以找到<一个href=\"http://developer.apple.com/library/mac/#documentation/Accelerate/Reference/vDS$p$pf/Reference/reference.html\"相对=nofollow>这里
从网站复制
vDSP_conv
执行要么两个向量的相关性或卷积;单
precision。
无效vDSP_conv(常量浮动__vDSP_signal [],vDSP_Stride
__vDSP_signalStride,常量浮动__vDSP_filter [],vDSP_Stride __vDSP_strideFilter,浮__vDSP_result [],vDSP_Stride __vDSP_strideResult,vDSP_Length __vDSP_lenResult,vDSP_Length __vDSP_lenFilter);
参数
__ vDSP_signal
输入向量A.该向量的长度必须至少__vDSP_lenResult + __vDSP_lenFilter - 1。
__ vDSP_signalStride
通过__vDSP_signal的步伐。
__ vDSP_filter
输入向量B.
__ vDSP_strideFilter
通过__vDSP_filter的步伐。
__ vDSP_result
输出向量C.
__ vDSP_strideResult
通过__vDSP_result的步伐。
__ vDSP_lenResult
__vDSP_result的长度。
__ vDSP_lenFilter
__vDSP_filter的长度。
块引用>有关的例子,只是假设你有
的数组浮动X = [1.0,2.0,3.0,4.0,5.0]
。我怎么会拿的自相关?输出应该类似于
浮法Y = [5.0,14.0,26.0,40.0,55.0,40.0,26.0,14.0,5.0] //使用Matlab的xcorr(x)函数<生成/东西code>
解决方案执行自相关只是意味着你把一个向量的互相关与自身。没有什么花哨了。
所以你的情况,这样做:
vDSP_conv(X,1,X,1,结果是,1,2 * len_X-1,len_X);
检查样品code更多细节:(它卷积)
<一个href=\"http://disanji.net/iOS_Doc/#documentation/Performance/Conceptual/vDSP_Programming_Guide/Sample$c$c/Sample$c$c.html\" rel=\"nofollow\">http://disanji.net/iOS_Doc/#documentation/Performance/Conceptual/vDSP_Programming_Guide/Sample$c$c/Sample$c$c.html
编辑:这近乎可笑,但你需要一个特定数量的零,这只是疯狂地抵消x值
。以下是工作code,只需设置过滤器的X您希望的数值,它就会把其余的在正确的位置:
浮动*信号,*过滤*结果;int32_t signalStride,filterStride,resultStride;uint32_t的lenSignal,filterLength,resultLength;uint32_t的我;filterLength = 5;resultLength = filterLength * 2 -1;lenSignal =((filterLength + 3)及0xFFFFFFFC)+ resultLength;signalStride = filterStride = resultStride = 1;的printf(\\ nConvolution(resultLength =%d个 filterLength =%d)\\ n \\ n,resultLength,filterLength);/ *分配内存对于输入操作数,并检查其可用性。 * /信号=(浮点*)malloc的(lenSignal *的sizeof(浮动));过滤器=(浮点*)malloc的(filterLength *的sizeof(浮动));结果=(浮点*)malloc的(resultLength *的sizeof(浮动));对于(i = 0; I&LT; filterLength;我++) 过滤由[i] =(浮点)第(i + 1);对于(i = 0; I&LT; resultLength;我++)
如果(ⅰ&GT = resultLength- filterLength)
信号[I] =过滤[我 - filterLength + 1];
/ *相关。 * /vDSP_conv(信号,signalStride,过滤器,filterStride, 结果,resultStride,resultLength,filterLength);
的printf(信号:);
对于(i = 0; I&LT; lenSignal;我++)
的printf(%2.1f,信号[I]);
的printf(\\ n过滤器:);
对于(i = 0; I&LT; filterLength;我++)
的printf(%2.1f,过滤器[I]);的printf(\\ n结果:);
对于(i = 0; I&LT; resultLength;我++)
的printf(%2.1f,结果[I]);
/ *免费分配的内存。 * /免费(信号);免费(过滤器);免费的(结果);I need to perform the autocorrelation of an array (vector) but I am having trouble finding the correct way to do so. I believe that I need the method "vDSP_conv" from the Accelerate Framework, but I can't follow how to successfully set it up. The thing throwing me off the most is the need for 2 inputs. Perhaps I have the wrong function, but I couldn't find one that operated on a single vector.
The documentation can be found here
Copied from the site
vDSP_conv
Performs either correlation or convolution on two vectors; single precision.
void vDSP_conv ( const float __vDSP_signal[], vDSP_Stride __vDSP_signalStride, const float __vDSP_filter[], vDSP_Stride __vDSP_strideFilter, float __vDSP_result[], vDSP_Stride __vDSP_strideResult, vDSP_Length __vDSP_lenResult, vDSP_Length __vDSP_lenFilter );
Parameters
__vDSP_signal
Input vector A. The length of this vector must be at least __vDSP_lenResult + __vDSP_lenFilter - 1.
__vDSP_signalStride
The stride through __vDSP_signal.
__vDSP_filter
Input vector B.
__vDSP_strideFilter
The stride through __vDSP_filter.
__vDSP_result
Output vector C.
__vDSP_strideResult
The stride through __vDSP_result.
__vDSP_lenResult
The length of __vDSP_result.
__vDSP_lenFilter
The length of __vDSP_filter.
For an example, just assume you have an array of
float x = [1.0, 2.0, 3.0, 4.0, 5.0]
. How would I take the autocorrelation of that?The output should be something similar to
float y = [5.0, 14.0, 26.0, 40.0, 55.0, 40.0, 26.0, 14.0, 5.0] //generated using Matlab's xcorr(x) function
解决方案performing autocorrelation simply means you take the cross-correlation of one vector with itself. There is nothing fancy about it.
so in your case, do:
vDSP_conv(x, 1, x, 1, result, 1, 2*len_X-1, len_X);
check a sample code for more details: (which does a convolution)
EDIT: This borders on ridiculous, but you need to offset the x value by a specific number of zeros, which is just crazy.
the following is a working code, just set filter to the value of x you desire, and it will put the rest in the correct position:
float *signal, *filter, *result; int32_t signalStride, filterStride, resultStride; uint32_t lenSignal, filterLength, resultLength; uint32_t i; filterLength = 5; resultLength = filterLength*2 -1; lenSignal = ((filterLength + 3) & 0xFFFFFFFC) + resultLength; signalStride = filterStride = resultStride = 1; printf("\nConvolution ( resultLength = %d, " "filterLength = %d )\n\n", resultLength, filterLength); /* Allocate memory for the input operands and check its availability. */ signal = (float *) malloc(lenSignal * sizeof(float)); filter = (float *) malloc(filterLength * sizeof(float)); result = (float *) malloc(resultLength * sizeof(float)); for (i = 0; i < filterLength; i++) filter[i] = (float)(i+1); for (i = 0; i < resultLength; i++) if (i >=resultLength- filterLength) signal[i] = filter[i - filterLength+1]; /* Correlation. */ vDSP_conv(signal, signalStride, filter, filterStride, result, resultStride, resultLength, filterLength); printf("signal: "); for (i = 0; i < lenSignal; i++) printf("%2.1f ", signal[i]); printf("\n filter: "); for (i = 0; i < filterLength; i++) printf("%2.1f ", filter[i]); printf("\n result: "); for (i = 0; i < resultLength; i++) printf("%2.1f ", result[i]); /* Free allocated memory. */ free(signal); free(filter); free(result);
这篇关于与vDSP_conv苹果执行自相关框架加速的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!