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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Библиотека (dll) расчета фильтров, Посоветуйте pls
thermit
сообщение Feb 17 2015, 16:03
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(ymv @ Feb 16 2015, 19:42) *
Возвращаясь к либе. Не совсем понял эту фразу.
Не пояснишь ли тупому, можно ли из этих коэффициентов биквадратных звеньев перейти к обычным коэффициентам, что выдаёт например Matlab/FDATool, WinFilter.
Перемножить эти коэффициенты на gain? У меня, кстати, gain получился в этом примере 0.103367640320208, не обратил сразу внимания.
Перемножил, получилось что-то похожее, но не совсем то.


Вообще-то рекурсивные фильтры реализуют именно последовательным или параллельным включнием звеньев 2-го порядка.
Ну а если в лоб:
Код
sos=[a(0:2) b(0:2); a(3:5) b(3:5)];
[b,a]=sos2tf(sos,gain);


Все получается как нужно.

Сообщение отредактировал thermit - Feb 17 2015, 16:04
Go to the top of the page
 
+Quote Post
ymv
сообщение Feb 17 2015, 18:20
Сообщение #17





Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434



Цитата(thermit @ Feb 17 2015, 21:03) *
Вообще-то рекурсивные фильтры реализуют именно последовательным или параллельным включнием звеньев 2-го порядка.
Ну а если в лоб:
Код
sos=[a(0:2) b(0:2); a(3:5) b(3:5)];
[b,a]=sos2tf(sos,gain);


Все получается как нужно.


Проcти, не понял, как ты строишь матрицу sos.
В моём примере порядок = 3. векторы a и b индексируются от 0 до 3-х.
a = [1 1 0 1]
b = [1 -0.145210396025875 0 1]
gain=0.103367640320208

Откуда взялись индексы a(3:5)? На первую строку кода Матлаб ругается "Subscript indices must either be real positive integers or logicals.".
Go to the top of the page
 
+Quote Post
thermit
сообщение Feb 18 2015, 10:08
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(ymv @ Feb 17 2015, 21:20) *
Проcти, не понял, как ты строишь матрицу sos.
В моём примере порядок = 3. векторы a и b индексируются от 0 до 3-х.
a = [1 1 0 1]
b = [1 -0.145210396025875 0 1]
gain=0.103367640320208

Откуда взялись индексы a(3:5)? На первую строку кода Матлаб ругается "Subscript indices must either be real positive integers or logicals.".


1. бих-фильтры на практике реализуются соединением звеньев 2-го порядка
2. фильтр 3-го порядка содержит 2 звена: 2-го и 1-го, который обычно реализуется как второго с нулевыми к-тами при 2-й степени. итого - 2 биквадратных звена.
3. биквадратное звено имеет 3 к-та числителя и 3 к-та знаменателя (к-т 1 при квадрате тоже обычно присутствует для наглядности) итого 2 по 3 к-та числителей и 2 по 3 к-та знаменателей.
4. матлаб индексирует массивы начиная с 1. я привел в скрипте си-индексацию, которая естественно даст ошибку.
Go to the top of the page
 
+Quote Post
ymv
сообщение Feb 20 2015, 18:38
Сообщение #19





Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434



Вот мой скрипт Матлаба к данному примеру:
clear;
acoeff=[1 1 0 1 0 0]; %старшие коэффициенты заполняем нулями
bcoeff=[1 -0.145210396025875 0 1 0 0];
gain=0.103367640320208;
sos=[acoeff(1:3) bcoeff(1:3); acoeff(4:6) bcoeff(4:6)]
[b,a]=sos2tf(sos,gain)

Результаты:
sos =
1.0000 1.0000 0 1.0000 -0.1452 0
1.0000 0 0 1.0000 0 0

b =
0.1034 0.1034 0 0

a =
1.0000 -0.1452 0 0

АЧХ не та. Получилось наоборот - подъем по частоте.

Кстати, код фильтра использую тот, что даёт WinFilter:

float iir(float NewSample) {
float ACoef[NCoef+1] = { 1.0000, -0.1452, 0, 0 };

float BCoef[NCoef+1] = { 0.1034, 0.1034, 0, 0 };

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];
}


Это код именно для передаточной функции или я что-то напутал? sm.gif
Go to the top of the page
 
+Quote Post
thermit
сообщение Feb 22 2015, 10:31
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(ymv @ Feb 20 2015, 21:38) *
Вот мой скрипт Матлаба к данному примеру:
clear;
acoeff=[1 1 0 1 0 0]; %старшие коэффициенты заполняем нулями
bcoeff=[1 -0.145210396025875 0 1 0 0];
gain=0.103367640320208;
sos=[acoeff(1:3) bcoeff(1:3); acoeff(4:6) bcoeff(4:6)]
[b,a]=sos2tf(sos,gain)

Результаты:
sos =
1.0000 1.0000 0 1.0000 -0.1452 0
1.0000 0 0 1.0000 0 0

b =
0.1034 0.1034 0 0

a =
1.0000 -0.1452 0 0

АЧХ не та. Получилось наоборот - подъем по частоте.

Кстати, код фильтра использую тот, что даёт WinFilter:

float iir(float NewSample) {
float ACoef[NCoef+1] = { 1.0000, -0.1452, 0, 0 };

float BCoef[NCoef+1] = { 0.1034, 0.1034, 0, 0 };

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];
}


Это код именно для передаточной функции или я что-то напутал? sm.gif




к-ты не надо изобретать. их либа честно посчитает. нужно тупо скопировать в матлаб.

bcoeff=[ 1 -0.14487845197425167 0 1 -0.38365823972570179 0.35186127061953859];
acoeff=[1 1 0 1 2 1];


код есть разностное уравнение для всего фильтра. никакого каскадирования тут нет.

Go to the top of the page
 
+Quote Post
ymv
сообщение Mar 20 2015, 05:42
Сообщение #21





Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434



Цитата(thermit @ Feb 22 2015, 15:31) *
к-ты не надо изобретать. их либа честно посчитает. нужно тупо скопировать в матлаб.

bcoeff=[ 1 -0.14487845197425167 0 1 -0.38365823972570179 0.35186127061953859];
acoeff=[1 1 0 1 2 1];


код есть разностное уравнение для всего фильтра. никакого каскадирования тут нет.


Скопировал эти коэффициенты в Matlab\FDATool через "Import filter".
Matlab сказал, что фильтр нестабильный, и АЧХ совсем не та. Почему например один из acoeff в этом примере 2? Явно лажовые коэффициенты.
Go to the top of the page
 
+Quote Post
thermit
сообщение Mar 20 2015, 09:22
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(ymv @ Mar 20 2015, 08:42) *
Скопировал эти коэффициенты в Matlab\FDATool через "Import filter".
Matlab сказал, что фильтр нестабильный, и АЧХ совсем не та. Почему например один из acoeff в этом примере 2? Явно лажовые коэффициенты.


Код
bcoeff=[ 1 -0.14487845197425167 0 1 -0.38365823972570179 0.35186127061953859];
acoeff=[1 1 0 1 2 1];
sos=[acoeff(1:3) bcoeff(1:3); acoeff(4:6) bcoeff(4:6)];
gain=0.103367640320208;
[b,a]=sos2tf(sos,gain);

plot(20*log10(abs(freqz(b,a,1000))));
abs(roots(a))

Go to the top of the page
 
+Quote Post
ymv
сообщение Mar 20 2015, 13:46
Сообщение #23





Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434



Цитата(thermit @ Mar 20 2015, 14:22) *
Код
bcoeff=[ 1 -0.14487845197425167 0 1 -0.38365823972570179 0.35186127061953859];
acoeff=[1 1 0 1 2 1];
sos=[acoeff(1:3) bcoeff(1:3); acoeff(4:6) bcoeff(4:6)];
gain=0.103367640320208;
[b,a]=sos2tf(sos,gain);

plot(20*log10(abs(freqz(b,a,1000))));
abs(roots(a))

Да, это работает.
Хорошо, а как эти коэффициенты перевести в формат Numerator/Denominator, что используется в FDATool?
У меня он не воспринимает ни acoeff/bcoeff, ни a/b.

Go to the top of the page
 
+Quote Post
thermit
сообщение Mar 20 2015, 14:50
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(ymv @ Mar 20 2015, 16:46) *
Да, это работает.
Хорошо, а как эти коэффициенты перевести в формат Numerator/Denominator, что используется в FDATool?
У меня он не воспринимает ни acoeff/bcoeff, ни a/b.

1 b->numerator
2 a->denominator
3 44100 -> Fs
4 import filter
5 PROFIT...

Go to the top of the page
 
+Quote Post
ymv
сообщение Mar 25 2015, 15:50
Сообщение #25





Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434



Цитата(thermit @ Mar 20 2015, 19:50) *
1 b->numerator
2 a->denominator
3 44100 -> Fs
4 import filter
5 PROFIT...


Прошло...
Осталось софтверно реализовать sos2tf()
Go to the top of the page
 
+Quote Post
thermit
сообщение Mar 25 2015, 20:42
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



ну, если делать больше нечего...
Go to the top of the page
 
+Quote Post

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

 


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


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