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

 
 
 
Reply to this topicStart new topic
> потеря точности в фильтре
PlainUser
сообщение Apr 28 2016, 07:12
Сообщение #1


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

Группа: Участник
Сообщений: 84
Регистрация: 23-06-05
Пользователь №: 6 244



Использую фильтр 2 порядка.
Точнее два-три каскадно включенных таких фильтра
float iir_b2o4hz_1_1(float)
float iir_b2o4hz_1_2(float)
float iir_b2o4hz_1_3(float)


/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com

Filter type: Low Pass
Filter model: Bessel
Filter order: 2
Sampling Frequency: 8 KHz
Cut Frequency: 0.004000 KHz
Coefficents Quantization: float

Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000

Z domain Poles
z = 0.997282 + j -0.001567
z = 0.997282 + j 0.001567
***************************************************************/
float iir_b2o4hz_1_1(float NewSample)
{

static float ACoef[2+1] = { 0.00000475623212008441,
0.00000951246424016882,
0.00000475623212008441};

static float BCoef[2+1] = { 1.00000000000000000000,
-1.99456353223009740000,
0.99457337504708221000};

static float y[2+1]; //output samples
static float x[2+1]; //input samples
uint8_t n;

//shift the old samples
for(n=2; n>0; n--) { x[n] = x[n-1]; y[n] = y[n-1]; }

//Calculate the new output
x[0] = NewSample;
y[0] = ACoef[0] * x[0];
for(n=1; n<=2; n++) y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];

return y[0];
}



В процессе прохождения сигнала через фильтр его уровень становится дискретным с дискретой примерно 1.5%
Те на входе изменяю сигнал плавно а на выходе ступеньки.
Изменив флоаты на даблы все приводится в норму.
Но ОЧЕНЬ хочется обойтись флоатами ибо разница в скорости раз в десять.

Флоаты это "Single precision data type for IEEE 754 arithmetic" 32бит с мантиссой 23разряда.
А 1.5% это всего-лишь 6разрядов.
Куда копать?

ЗЫ.Коэффициенты пробовал менять типа 0.00000475623212008441 на 0.475623212008441.
Не помогло.

Даблы 64бит с мантиссой 52бит

Сообщение отредактировал PlainUser - Apr 28 2016, 07:17
Go to the top of the page
 
+Quote Post
serjj
сообщение Apr 28 2016, 07:50
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866



Цитата
static float ACoef[2+1] = { 0.00000475623212008441,
0.00000951246424016882,
0.00000475623212008441};

static float BCoef[2+1] = { 1.00000000000000000000,
-1.99456353223009740000,
0.99457337504708221000};


isstable(b,a) в матлабе вернул false для ваших коэффициентов. Наверное стоит пересчитать фильтр?
Go to the top of the page
 
+Quote Post
andyp
сообщение Apr 28 2016, 08:00
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(PlainUser @ Apr 28 2016, 10:12) *
В процессе прохождения сигнала через фильтр его уровень становится дискретным с дискретой примерно 1.5%
Те на входе изменяю сигнал плавно а на выходе ступеньки.
Изменив флоаты на даблы все приводится в норму.
Но ОЧЕНЬ хочется обойтись флоатами ибо разница в скорости раз в десять.

Флоаты это "Single precision data type for IEEE 754 arithmetic" 32бит с мантиссой 23разряда.
А 1.5% это всего-лишь 6разрядов.
Куда копать?

ЗЫ.Коэффициенты пробовал менять типа 0.00000475623212008441 на 0.475623212008441.
Не помогло.

Даблы 64бит с мантиссой 52бит


Смотри, твоя реализация фильтра фактически представляет собой каскад (в твоих обозначениях) A(z) * 1/B(z). Коэфф. усиления A в полосе равен -100 dB - здесь ты теряешь точность. Предлагаю перейти к 1/B(z) * A(z) - это т.н. Direct Form II у биквадратной секции. Еще одна опция - снизить частоту дискретизации, чтобы иметь на входе большую относительную полосу сигнала.

Есть старинная методичка от Motorolа (прицепил), которая может оказаться полезной.
Прикрепленные файлы
Прикрепленный файл  apr7.pdf ( 496.49 килобайт ) Кол-во скачиваний: 36
 
Go to the top of the page
 
+Quote Post
PlainUser
сообщение Apr 28 2016, 08:04
Сообщение #4


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

Группа: Участник
Сообщений: 84
Регистрация: 23-06-05
Пользователь №: 6 244



Цитата(serjj @ Apr 28 2016, 10:50) *
isstable(b,a) в матлабе вернул false для ваших коэффициентов. Наверное стоит пересчитать фильтр?


Объявляю их даблами и все проблемы исчезают.
Фильтр работает , все устраивает но считает МЕДЛЕННО.

Матлаб не знает цифрового фильтра бесселя потому-что ....

http://electronix.ru/forum/index.php?s=&am...t&p=1420966


Пробовал подобный фильтр баттерворта , те-же проблемы с потерей точности.
Вот его рассчитывал в матлабе.
Могу выложить его.

Сообщение отредактировал PlainUser - Apr 28 2016, 08:06
Go to the top of the page
 
+Quote Post
andyp
сообщение Apr 28 2016, 08:13
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(PlainUser @ Apr 28 2016, 11:04) *
Объявляю их даблами и все проблемы исчезают.
Фильтр работает , все устраивает но считает МЕДЛЕННО.

Матлаб не знает цифрового фильтра бесселя потому-что ....

http://electronix.ru/forum/index.php?s=&am...t&p=1420966


Пробовал подобный фильтр баттерворта , те-же проблемы с потерей точности.
Вот его рассчитывал в матлабе.
Могу выложить его.


Твой фильтр стабилен. Надо просто isstable( a,b ) набирать в матлабе. Проблема в реализованной тобой (ну или пакетом winfilter) структуре фильтра и требованиях к полосе.

PS Чтобы как-то ускориться, состояние фильтра нужно держать в регистрах и фильтровать блоками, а не по одному отсчету.

Сообщение отредактировал andyp - Apr 28 2016, 08:17
Go to the top of the page
 
+Quote Post
serjj
сообщение Apr 28 2016, 08:37
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866



Цитата
Твой фильтр стабилен. Надо просто isstable( a,b ) набирать в матлабе.

О как. Правда тогда true возвращает, но
Код
isstable(a,b)

ans =

     1

>> isstable(single(a),single(b))

ans =

     0
Go to the top of the page
 
+Quote Post
andyp
сообщение Apr 28 2016, 08:42
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(serjj @ Apr 28 2016, 11:37) *
О как. Правда тогда true возвращает, но
Код
isstable(a,b)

ans =

     1

>> isstable(single(a),single(b))

ans =

     0


Ничего удивительного с такой-то добротностью как у TC. Поэтому и советовал частоту дискретизации снизить, что увеличит относительную полосу, если Direct Form II не спасет.
Go to the top of the page
 
+Quote Post
PlainUser
сообщение Apr 28 2016, 09:46
Сообщение #8


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

Группа: Участник
Сообщений: 84
Регистрация: 23-06-05
Пользователь №: 6 244



Цитата(andyp @ Apr 28 2016, 11:42) *
Ничего удивительного с такой-то добротностью как у TC. Поэтому и советовал частоту дискретизации снизить, что увеличит относительную полосу, если Direct Form II не спасет.


Снизить частоту дискретизации, такая мысль была но это много хлопот потянет за собой.
А как относительная полоса связана с динамическим диапазоном цифирь внутри фильтра?
Типа накопление за период Fs / Fc отсчетов происходит?
И добавляя к накопленному входной сигнал получаем слишком разные числа и из-за этого теряется точность?
Go to the top of the page
 
+Quote Post
andyp
сообщение Apr 28 2016, 11:06
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(PlainUser @ Apr 28 2016, 12:46) *
Снизить частоту дискретизации, такая мысль была но это много хлопот потянет за собой.
А как относительная полоса связана с динамическим диапазоном цифирь внутри фильтра?
Типа накопление за период Fs / Fc отсчетов происходит?
И добавляя к накопленному входной сигнал получаем слишком разные числа и из-за этого теряется точность?


Относительная полоса связана через положение нулей и полюсов передаточной функции фильтра. Твои нули и полюса сейчас просто практически взаимно компенсируют друг друга, отсюда подавление в 100 db в прямой части и усиление в обратной. Расширится полоса - уменьшится добротность, полюса отползут от единичного круга, уменьшится коэфф. передачи.
Go to the top of the page
 
+Quote Post

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

 


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


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