Проблемы с повышением частоты данных при использовании ускорения

После того, как я уменьшу выборку вектора с постоянным коэффициентом прореживания, я хочу повысить выборку вектора обратно к исходной частоте выборки (после выполнения некоторых анализов). Тем не менее, я борюсь с повышением частоты.

Для понижающей выборки я применяю vDSP_desamp из инфраструктуры Accelerate, а для повышающей выборки я пытался применить vDSP_vlint:

// Create some test data for input vector
float inputData[10] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};

int inputLength = 10;
int decimationFactor = 2; // Downsample by factor 2
int downSampledLength = inputLength/decimationFactor;

// Allocate downsampled output vector
float* downSampledData = malloc(downSampledLength*sizeof(float));

// Create filter (average samples)
float* filter = malloc(decimationFactor*sizeof(float));

for (int i = 0; i < decimationFactor; ++i){
    filter[i] = 1.0/decimationFactor;
}

// Downsample and average
vDSP_desamp(inputData,
            (vDSP_Stride) decimationFactor,
            filter,
            downSampledData,
            (vDSP_Length) downSampledLength,  // Downsample to 5 samples
            (vDSP_Length) decimationFactor );


free(filter);

Выход из downSampledData используя этот код:

0.05, 0.25, 0.45, 0.65, 0.85

Для повышения (обработанного) вектора данных до исходной частоты дискретизации я использую следующий код:

// For this example downSampledData is just copied to processedData ... 
float* processedData =  malloc(downSampledLength*sizeof(float));
processedData = downSampledData; 


//  Create vector used by vDSP_vlint to indicate interpolation constants.
float* b = malloc(downSampledLength*sizeof(float));
for (int i = 0; i < downSampledLength; i++) {
    b[i] = i + 0.5;
}

// Allocate data vector for upsampled data
float* upSampledData = malloc(inputLength*sizeof(float));

// Upsample and interpolate
vDSP_vlint (processedData,
            b,
            1,
            upSampledData,
            1,
            (vDSP_Length) inputLength, // Resample back to 10 samples
            (vDSP_Length) downSampledLength);

Тем не менее, выход upSampledData является

0,15, 0,35, 0,55, 0,75, 0,43, 0,05, 0,05, 0,05, 0,08, 0,12

что не правильно, по-видимому. Как я должен подать заявку vDSP_vlint? Или я должен использовать другие функции для повышения дискретизации данных?

0 ответов

Другие вопросы по тегам