[an error occurred while processing this directive]
Если помеха коррелирована с сигналом (а судя по всему да), то вроде адаптивный фильтр нужен. Если есть
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено sdy 30 июля 2002 г. 03:49
В ответ на: Уважаемый All, а где прочитать и взять примеры алгоритмов режекторных фильтров? Желательно попроще и поближе к жизни. отправлено VVT 29 июля 2002 г. 10:16

матлаб, то больше ничего и не надо. Там есть всё от теории по адаптивной фильтрации до моделей симулинка.
Можно еще по ссылке почитать (речевой сигнал взят как пример). Обратите внимание на рис.3.
А вот я бился четыре года назад на с. После чего взялся за голову и сел на ассемблер. Так что могу предложить кусок софта как есть. Вроде должен работать (точно адаптивный фильтр, а вот какая задача решалась вспомнить трудно, расшифровать тем паче). Проще, наверное, если надо новый софт написать. Зато алгоритм с нормализацией энергии в линии задержки фильтра с КИХ использовать вроде можно.
Некоторые пояснения:
Библиотека для адсп-2106х;
fir - функция фильтра с КИХ;
rand - генератор случайных чисел. Это я для примера использовал для выделения сигнала из смеси сигнала и белого шума.
tx_buf[1] и tx_buf[2] - адреса выходов системы. Результат фильтрации посмотреть можно на джеках было.

void spr0_asserted( int sig_num )
{
int i;
float filter_input;
float filter_output;
float filter_desire;
float filter_error;
float factor;
float normalized_stepsize; /* xxxxf - chap5.pdf */
float alpha = 0.1f;
float gamma = 0.1f;
float pm *coeffs_ptr;
float sample;

/* filter_input = rand() & 0x00003fff; */

filter_input = rx_buf[2];

// Using the assembler algorithm for estimate FIR output.

filter_output = fir( filter_input, &coeffs_now[0], &deline_data[0], (int)TAPS );

// Circular buffer.

BASE(deline_ptr) = &deline_data[1];
LENGTH(deline_ptr) = TAPS;

if (deline_start == TAPS)
deline_start = 0;

/* CIRC_MODIFY(deline_ptr,deline_start); */
deline_ptr += deline_start++;

// Normalized LMS algorithm.

if (training_mode)
/* filter_desire = rand() & 0x00003fff; */
filter_desire = rx_buf[1];
else
filter_desire = filter_output;

energy += filter_input * filter_input - deline_end; /* E(n) = E(n-1) + U(n)^2 - U(n-N)^2 */

if (energy == 0)
normalized_stepsize = alpha / gamma;
else
normalized_stepsize = alpha / energy;

/* normalized_stepsize = alpha / (gamma + energy); */

filter_error = filter_desire - filter_output;
factor = filter_error * normalized_stepsize;

// Wi(n+1) = Wi(n) + e(n) * normalized_stepsize * u(n-i)

coeffs_ptr = coeffs_now + TAPS - 1; /* this is the place of the W0(n) & W0(n+1) */

for(i = 1; i < TAPS; i++)
{
CIRC_READ(deline_ptr,-1,sample,dm);
*coeffs_ptr = factor * sample + (*coeffs_ptr--); /* update vector Wi(n+1), beginning with W0(n+1) */
}
*coeffs_ptr += factor * (*deline_ptr); /* update last coefficient */

deline_end = (*deline_ptr) * (*deline_ptr); /* estimate the U(n-N+1)^2 for normalized */

tx_buf[1] = filter_error; /* number 1 of the connector*/
tx_buf[2] = filter_output; /* number 4 of the connector */
}
Если чего не понятно, то спрашивай, а то приводить старинный пример, да ещё и к другому процессору трудновато.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru