Преобразования ФНЧ-ПФ

Все что касается фильтрации
Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Опять замучали фильтры...Не могу корректно построить АЧХ и т.д.
Для построения АЧХ фильтра делаю БПФ числителя и знаменателя, а потом делю результаты поэлементно друг на друга. Пробовал и в комплексном представлении и делить модули друг на дружку - получаю результаты, отличные от тех, которые приводятся в статьях. Не удержался - пошел подглядывать в Ваш код - увидел что Вы считаете все через нули и полюса фильтров, которые и используете для расчета передаточной характеристики.

Как все-таки верно проводить расчеты? Как сделал я по Вашим статьям (сразу формируя передаточную характеристику) или как Вы с использованием нулей и полюсов фильтров?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1056
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Никакие БПФ числителя и знаменателя не надо делить.

Если есть передаточная характеристика

,

то комплексный коэффициент передачи получаем подстановкой вместо . Далее берем модуль комплексного коэффициента передачи и это будет АЧХ, из фазы комплексного коэффициента передачи получаем ФЧХ.

Нули и полюса используются только для расчета коэффициентов передаточной характеристики.

Если же фильтр цифровой с передаточной характеристикой , то подставлять надо вместо переменной z

и все тоже самой модуль - АЧХ

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Спасибо)
Т.е. в действительную часть комплексного числа подставляю значения частоты (jw) в диапазоне, например, от 0 до Pi и в числителе со знаменателем получаю по комплексному числу для каждого значения частоты в соответствующих степенях. Все это суммирую. Потом делю комплексный числитель и знаменатель, получая тоже комплексное число для каждого w. А потом беру модуль, вычисляю фазу из этих значения и строю график?

Извините что туплю, но почему то именно БИХ фильтры - какой то заколдованный раздел, к которому в разное время возвращаюсь и все время спотыкаюсь.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1056
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

если цифровой бих то подставлять вместо z надо . в остальном все правильно.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Спасибо большое. Сделал так, но все-равно не получаю нормального графика.
Беру пример отсюда - 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:
АЧХ аналогового ПФ.png
После этого провожу Z-преобразование () и получаю АЧХ:
АЧХ цифрового ПФ.png
АЧХ цифрового ПФ.png (10.64 КБ) 2170 просмотров
Коэффициенты цифрового фильтра при этом:

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].


При этом проверяю как будет выглядеть АЧХ для ФНЧ Баттерворта также по примеру их статьи:
АЧХ цифрового ФНЧ Баттерворта.png
АЧХ цифрового ФНЧ Баттерворта.png (9.14 КБ) 2170 просмотров

Уверен что ошибка в коде моем. Генетическом даже скорее, но вдруг Вы сталкивались с той же ошибкой? Вычисления делаю ровно так как писалось постами выше.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1056
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Если Баттервотра правильно а эллиптический нет, то надо проверять как билинейное преобразование работает с числителем H(s). У Баттервотра там константа, а у эллиптического в числителе H(s) полином, который тоже участвует в билинейном преобразовании.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Спасибо). Пока искал - полностью все почти переписал. Но результат тот же.
Подглядел у Вас и перенес расчет передаточной характеристики и механизм сверток+дробно-рациональной подстановки, чтобы проверить результаты расчетов своих написанных функций. Считают одинаково, только у Вас матрицы в вектора, что очень хорошо, преобразованны, а у меня в лоб було сделанно ((
По итогу - для полосового фильтра получаю верные коэффициенты аналогового фильтра (со статьей сверяю), но аналоговая АЧХ выглядит как ФВЧ (ФНЧ и ФВЧ как доктор прям пописал - что цифровые, что аналоговые АЧХ). Подключаю отрисовку своего производства - картинка становится АЧХ полосового фильтра (Баттерворта,Чебышевых, Кауэра). Поэтому предполагаю что дробно-рациональная подстановка верно отрабатыват, т.к. при подстановке ФНЧ-ПФ получаются статейные коэффициенты (Кауэр) и аналоговая АЧХ выглядит как ПФ.

Цифровой фильтр опять же на себя не похож ((

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1056
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

Давайте так. Я могу проверить своей библиотекой если вы пришлёте коэффициенты аналогового фильтра и картинку ачх. Я сделаю билинейное преобразование и покажу коэффициенты цифрового фильтра и ачх. Сможете сравнить со своими.

Аватара пользователя
DimKaKiber
Сообщения: 29
Зарегистрирован: 26 мар 2020, 15:00
Откуда: Томск
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение DimKaKiber »

Давайте конечно. Уже нашел одну ошибку внутри кода генетического - не до конца просчитывались коэффициенты цифрового фильтра. Но картина не поменялась.

Я привязался к параметрам примера из статьи (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 в определенных степенях). Но график АЧХ превращается в тыкву (простите, но залез в Ваш код и перенес функции для отрисовки графиков, чтобы удостовериться - есть ли у меня ошибки в коде. Но мог и здесь напортачить :( ):
АЧХ аналогового ФНЧ после ФНЧ-ПФ
АЧХ аналогового ФНЧ после ФНЧ-ПФ
Но если сделать так как Вы раньше мне подсказывали, то получается такая АЧХ:
АЧХ аналогового ФНЧ после ФНЧ-ПФ_1
АЧХ аналогового ФНЧ после ФНЧ-ПФ_1
После проведения билинейного преобразования получаю такие коэффициенты:

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 рода и Золотарева.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1056
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Преобразования ФНЧ-ПФ

Сообщение Бахурин Сергей »

использовал приведенный данные для расчета. Расчет делал своей библиотекой. Код программы:

Код: Выделить всё

#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  
и строится графики АЧХ:
lininear.png
Все вроде нормально. Если надо можете отладить свой код по моей программе. Отладку моей программы можно сделать в среде CodeBlocks. Как настроить компилятор для сборки DSPL-2.0

PS. ФНЧ график совпадает. Для полосового фильтра графики ваш и мой различаются. В частности шкала частот разная на графиках, хотя качественно фильтры похожи.

Ответить