Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: фильтр визуализации
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
PlainUser
Чем отфильтровать среднеквадратичное для индикации измеряемого напряжения в рмс вольтметре.
Измеряем 50гц.
Рубим выборки 8кгц непрерывно.
Убираем постоянную составляющую фильтром фвч.
Перемножаем , получаем квадраты.
Идет последовательность квадратов 8кгц.
Из них нужно непрерывно выделять постоянную составляющую цифровым фильтром.
Каким?
Пробовал бесселя 4п со срезом 5Гц и семплами 8кгц , фигня какая-то выходит.
Возможно частоты далеко друг от друга.

Подсчет суммы квадратов за 1сек дает замечательный результат с точностью даже выше чем надо несмотря на так-сказать прямоугольное окно , но нет непрерывности.
blackfin
Цитата(PlainUser @ Apr 14 2016, 10:11) *
Измеряем 50гц.
Подсчет суммы квадратов за 1сек дает замечательный результат с точностью даже выше чем надо несмотря на так-сказать прямоугольное окно, но нет непрерывности.

Подсчет суммы квадратов за 1сек будет работать, если на интервале 1 сек укладывается целое число периодов "квадратов".
Если частота на входе 50,25 Гц, то частота "квадратов" будет равна 100,5 Гц и на интервале 1 сек поместится 100,5 периодов,
что даст ошибку при подсчете суммы равную сумме значений "квадратов" за пол периода.
Если, конечно, я правильно понял смысл выражения "нет непрерывности".
_Anatoliy
Цитата(PlainUser @ Apr 14 2016, 10:11) *
Подсчет суммы квадратов за 1сек дает замечательный результат с точностью даже выше чем надо несмотря на так-сказать прямоугольное окно , но нет непрерывности.

Сделайте скользящее окно по принципу MAF.
PlainUser
Цитата(_Anatoliy @ Apr 14 2016, 10:31) *
Сделайте скользящее окно по принципу MAF.


Хто такой MAF ?
_Anatoliy
Цитата(PlainUser @ Apr 14 2016, 10:50) *
Хто такой MAF ?

MAF
PlainUser
Цитата(blackfin @ Apr 14 2016, 10:29) *
Подсчет суммы квадратов за 1сек будет работать, если на интервале 1 сек укладывается целое число периодов "квадратов".
Если частота на входе 50,25 Гц, то частота "квадратов" будет равна 100,5 Гц и на интервале 1 сек поместится 100,5 периодов,
что даст ошибку при подсчете суммы равную сумме значений "квадратов" за пол периода.
Если, конечно, я правильно понял смысл выражения "нет непрерывности".


Я знаю.
"...Подсчет суммы квадратов за 1сек дает замечательный результат с точностью даже выше чем надо... "

Цитата(_Anatoliy @ Apr 14 2016, 10:54) *


Вон че , MAF это просто скользящее среднее.
Вроде надо что-то получше с более крутыми скатами.

Частота среза 5-10Гц а частота сигнала на входе 50Гц , остаток в полосе должен быть не более 0.03% примерно.
blackfin
Цитата(PlainUser @ Apr 14 2016, 12:04) *
Вон че , MAF это просто скользящее среднее.
Вроде надо что-то получше с более крутыми скатами.

Сомнительно, что в природе существует КИХ-фильтр "с более крутыми скатами", чем у фильтра на основе "скользящего среднего".
"Скользящее среднее" это же по сути "бин" преобразования Фурье на нулевой частоте и, следовательно, имеет АЧХ пропорциональную sinc-функции (если точнее, АЧХ пропорциональную функции Дирихле).
PlainUser
Цитата(blackfin @ Apr 14 2016, 11:13) *
Сомнительно, что существует в природе КИХ-фильтр "с более крутыми скатами", чем у фильтра на основе "скользящего среднего".
"Скользящее среднее" это же по сути "бин" преобразования Фурье на нулевой частоте и, следовательно, имеет АЧХ пропорциональную sinc-функции (если точнее, АЧХ пропорциональную функции Дирихле).


Не могли-бы вы привести яркий пример для моего случая , особенно что касается расчета количества необходимых точек.
blackfin
Цитата(PlainUser @ Apr 14 2016, 12:24) *
Не могли-бы вы привести яркий пример для моего случая , особенно что касается расчета количества необходимых точек.

Все "яркие примеры для вашего случая" хранятся в MATLAB'e в пакете с именем fdatool. Дерзайте! biggrin.gif
PlainUser
Цитата(blackfin @ Apr 14 2016, 12:31) *
Все "яркие примеры для вашего случая" хранятся в MATLAB'e в пакете с именем fdatool. Дерзайте! biggrin.gif


Звучит неубедительно.

Откуда взялся фильтр бесселя.
Вот отсюда.
http://www.kit-e.ru/articles/circuit/2010_07_144.php


Хотелось-бы услышать какие-то слова в пользу одной из сторон.Лучше с цифрами.
PlainUser
Вот сам фильтр который не желает усреднять.
Может с ним что не так?

Есть подозрение что у коэфф. точности флоата не хватает и он возбуждается.
Но не уверен.

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

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

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

Z domain Poles
z = 0.994770 + j -0.001392
z = 0.994770 + j 0.001392
z = 0.999100 + j -0.004321
z = 0.999100 + j 0.004321
***************************************************************/
#define NCoef 4
float iir(float NewSample) {
float ACoef[NCoef+1] = {
0.00000000008095721658,
0.00000000032382886631,
0.00000000048574329947,
0.00000000032382886631,
0.00000000008095721658
};

float BCoef[NCoef+1] = {
1.00000000000000000000,
-3.98773984171834520000,
5.96328712390839670000,
-3.96335452951837610000,
0.98780724756468707000
};

static float y[NCoef+1]; //output samples
static float x[NCoef+1]; //input samples
int n;

//shift the old samples
for(n=NCoef; 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<=NCoef; n++)
y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];

return y[0];
}
thermit
y[0] = ACoef[0] * x[0];

y[0] = BCoef[0] * x[0];

y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];

y[0] += BCoef[n] * x[n] - ACoef[n] * y[n];
jorikdima
Цитата(blackfin @ Apr 14 2016, 11:13) *
Сомнительно, что в природе существует КИХ-фильтр "с более крутыми скатами", чем у фильтра на основе "скользящего среднего".
"Скользящее среднее" это же по сути "бин" преобразования Фурье на нулевой частоте и, следовательно, имеет АЧХ пропорциональную sinc-функции (если точнее, АЧХ пропорциональную функции Дирихле).

Как это? Нет ничего круче (в счысле скатов) чем синк?Наоборот синк не очень убедительный фильтр (но простой в реализации). КИХ со скатами круче синка слеадть легко (ну в смысле коэффициентов не много понадобится).
Genadi Zawidowski
thermit , Вы думаете WinFilter нагенерил бред?
to PlainUser: поставте static перед массивами коэффициентов.
thermit
Нет. Винфильтер все правильно сгенерил. Это я сгенерил бред.

Щас буду исправляться:

Проблема в том, что данный фильтр нельзя реализовать в лоб во флоатах. При квантовании коэффициентов флоатами фильтр становится неустойчивым. Его нужно отконвертить в биквадратные блоки и только потом квантовать флоатами. Ну и реализовывать как последовательность бкб.

Закончил исправляться.

PlainUser
Цитата(Genadi Zawidowski @ Apr 15 2016, 01:42) *
thermit , Вы думаете WinFilter нагенерил бред?
to PlainUser: поставте static перед массивами коэффициентов.


Гм , действительно быстрее должно работать.
PlainUser
После приведения точности коэфф в порядок фильтр заработал.
Но вопрос о выборе фильтра оптимального для данной задачи остался.
thermit
Цитата(PlainUser @ Apr 15 2016, 13:04) *
После приведения точности коэфф в порядок фильтр заработал.
Но вопрос о выборе фильтра оптимального для данной задачи остался.



Собственно, как и вопрос критерия этой самой оптимальности тоже остался.
Не томите. Раскройте уже требуемую точность и допустимую задержку (время измерения).
А там поглядим, что да как...
PlainUser
Цитата(thermit @ Apr 15 2016, 13:52) *
Собственно, как и вопрос критерия этой самой оптимальности тоже остался.
Не томите. Раскройте уже требуемую точность и допустимую задержку (время измерения).
А там поглядим, что да как...


А , так float поменял на double.
Мантисса у них 22бита проти 51бита.

Точность нужна 0.02% задержка , ну примерно 0.5сек.
thermit
Цитата(PlainUser @ Apr 15 2016, 14:52) *
А , так float поменял на double.
Мантисса у них 22бита проти 51бита.

Точность нужна 0.02% задержка , ну примерно 0.5сек.



последовательное соединение 3-х звеньев y(n)=y(n-1) + ( x(n) - y(n-1) )*1/256
PlainUser
Цитата(thermit @ Apr 15 2016, 15:13) *
последовательное соединение 3-х звеньев y(n)=y(n-1) + ( x(n) - y(n-1) )*1/256


В данном случае не подходит.
Для требуемой точности задержка будет гигантская.
thermit
Какая гигантская? На 8000гц меньше чем 0.5 сек.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.