Преобразования ФНЧ-ПФ
- DimKaKiber
- Сообщения: 29
- Зарегистрирован: 26 мар 2020, 15:00
- Откуда: Томск
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Опять замучали фильтры...Не могу корректно построить АЧХ и т.д.
Для построения АЧХ фильтра делаю БПФ числителя и знаменателя, а потом делю результаты поэлементно друг на друга. Пробовал и в комплексном представлении и делить модули друг на дружку - получаю результаты, отличные от тех, которые приводятся в статьях. Не удержался - пошел подглядывать в Ваш код - увидел что Вы считаете все через нули и полюса фильтров, которые и используете для расчета передаточной характеристики.
Как все-таки верно проводить расчеты? Как сделал я по Вашим статьям (сразу формируя передаточную характеристику) или как Вы с использованием нулей и полюсов фильтров?
Для построения АЧХ фильтра делаю БПФ числителя и знаменателя, а потом делю результаты поэлементно друг на друга. Пробовал и в комплексном представлении и делить модули друг на дружку - получаю результаты, отличные от тех, которые приводятся в статьях. Не удержался - пошел подглядывать в Ваш код - увидел что Вы считаете все через нули и полюса фильтров, которые и используете для расчета передаточной характеристики.
Как все-таки верно проводить расчеты? Как сделал я по Вашим статьям (сразу формируя передаточную характеристику) или как Вы с использованием нулей и полюсов фильтров?
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Никакие БПФ числителя и знаменателя не надо делить.
Если есть передаточная характеристика
,
то комплексный коэффициент передачи получаем подстановкой вместо . Далее берем модуль комплексного коэффициента передачи и это будет АЧХ, из фазы комплексного коэффициента передачи получаем ФЧХ.
Нули и полюса используются только для расчета коэффициентов передаточной характеристики.
Если же фильтр цифровой с передаточной характеристикой , то подставлять надо вместо переменной z
и все тоже самой модуль - АЧХ
Если есть передаточная характеристика
,
то комплексный коэффициент передачи получаем подстановкой вместо . Далее берем модуль комплексного коэффициента передачи и это будет АЧХ, из фазы комплексного коэффициента передачи получаем ФЧХ.
Нули и полюса используются только для расчета коэффициентов передаточной характеристики.
Если же фильтр цифровой с передаточной характеристикой , то подставлять надо вместо переменной z
и все тоже самой модуль - АЧХ
- DimKaKiber
- Сообщения: 29
- Зарегистрирован: 26 мар 2020, 15:00
- Откуда: Томск
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Спасибо)
Т.е. в действительную часть комплексного числа подставляю значения частоты (jw) в диапазоне, например, от 0 до Pi и в числителе со знаменателем получаю по комплексному числу для каждого значения частоты в соответствующих степенях. Все это суммирую. Потом делю комплексный числитель и знаменатель, получая тоже комплексное число для каждого w. А потом беру модуль, вычисляю фазу из этих значения и строю график?
Извините что туплю, но почему то именно БИХ фильтры - какой то заколдованный раздел, к которому в разное время возвращаюсь и все время спотыкаюсь.
Т.е. в действительную часть комплексного числа подставляю значения частоты (jw) в диапазоне, например, от 0 до Pi и в числителе со знаменателем получаю по комплексному числу для каждого значения частоты в соответствующих степенях. Все это суммирую. Потом делю комплексный числитель и знаменатель, получая тоже комплексное число для каждого w. А потом беру модуль, вычисляю фазу из этих значения и строю график?
Извините что туплю, но почему то именно БИХ фильтры - какой то заколдованный раздел, к которому в разное время возвращаюсь и все время спотыкаюсь.
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
если цифровой бих то подставлять вместо z надо . в остальном все правильно.
- DimKaKiber
- Сообщения: 29
- Зарегистрирован: 26 мар 2020, 15:00
- Откуда: Томск
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Спасибо большое. Сделал так, но все-равно не получаю нормального графика.
Беру пример отсюда - http://www.dsplib.ru/content/filters/ch8/ch8.html для реализации ФНЧ-ПФ .
Получаю коэффициенты (такие же как в статье) для аналогового нормированного ФНЧ:
Analog num = [0.000000; 14860925.837130; 0.000000; 2030265.903438; 0.000000; 71839.277304; 0.000000; 360.936161; 0.000000; 0.469679; 0.000000].
Analog den = [2373046875.000000; 292151828.624745; 236126307.936652; 21932870.848900; 7926740.156787; 503983.088192; 105689.868757; 3899.177040; 559.706804; 9.233441; 1.000000].
Затем строю АЧХ аналогового ПФ в диапазоне от 0 до P (Y - Дб, Х - рад/с)i:
После этого провожу Z-преобразование () и получаю АЧХ:
Коэффициенты цифрового фильтра при этом:
Digital num = [0.005786; -0.014392; 0.008998; 0.008998; -0.014392; 0.005786; 0.000000; 0.000000; 0.000000; 0.000000; 0.000000].
Digital den = [1.000000; -4.410285; 8.124856; -7.752731; 3.829048; -0.785387; 0.000036; 0.000001; 0.000000; 0.000000; 0.000000].
При этом проверяю как будет выглядеть АЧХ для ФНЧ Баттерворта также по примеру их статьи:
Уверен что ошибка в коде моем. Генетическом даже скорее, но вдруг Вы сталкивались с той же ошибкой? Вычисления делаю ровно так как писалось постами выше.
Беру пример отсюда - http://www.dsplib.ru/content/filters/ch8/ch8.html для реализации ФНЧ-ПФ .
Получаю коэффициенты (такие же как в статье) для аналогового нормированного ФНЧ:
Analog num = [0.000000; 14860925.837130; 0.000000; 2030265.903438; 0.000000; 71839.277304; 0.000000; 360.936161; 0.000000; 0.469679; 0.000000].
Analog den = [2373046875.000000; 292151828.624745; 236126307.936652; 21932870.848900; 7926740.156787; 503983.088192; 105689.868757; 3899.177040; 559.706804; 9.233441; 1.000000].
Затем строю АЧХ аналогового ПФ в диапазоне от 0 до P (Y - Дб, Х - рад/с)i:
После этого провожу Z-преобразование () и получаю АЧХ:
Коэффициенты цифрового фильтра при этом:
Digital num = [0.005786; -0.014392; 0.008998; 0.008998; -0.014392; 0.005786; 0.000000; 0.000000; 0.000000; 0.000000; 0.000000].
Digital den = [1.000000; -4.410285; 8.124856; -7.752731; 3.829048; -0.785387; 0.000036; 0.000001; 0.000000; 0.000000; 0.000000].
При этом проверяю как будет выглядеть АЧХ для ФНЧ Баттерворта также по примеру их статьи:
Уверен что ошибка в коде моем. Генетическом даже скорее, но вдруг Вы сталкивались с той же ошибкой? Вычисления делаю ровно так как писалось постами выше.
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Если Баттервотра правильно а эллиптический нет, то надо проверять как билинейное преобразование работает с числителем H(s). У Баттервотра там константа, а у эллиптического в числителе H(s) полином, который тоже участвует в билинейном преобразовании.
- DimKaKiber
- Сообщения: 29
- Зарегистрирован: 26 мар 2020, 15:00
- Откуда: Томск
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Спасибо). Пока искал - полностью все почти переписал. Но результат тот же.
Подглядел у Вас и перенес расчет передаточной характеристики и механизм сверток+дробно-рациональной подстановки, чтобы проверить результаты расчетов своих написанных функций. Считают одинаково, только у Вас матрицы в вектора, что очень хорошо, преобразованны, а у меня в лоб було сделанно ((
По итогу - для полосового фильтра получаю верные коэффициенты аналогового фильтра (со статьей сверяю), но аналоговая АЧХ выглядит как ФВЧ (ФНЧ и ФВЧ как доктор прям пописал - что цифровые, что аналоговые АЧХ). Подключаю отрисовку своего производства - картинка становится АЧХ полосового фильтра (Баттерворта,Чебышевых, Кауэра). Поэтому предполагаю что дробно-рациональная подстановка верно отрабатыват, т.к. при подстановке ФНЧ-ПФ получаются статейные коэффициенты (Кауэр) и аналоговая АЧХ выглядит как ПФ.
Цифровой фильтр опять же на себя не похож ((
Подглядел у Вас и перенес расчет передаточной характеристики и механизм сверток+дробно-рациональной подстановки, чтобы проверить результаты расчетов своих написанных функций. Считают одинаково, только у Вас матрицы в вектора, что очень хорошо, преобразованны, а у меня в лоб було сделанно ((
По итогу - для полосового фильтра получаю верные коэффициенты аналогового фильтра (со статьей сверяю), но аналоговая АЧХ выглядит как ФВЧ (ФНЧ и ФВЧ как доктор прям пописал - что цифровые, что аналоговые АЧХ). Подключаю отрисовку своего производства - картинка становится АЧХ полосового фильтра (Баттерворта,Чебышевых, Кауэра). Поэтому предполагаю что дробно-рациональная подстановка верно отрабатыват, т.к. при подстановке ФНЧ-ПФ получаются статейные коэффициенты (Кауэр) и аналоговая АЧХ выглядит как ПФ.
Цифровой фильтр опять же на себя не похож ((
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Давайте так. Я могу проверить своей библиотекой если вы пришлёте коэффициенты аналогового фильтра и картинку ачх. Я сделаю билинейное преобразование и покажу коэффициенты цифрового фильтра и ачх. Сможете сравнить со своими.
- DimKaKiber
- Сообщения: 29
- Зарегистрирован: 26 мар 2020, 15:00
- Откуда: Томск
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
Давайте конечно. Уже нашел одну ошибку внутри кода генетического - не до конца просчитывались коэффициенты цифрового фильтра. Но картина не поменялась.
Я привязался к параметрам примера из статьи (http://www.dsplib.ru/content/filters/ch8/ch8.html). Т.е. ПФ Кауэра для:
fs = 44100 Гц
wpl = 19279 Гц
wsl = 18611 Гц
wph = 21115 Гц
wsh = 21270 Гц
rp = 1 дБ
rs = 40 дБ
Аналоговые коэффициенты до ФНЧ-ПФ преобразования получаю такие:
Analog Num = [0.229827; 0.000000; 0.220033; 0.000000; 0.046968; 0.000000].
Analog Den = [0.229827; 0.788084; 1.129145; 1.847068; 0.923344; 1.000000].
АЧХ аналогового прототипа до ФНЧ-ПФ: После проведения ФНЧ-ПФ преобразования коэффициенты аналогового прототипа становятся такими (извините, что без округления):
Analog Num = [0.000000; 14811342.626230; 0.000000; 2023340.076052; 0.000000; 71598.588280; 0.000000; 360.148756; 0.000000; 0.469268; 0.000000].
Analog Den = [2365742167.178879; 291177069.320213; 235456493.051836; 21865990.781777; 7907224.974367; 502677.680863; 105494.693148; 3892.083925; 559.152440; 9.225358; 1.000000].
Они, в принципе, с какой то долей погрешности (я не стал подставлять точные нецелые значения частот в Герцах для расчета) схожи с коэффициентами из примера (порядок значений, наличие коэффициентов при s в определенных степенях). Но график АЧХ превращается в тыкву (простите, но залез в Ваш код и перенес функции для отрисовки графиков, чтобы удостовериться - есть ли у меня ошибки в коде. Но мог и здесь напортачить ):
Но если сделать так как Вы раньше мне подсказывали, то получается такая АЧХ:
После проведения билинейного преобразования получаю такие коэффициенты:
Digital Num = [0.005785; 0.014389; 0.139594; 0.325319; 1.309246; 1.432286; 5.205183; 3.676684; 14.317641; -1.689566; 20.956378].
Digital Den = [1.000000; 4.410241; 17.250501; 35.127052; 86.192067; 120.790716; 244.511147; 196.726004; 391.084895; 163.938092; 312.477184].
АЧХ далека от идеала как ее ни рисуй:
По-любому ошибка именно в преобразованиях, но вроде бы все реализовано верно. Для ФНЧ и ФВЧ все работает (Баттервот, Чебышевы, Кауэр) и даже применяется к данным (правда со смещением по сигналам). И это тоже кажется странным, т.к. если бы ошибка была в расчете коэффициентов числителя, то неверно бы обсчитывались коэффициенты числителя для фильтров ЧебышеваII рода и Золотарева.
Я привязался к параметрам примера из статьи (http://www.dsplib.ru/content/filters/ch8/ch8.html). Т.е. ПФ Кауэра для:
fs = 44100 Гц
wpl = 19279 Гц
wsl = 18611 Гц
wph = 21115 Гц
wsh = 21270 Гц
rp = 1 дБ
rs = 40 дБ
Аналоговые коэффициенты до ФНЧ-ПФ преобразования получаю такие:
Analog Num = [0.229827; 0.000000; 0.220033; 0.000000; 0.046968; 0.000000].
Analog Den = [0.229827; 0.788084; 1.129145; 1.847068; 0.923344; 1.000000].
АЧХ аналогового прототипа до ФНЧ-ПФ: После проведения ФНЧ-ПФ преобразования коэффициенты аналогового прототипа становятся такими (извините, что без округления):
Analog Num = [0.000000; 14811342.626230; 0.000000; 2023340.076052; 0.000000; 71598.588280; 0.000000; 360.148756; 0.000000; 0.469268; 0.000000].
Analog Den = [2365742167.178879; 291177069.320213; 235456493.051836; 21865990.781777; 7907224.974367; 502677.680863; 105494.693148; 3892.083925; 559.152440; 9.225358; 1.000000].
Они, в принципе, с какой то долей погрешности (я не стал подставлять точные нецелые значения частот в Герцах для расчета) схожи с коэффициентами из примера (порядок значений, наличие коэффициентов при s в определенных степенях). Но график АЧХ превращается в тыкву (простите, но залез в Ваш код и перенес функции для отрисовки графиков, чтобы удостовериться - есть ли у меня ошибки в коде. Но мог и здесь напортачить ):
Но если сделать так как Вы раньше мне подсказывали, то получается такая АЧХ:
После проведения билинейного преобразования получаю такие коэффициенты:
Digital Num = [0.005785; 0.014389; 0.139594; 0.325319; 1.309246; 1.432286; 5.205183; 3.676684; 14.317641; -1.689566; 20.956378].
Digital Den = [1.000000; 4.410241; 17.250501; 35.127052; 86.192067; 120.790716; 244.511147; 196.726004; 391.084895; 163.938092; 312.477184].
АЧХ далека от идеала как ее ни рисуй:
По-любому ошибка именно в преобразованиях, но вроде бы все реализовано верно. Для ФНЧ и ФВЧ все работает (Баттервот, Чебышевы, Кауэр) и даже применяется к данным (правда со смещением по сигналам). И это тоже кажется странным, т.к. если бы ошибка была в расчете коэффициентов числителя, то неверно бы обсчитывались коэффициенты числителя для фильтров ЧебышеваII рода и Золотарева.
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Преобразования ФНЧ-ПФ
использовал приведенный данные для расчета. Расчет делал своей библиотекой. Код программы:
В результате выполнения рассчитывает билинейное преобразование, выводятся к-ты цифрового полосового фильтра:
и строится графики АЧХ:
Все вроде нормально. Если надо можете отладить свой код по моей программе. Отладку моей программы можно сделать в среде CodeBlocks. Как настроить компилятор для сборки DSPL-2.0
PS. ФНЧ график совпадает. Для полосового фильтра графики ваш и мой различаются. В частности шкала частот разная на графиках, хотя качественно фильтры похожи.
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
/* Порядок фильтра ФНЧ */
#define ORDLP 5
/* Порядок фильтра полосового */
#define ORDBP 10
/* размер векторов частотной характеристики фильтра */
#define N 1000
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
/* Коэффициенты числителя ФНЧ H(s) */
double blp[ORDLP+1] = {0.229827, 0.000000, 0.220033,
0.000000, 0.046968, 0.000000};
/* Коэффициенты знаменателя ФНЧ H(s) */
double alp[ORDLP+1] = {0.229827, 0.788084, 1.129145,
1.847068, 0.923344, 1.000000};
/* Коэффициенты числителя полосового H(s) */
double bbp[ORDBP+1] = {0.000000, 14811342.626230, 0.000000,
2023340.076052, 0.000000, 71598.588280,
0.000000, 360.148756, 0.000000, 0.469268, 0.000000};
/* Коэффициенты знаменателя полосового H(s) */
double abp[ORDBP+1] = {2365742167.178879, 291177069.320213,
235456493.051836, 21865990.781777,
7907224.974367, 502677.680863, 105494.693148,
3892.083925, 559.152440, 9.225358, 1.000000};
double bz[ORDBP+1];
double az[ORDBP+1];
double w[N]; /* Циклическая частота рад/c */
double mag_lp[N]; /* АЧХ фильтра ФНЧ */
double mag_bp[N]; /* АЧХ фильтра полосового */
double mag_z[N]; /* АЧХ фильтра цифрового */
int k;
/* Load DSPL function */
hdspl = dspl_load();
if(!hdspl)
{
printf("libdspl loading error!\n");
return -1;
}
/* вектор частоты в логарифмической шакале от 0.01 до 100 рад/c */
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
/* частотные характеристика фильтра */
filter_freq_resp(blp, alp, ORDLP, w, N,
DSPL_FLAG_LOGMAG| DSPL_FLAG_ANALOG, mag_lp, NULL, NULL);
filter_freq_resp(bbp, abp, ORDBP, w, N,
DSPL_FLAG_LOGMAG| DSPL_FLAG_ANALOG, mag_bp, NULL, NULL);
/* Сохранить характеристики для построения графиков */
writetxt(w, mag_lp, N, "dat/mag_lp.txt");
writetxt(w, mag_bp, N, "dat/mag_bp.txt");
/* билинейное преобразование */
bilinear(bbp, abp, ORDBP, bz, az);
/* печать коэффициентов */
for(k = 0; k < ORDBP+1; k++)
printf("b[%2d] = %- 22.7f a[%2d] = %- 22.7f\n", k, bz[k], k, az[k]);
/* частота цифрового фильтра от 0 до pi */
linspace(0, M_PI, N, DSPL_PERIODIC, w);
filter_freq_resp(bz, az, ORDBP, w, N, DSPL_FLAG_LOGMAG, mag_z, NULL, NULL);
/* Сохранить характеристики для построения графиков */
writetxt(w, mag_z, N, "dat/mag_z.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 920, 260, "img/forum_low2bp.png", &hplot);
gnuplot_cmd(hplot, "set logscale x");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'частота, рад/с'");
gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst");
gnuplot_cmd(hplot, "set ylabel 'АЧХ ФНЧ, дБ'");
gnuplot_cmd(hplot, "set yrange [-100:5]");
gnuplot_cmd(hplot, "plot 'dat/mag_lp.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'АЧХ полосового, дБ'");
gnuplot_cmd(hplot, "plot 'dat/mag_bp.txt' with lines");
gnuplot_cmd(hplot, "unset logscale x");
gnuplot_cmd(hplot, "set xrange [0:pi]");
gnuplot_cmd(hplot, "set ylabel 'АЧХ цифрового, дБ'");
gnuplot_cmd(hplot, "set xlabel 'нормированная частота 0...pi'");
gnuplot_cmd(hplot, "plot 'dat/mag_z.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}
Код: Выделить всё
b[ 0] = 16906641.9085860 a[ 0] = 2922761579.1428056
b[ 1] = 126582656.9648800 a[ 1] = 27502625601.2978520
b[ 2] = 405619371.3114700 a[ 2] = 117420178468.6258200
b[ 3] = 694760584.1158080 a[ 3] = 299511895665.3810400
b[ 4] = 594460592.7464039 a[ 4] = 505453767741.6425800
b[ 5] = 0.0000000 a[ 5] = 589667880491.2689200
b[ 6] = -594460592.7464039 a[ 6] = 481597196310.4368900
b[ 7] = -694760584.1158080 a[ 7] = 271908691475.4406400
b[ 8] = -405619371.3114700 a[ 8] = 101570423706.7793900
b[ 9] = -126582656.9648800 a[ 9] = 22668895850.1973570
b[10] = -16906641.9085860 a[10] = 2295662300.9585342
PS. ФНЧ график совпадает. Для полосового фильтра графики ваш и мой различаются. В частности шкала частот разная на графиках, хотя качественно фильтры похожи.