|
|
  |
Проблемы реализации FIR фильтра |
|
|
|
Feb 6 2010, 16:12
|

Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 16-09-09
Из: Россия, МО, г Мытищи
Пользователь №: 52 396

|
Добрый день господа. Приключилась проблема в реализации КИХ фильтра.
сам фильтр вот:
float fir_filter(float input, float *coef, int n, float *history) { int i; float *hist_ptr,*hist1_ptr,*coef_ptr; float output; hist_ptr = history; hist1_ptr = hist_ptr; coef_ptr = coef + n -1; output = *hist_ptr++ * (*coef_ptr--); for(i = 2 ; i < n ; i++) { *hist1_ptr++ = *hist_ptr; output += (*hist_ptr++) * (*coef_ptr--); } output += input * (*coef_ptr); *hist1_ptr = input; return(output); }
вызываю его вот так:
iChannel0LeftOut = fir_filter(iChannel0LeftIn, coeffic, 11, history_mas);
,
коэффициенты получены с помощью Матлаба. Объявлены в Мэин вот так:
float coeffic[11] = { 0.03061053687426, 0.03431978162943, 0.03741127659778, 0.03973537482371, 0.04117773715265, 0.04166666666667, 0.04117773715265, 0.03973537482371, 0.03741127659778, 0.03431978162943, 0.03061053687426 };
float history_mas[10];
Отладочная плата ADDS-BF537-EZLITE
Правый канал пущен на прямую для сравнения на слух (iChannel0RightOut = iChannel0RightIn;), а левй через фильтр. в результате, в правом слушай оригинал, как и должно быть, а в левом просто хрип, с подложкой из входного сигнала. Думал, что перегружаю ЦАП, но сумма коэфициентов меньше 1, значит и перегруза быть не может, на всякий случай пробовал делить выходной семпл на 2..3.. и т.п. что бы понизить уровень сигнала... тише становится, но хрип с подложкой из оригинала остаётся... Думал проблема в том что записываю float в int, пробовал округлять до целых а потом записывать.. но ничего не поменялось... вообще ничего..., Потом думал что проблема в том что АПЦ и ЦАП имеют слово по 24 бита... и соотвественно 24-й бит - это знак... Написал коротенькие втавочки для конвертирования... тоже не помогло... только усилился хрип...
Признаюсь потерял уже в догадках... может подскажете в чем может быть дело? =(
ой забыл написать, логично было бы поглядеть с мопощью VisualDSP, но когда делаю график и выводу в него iChannel0leftIn и iChannel0leftOut то графики выглядят обсалютно одинаково , только снекоторым смещением, причем выход опередает вход! хотя когда смотрю значение в переменных, оно отличается. т.е. такое чувство что алгорим в принципе работает. Мне кажется что проблема в представленнии данных для ЦАП... но не уверен... в общем запутался =(
Сообщение отредактировал Graf_Inventor - Feb 6 2010, 16:16
|
|
|
|
|
Feb 6 2010, 19:05
|

Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 16-09-09
Из: Россия, МО, г Мытищи
Пользователь №: 52 396

|
Цитата(Andron_ @ Feb 6 2010, 20:40)  подайте на вход алгоритму дельта функцию, если получите на выходе ИХ фильтра, значит проблема не в алгоритме... ок. Но мне кажется дело не в алгоритме. Может ещё мнения будут какие нибудь?
|
|
|
|
|
Feb 18 2010, 09:12
|

Эксперт
    
Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183

|
Цитата(sigmaN @ Feb 18 2010, 08:23)  Если проц без аппаратной поддержки плавучки - от неё в любом случае нужно избавляться. Процессор без аппаратной поддержки и от плавучки нужно избавляться решительно. Стандартная плавучка раз в 100 медленней целочисленных вычислений. Проблема же, как уже сказано выше, судя по всему связана с распространением знака. Данные в КИТе 24-разрядные в 24-разрядном дополнительном коде, но старшие 8 разрядов не содержат знак, что предполагается арифметикой 32-разрядных интов Попробуйте iChannel0LeftIn=iChannel0LeftI<<8; iChannel0LeftIn=iChannel0LeftI>>8; потом уже iChannel0LeftOut = iChannel0LeftIn * left ; Кстати, если Вам для дела, а не только учиться - эффективный целочисленный FIR фильтр есть в библиотеках. Для реального дела научиться пользоваться целочисленной подпрограммой полезней, чем свою float писать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|