2012-06-06 16 views
7

Tôi cần thực hiện tự tương quan của một mảng (vectơ) nhưng tôi gặp khó khăn khi tìm đúng cách để thực hiện điều đó. Tôi tin rằng tôi cần phương pháp "vDSP_conv" từ khung tăng tốc, nhưng tôi không thể làm theo cách thiết lập thành công nó. Điều ném tôi ra nhiều nhất là sự cần thiết cho 2 đầu vào. Có lẽ tôi có chức năng sai, nhưng tôi không thể tìm thấy một chức năng hoạt động trên một vector đơn lẻ.Thực hiện tự tương quan với vDSP_conv từ Khung tăng tốc của Apple

Các tài liệu có thể được tìm thấy here

sao chép từ trang web

vDSP_conv

Thực hiện một trong hai mối tương quan hoặc chập vào hai vectơ; duy nhất chính xác.

trống vDSP_conv (float const __vDSP_signal [], vDSP_Stride __vDSP_signalStride, float const __vDSP_filter [], vDSP_Stride __vDSP_strideFilter, nổi __vDSP_result [], vDSP_Stride __vDSP_strideResult, vDSP_Length __vDSP_lenResult, vDSP_Length __vDSP_lenFilter);

thông số

__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. 

Ví dụ, giả sử bạn có một mảng float x = [1.0, 2.0, 3.0, 4.0, 5.0]. Làm thế nào tôi có thể tự tương quan?

Đầu ra phải được một cái gì đó tương tự như 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

Trả lời

4

thực hiện tự tương quan đơn giản có nghĩa là bạn lấy tương quan chéo của một véc tơ với chính nó. Không có gì lạ về nó.

như vậy trong trường hợp của bạn, làm:

vDSP_conv(x, 1, x, 1, result, 1, 2*len_X-1, len_X); 

kiểm tra một mẫu mã để biết thêm chi tiết: (mà hiện một chập)

http://disanji.net/iOS_Doc/#documentation/Performance/Conceptual/vDSP_Programming_Guide/SampleCode/SampleCode.html

EDIT: Đây biên giới trên vô lý, nhưng bạn cần phải bù đắp giá trị x bởi một số lượng cụ thể của số không, điều đó thật điên rồ.

sau đây là một mã làm việc, chỉ cần thiết lập bộ lọc để giá trị của x mà bạn mong muốn, và nó sẽ đưa phần còn lại vào đúng vị trí:

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); 
+0

Tôi chỉ cố gắng này với ví dụ của tôi. Nhưng nó xuất ra dữ liệu hơi sai. Tôi đang làm gì sai? x = 1 đến 5 và kết quả là kích thước 9 (5 * 2 -1) vDSP_conv (x, 1, x, 1, kết quả, 1, 9, 5); -> kết quả đầu ra -> 55.0, 40.0, 26.0, 14.0, 5.0, 0.0, 0.0, 0.0, 294.0 – MrHappyAsthma

+0

Tôi nghĩ rằng tôi đã mắc lỗi, bạn có thể cần phải x bằng zeroes ... Tôi không có máy Mac của tôi ở phía trước của tôi, nhưng có vẻ như là đầu vào nên được lâu hơn sau đó đầu ra (đó là lạ để nói rằng ít nhất) – Rasman

+0

Blah: P đó stinks. Tôi cố gắng xáo trộn xung quanh với nó. Nếu bạn đi qua một cách để sửa chữa nó cho chắc chắn sau đó xin vui lòng gửi: D – MrHappyAsthma

Các vấn đề liên quan