[an error occurred while processing this directive]
|
матлаб, то больше ничего и не надо. Там есть всё от теории по адаптивной фильтрации до моделей симулинка.
Можно еще по ссылке почитать (речевой сигнал взят как пример). Обратите внимание на рис.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