реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы реализации FIR фильтра
Graf_Inventor
сообщение Feb 6 2010, 16:12
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Andron_
сообщение Feb 6 2010, 17:40
Сообщение #2


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



подайте на вход алгоритму дельта функцию, если получите на выходе ИХ фильтра, значит проблема не в алгоритме...
Go to the top of the page
 
+Quote Post
Graf_Inventor
сообщение Feb 6 2010, 19:05
Сообщение #3


Частый гость
**

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



Цитата(Andron_ @ Feb 6 2010, 20:40) *
подайте на вход алгоритму дельта функцию, если получите на выходе ИХ фильтра, значит проблема не в алгоритме...

ок. Но мне кажется дело не в алгоритме.
Может ещё мнения будут какие нибудь?
Go to the top of the page
 
+Quote Post
Graf_Inventor
сообщение Feb 6 2010, 21:03
Сообщение #4


Частый гость
**

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



Короче проверил алгоритм фильтра, всё вроде правильно. проблема в умножении...

Если я умножаю отсчет сигнала на целое число. то всё ок. если умнажаю на переменную типа float то в переменную записано целое число, то тоже всё ок. но как только я умножаю отсчет на число скажем 0.9, или любое другое НЕ целое, то возникают эти жуткие шумы....
может я как то не так умножаю??
кот при умножении выглядит так:

iChannel0LeftOut = iChannel0LeftIn * left ;

где float left=0.9
int iChannel0LeftOut, iChannel0LeftIn;

может как то иначе умножать надо?

Сообщение отредактировал Graf_Inventor - Feb 6 2010, 21:14
Go to the top of the page
 
+Quote Post
Andron_
сообщение Feb 7 2010, 04:54
Сообщение #5


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



у вас же есть отладка по шагам, есть watches...

смотрите, чему равен каждый отсчет iChannel0LeftOut, делайте выводы.
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 7 2010, 09:27
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Graf_Inventor
Переведите всё в формат с фиксированной точкой.
У Вас АЦП данные не flot формате выдаёт.
Возможно, проблема в несовместимости форматов.
Go to the top of the page
 
+Quote Post
Graf_Inventor
сообщение Feb 7 2010, 09:41
Сообщение #7


Частый гость
**

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



Так дело в том что, в окне дизасемблера я вижу что задействуются процеду конвертирования из float в integer (32),
да и по результатам вычисления в окне Expressions я вижу что в переменых правильные значения, просто округлённые.

а как мне привести данные в формат с фиксированной запятой?
Go to the top of the page
 
+Quote Post
Andron_
сообщение Feb 7 2010, 09:53
Сообщение #8


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



интеджер это хорошо, но ЦАП 24 бита же у вас... плюс определитесь, отрицательные числа - в дополнительном коде, или нет... обратите внимание, как приводится к 24-м битам, верные ли берутся байты (старшие нужны).
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 7 2010, 10:05
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Graf_Inventor
Просто умножить float coeffic на константу (к примеру, 0xFFFF) с расширением знака.
Представить их в формате int16_t.
Входной сигнал представить также и ограничить до 16 бит знаковым сдвигом.
Результат после умножения масштабировать для получения необходимого уровня.
P.S.
С BlackFin не работал, у CCS от TI есть примеры реализации большинства операций ЦОС.
Для VisualDSP должны быть тоже.
Go to the top of the page
 
+Quote Post
Graf_Inventor
сообщение Feb 7 2010, 16:26
Сообщение #10


Частый гость
**

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



Ясно. примного благодарен Вам господа, за советы и разъяснения.
попробую разобраться. в крайнемслучае, действительно попробую избавться от плавующей точки маштабирование.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Feb 18 2010, 05:23
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Если проц без аппаратной поддержки плавучки - от неё в любом случае нужно избавляться.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
fontp
сообщение Feb 18 2010, 09:12
Сообщение #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 писать
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016