DSP-фильтрация для потоковой передачи - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть базовый фильтр с КИХ-фильтром 121 отводов и длиной состояния фильтра 120. Я могу заставить его работать в matlab, но не могу понять, какое состояние фильтра сохранить. Я смотрю на состояние фильтра Matlab снаружи, и оно не соответствует и data_in. Я передаю данные в потоковом режиме, поэтому мне нужно, чтобы каждая итерация была собрана, чтобы эквивалентно фильтрации всего сразу.

for (int i = 0; i <16000; i++){
    for (int j = 0; j <121; j++){
    {
    if (j > i){
    data_out[out] += filter[j] * data_in[j - i];
    }
  }
}

memcpy(&filter_state_save[0], data_in[16000-120], 120*sizeof(data_in));

Разве это не нормально, когда состояние фильтра близко к концу data_in?

1 Ответ

0 голосов
/ 04 мая 2018

Я думаю, что ваш вопрос неопределенный. Зачем вам нужно сохранять входные данные и почему вы просто сохраняете последние 120 сэмплов?

Если я правильно понял, вы пытаетесь сохранить выходные данные фильтра в памяти, чтобы сделать больше DSP на нем, возможно?

  • Ваши первые 120 выборок будут содержать ответ фильтра.
  • Сохранение data_out с выборками (input_samples-filter_order), начиная с индекса input_samples. Так как сигнал задерживается на величину filter_order.

    for (int i = 0; i <16000; i++){
        for (int j = 0; j <121; j++){
        {
        if (i > j){ // changed case
        data_out[out] += filter[j] * data_in[i - j]; // should be i-j
        }
      }
    }
    
    memcpy(filter_state_save[0], data_in, 16000*sizeof(data_in)); 
    // copy 16000 elements back to filter_state_save which is the filtered output                        
    // output.
    
    • Убедитесь, что вы выделите память для filter_state_save в виде 2D-массива, поскольку вы будете копировать 16000 элементов в 0-й индекс. Для следующего фильтра вы, вероятно, захотите скопировать в первый индекс.

Надеюсь, это поможет.

...