Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/93: Рейтинг темы: голосов - 93, средняя оценка - 4.74
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
1

Реализация ФНЧ Баттерворта

17.03.2011, 09:28. Просмотров 18551. Ответов 18
Метки нет (Все метки)

есть ли у кого уже готовый код расчета фильтра?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2011, 09:28
Ответы с готовыми решениями:

Реализация полосового фильтра Баттерворта 3 порядка
Использование z-преобразования Ннч(S)--> Hпф(z) с получением соответствующей матрицы, позволяет...

Реализация ФНЧ
Здравствуйте. Задача такая: есть массив данных (запись сигнала). В этом сигнале присутствуют 2...

Фильтр Баттерворта
День добрый! Задача написать функцию фильтрации сигнала на плюсах. Фильтр - фильтр Баттерворта,...

Фильтр Баттерворта
Доброго времени суток! Подскажите, пожалуйста, как рассчитать коэффициенты полосового фильтра...

18
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
17.03.2011, 16:12 2
ht1515, не проще ли взять готовую программу для расчета фильтров, получить коэффициенты и использовать их в своей программе?
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
17.03.2011, 19:31  [ТС] 3
ммм, возможно проще... а какую прогу можно взять ? Чтобы разобраться как получить коэффициенты можно было без чения книг по проге.
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 08:27 4
ht1515, в матлабе есть для этого очень удобная тулза - fdatool. Выбираешь iir фильтр баттерворта, выбираешь какой тебе нужен фильтр: нч, вч, полосовой или режекторный, затем выбираешь нужные полосы пропускания/задержки и все, он генерирует фильтр. Затем берешь коэффициенты которые он выдаст и используешь их в своей программе.
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 09:25  [ТС] 5
для ФНЧ батерворта порядка 4 какие коэффициенты будут?
для того чтобы частота среза была 50 ГЦ
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 09:46 6
Цитата Сообщение от ht1515 Посмотреть сообщение
для ФНЧ батерворта порядка 4 какие коэффициенты будут?
для того чтобы частота среза была 50 ГЦ
на какой частоте дискретизации?

Добавлено через 4 минуты
для 44100:
num
{1,59474118803748e-10, 6,37896475214992e-10, 9,56844712822487e-10, 6,37896475214992e-10, 1,59474118803748e-10}
den
{1, -3,98138465124704, 5,94432702369431, -3,94449915258405, 0,981556782688368 }
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 10:05  [ТС] 7
о-о-о, ща проверю.
я пытался сам посчитать коэффициенты. Но он касячно считает. Потом если найду где касяк , выложу сюда. Считал по http://www.dsplib.ru/content/f... terex.html
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//---------------------------------------------------------------------------
 
 
#pragma hdrstop
 
#include "algorithms.h"
#include "math.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
 
double T; // интервал дискретизации
double pi=3.14;
double ws=0.6*pi;
double wp=0.6*pi;
double Rp=1;
double Rs=60;
int Np=3;
 
double omegaP(){
return (2/T)*tan(wp/2);
}
 
double omegaS(){
return (2/T)*tan(ws/2);
}
 
double epsilonP(){
double df= sqrt(pow(10,Rp/10)-1);
return sqrt(pow(10,Rp/10)-1);
}
 
double epsilonS(){
double  df=sqrt(pow(10,Rs/10)-1);
return sqrt(pow(10,Rs/10)-1);
}
 
//функция округления  числа N
int roundN(double N){
int intN=N;
double Raz=N-(double)intN;
if (Raz>0.5) return ceil(N);
else  return floor(N);
}
 
// определение  порядка фильтра
double Nporyadok(){
return roundN(log(epsilonS()/epsilonP())/log(omegaS()/omegaP()));
}
 
// определение  альфы
double alpha(){
double drob =0.33;
double ff=1/pow(epsilonP(),drob);
return (1/pow(epsilonP(),drob));
}
 
// определение  фи
double fi(){
double df=((2*1-1)*pi)/(2*Np);
return (2*1-1)*pi/2*Np;
}
 
void CalculateCoeffN3(){
 
double a=20.556/pow(alpha(),3);
double b=(6.6505*(2*sin(fi()+1)))/pow(alpha(),2);
double c=(2.116*(2*sin(fi()+1)))/alpha();
 
 MainForm->a0=1;
 MainForm->a1=(c+3-3*a+b)/(a+b+c+1);
 MainForm->a2=(3*a-b-c+3)/(a+b+c+1);
 MainForm->a3=(b-a-c+1)/(a+b+c+1);
 
 MainForm->b0=1/(a+b+c+1);
 MainForm->b1=3/(a+b+c+1);
 MainForm->b2=3/(a+b+c+1);
 MainForm->b3=1/(a+b+c+1);
}


Добавлено через 3 минуты
vital792, можешь ещё сказать для порядка равного 3? Частота 8.4 Кгц.
Частота дискритзации это что? Количество отсчетов в периоде?

Добавлено через 5 минут
сеть 50Гц, то есть 1\50 = 0.02 с
канал ацп 8.3Кгц 1\8300=0.0012с
0.02 \ 0.0012 = 17 точек на 1 период получается что ли дискретизация.
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 10:12  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
          a0=1;
          a1=-3.98138465124704;
          a2=5.94432702369431;
          a3=-3.94449915258405;
          double a4=0.981556782688368;
          b0=1.59474118803748e-10;
          b1=6.37896475214992e-10;
          b2=9.56844712822487e-1;
          b3= 6.37896475214992e-10;
    double b4=1.59474118803748e-10;
 
    
         
         for (int k = 0; k < countRMS-1; k++)  y3[k]= b0*y1[k]+ b1*y1[k-1]+ b2*y1[k-2]+ b3*y1[k-3]+b4*y1[k-4]-a1*y3[k-1]-a2*y3[k-2]-a3*y3[k-3]-a4*y3[k-4];
красная баттерворт.
0
Миниатюры
Реализация ФНЧ Баттерворта  
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 10:13  [ТС] 9
y1- входной массив,
y3 выходной(баттерворт)
зеленая- это СКО. масштаб большой, а так видно что зеленая шумит, надо из неё прямую линию сделать(то есть видно что она как прямая- но это из за масштаба, баттерворт по экспоненте вырос).
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 10:27 10
Цитата Сообщение от ht1515 Посмотреть сообщение
Частота дискритзации это что? Количество отсчетов в периоде?
нет это количество отсчетов сигнала на секунду
Цитата Сообщение от ht1515 Посмотреть сообщение
канал ацп 8.3Кгц
видимо это она и есть
Цитата Сообщение от ht1515 Посмотреть сообщение
можешь ещё сказать для порядка равного 3? Частота 8.4 Кгц.
num
6,30129962118151e-06 1,89038988635445e-05 1,89038988635445e-05 6,30129962118151e-06
den
1 -2,92520452880893 2,85318010843919 -0,927925169233285
Добавлено через 3 минуты
Цитата Сообщение от ht1515 Посмотреть сообщение
for (int k = 0; k < countRMS-1; k++) *y3[k]= b0*y1[k]+ b1*y1[k-1]+ b2*y1[k-2]+ b3*y1[k-3]+b4*y1[k-4]-a1*y3[k-1]-a2*y3[k-2]-a3*y3[k-3]-a4*y3[k-4];
как это [k-1], [k-2], ... если к от нуля? это же рекурсивный фильтр
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 10:29  [ТС] 11
че он так масштаб разрывает?
0
Миниатюры
Реализация ФНЧ Баттерворта  
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 10:31 12
Цитата Сообщение от ht1515 Посмотреть сообщение
красная баттерворт.
что это за график? Ни на импульсную характеристику, ни на ачх, ни на какую другую не похожа
0
Миниатюры
Реализация ФНЧ Баттерворта  
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
18.03.2011, 10:35  [ТС] 13
как это [k-1], [k-2], ... если к от нуля? это же рекурсивный фильтр
ну так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
          a0=1;
          a1=-2,9252045288089;
          a2=2,8531801084391;
          a3=-0,927925169233285;
 
          b0=6,30129962118151e-06;
          b1=1,89038988635445e-05;
          b2=1,89038988635445e-05;
          b3=6,30129962118151e-06;
 
 
         ;
         for (int k = 3; k < countRMS-1; k++)  y3[k]= b0*y1[k]+ b1*y1[k-1]+ b2*y1[k-2]+ b3*y1[k-3]-a1*y3[k-1]-a2*y3[k-2]-a3*y3[k-3];
Добавлено через 1 минуту
http://www.dsplib.ru/content/f... 2eafbb.gif я по этой формуле считаю.

Добавлено через 1 минуту
или че то не так считаю?

Добавлено через 1 минуту
что это за график?
СКО преобразует в такой вид
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 14:04 14
думаю правильнее будет так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "malloc.h"
 
// фильтр баттерворта 4 порядка (одна секция)
void butter4(double *in, double *out, int length, const double NUM[], const double DEN[])
{
    double x, y0, y1 = 0, y2 = 0, y3 = 0;
    double b0= NUM[0];
    double b1= NUM[1];
    double b2= NUM[2];
    double b3= NUM[3];
 
    double a0= DEN[0];
    double a1= DEN[1];
    double a2= DEN[2];
    double a3= DEN[3];
 
    for(int i= 0; i < length; i++)
    {
        x = *in++;
        y0 = x * b0 + y1;
        y1 = b1 * x - a1 * y0 + y2;
        y2 = b2 * x - a2 * y0 + y3;
        y3 = b3 * x - a3 * y0;
        *out++ = y0 * a0;
    }
}
 
int main(int argc, char* argv[])
{
    int Length = 1000;
    double Num[] = {6.30129962118151e-06, 1.89038988635445e-05, 1.89038988635445e-05, 6.30129962118151e-06};
    double Den[] = {1, -2.92520452880893, 2.85318010843919, -0.927925169233285};
 
    double *signal = (double*)calloc( Length, sizeof(double) );
    signal[0] = 1.0;
 
    double *filtredSignal = (double*)malloc( sizeof(double) * Length );
 
    butter4(signal, filtredSignal, Length, Num, Den);
 
    FILE *f = fopen("ImpResponse.txt","w+");
    for(int i=0; i<Length; i++)
        fprintf(f, "%.15e%c", filtredSignal[i] , ' ');
    fclose(f);
 
    free(signal);
    free(filtredSignal);
    return 0;
}
и для проверки правильности работы функции можно сравнить результат с матлабом:
Код
Num = [6.30129962118151e-06,1.89038988635445e-05,1.89038988635445e-05,6.30129962118151e-06];
Den = [1,-2.92520452880893,2.85318010843919,-0.927925169233285];

x = [1 zeros(1, 1000)];
y = filter(Num, Den, x);

load ('ImpResponse.txt')
plot(ImpResponse); grid on; axis tight;
hold on;
plot(y, 'r'); grid on; axis tight;
на графике видно, что результат одинаков (красный график накладывается на синий)
1
Миниатюры
Реализация ФНЧ Баттерворта  
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
18.03.2011, 14:06 15
там комментарий не верный - 3 порядка

Добавлено через 1 минуту
хотел сначала сделать 4-го, но поленился))
1
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,030
23.03.2011, 11:45  [ТС] 16
поставил матлаб, сделал фильтр. Как ты коэффициенты получил? Там есть кнопка.
но чет не понятно че за секторы
0
Миниатюры
Реализация ФНЧ Баттерворта  
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
23.03.2011, 15:29 17
ht1515, ты получил фильтр, но он по умолчанию разбит на несколько секций. Для начала объедини их в одну: меню Edit->Convert to single section. Затем экспортируешь коэффициенты фильтра в среду: File->Export. Выбираешь Export to workspace, Export as coefficients.
0
0 / 0 / 1
Регистрация: 19.06.2014
Сообщений: 17
02.12.2014, 23:35 18
Здравствуйте,у меня есть программа ФВЧ 4-го порядка,кто нибудь сможет ее переделать для 4го порядка только для ФНЧ? Очень нужно,помогите пожалуйста,коэффициенты, рассчитанные мной есть.

Никто не может?
0
Вложения
Тип файла: rar 268492.rar (246.1 Кб, 58 просмотров)
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 142
05.12.2014, 11:07 19
Я так сделал. Также по мурзилке http://www.dsplib.ru/content/f... terex.html

Расчет поэтапный в функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
N = Butter_Matlab_Grad(SampleRate,BP,BS,Rp,Rs); //Порядок фильтра Баттерворта
    IIR_Gradation->Text = FloatToStr(N);
    IIR_Gradation->Enabled = false;
    //Числитель аналогового фильтра нижних частот Баттерворта.
    double Analog_Num = Analog_Chisl_Butter_LPF(Rp);
   //Знаменатель аналогового фильтра Баттерворта.
   if (Denumerator != NULL) free(Denumerator);
   Denumerator = Analog_Znam_Butter(N,Rp);
   //ФНЧ_ФНЧ преобразование
   LPF_LPF_Transformation_Butter(N,SampleRate,BP,Denumerator,Analog_Num);
   //Z-преобразование
   //Формирую массив Num, т. к. знаменатель уже нужного размера и наполнения.
   if (Numerator != NULL) free(Numerator);
   Numerator = (double*)malloc(sizeof(double)*(N+1));
   for (long i = 0; i < (N+1); i++) Numerator[i] =  0.0;
   Numerator[N] = 1.0;
   //Z-преобразование выполняю и получаю некие массивы коэффициентов цифрового фильтра.
   Z_Transform_Matlab(N,Numerator,Denumerator);
   Kol_El_Num = 0; Kol_El_Den = 0;
Порядок считаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
long Butter_Matlab_Grad(long SampleRate,long BP,long BS,long RP,long RS) //Порядок фильтра Баттерворта
{
 //Частоты в радианы перевожу.
 double BP1 = (2*M_PI*BP)/(float)SampleRate;
 double BS1 = (2*M_PI*BS)/(float)SampleRate;
 //Дальше параметры расчитываю.
 double TettaP = tan((BP1*M_PI)/2.0);
 if (TettaP < 0) TettaP = -1*TettaP;
 double TettaS = tan((BS1*M_PI)/2.0);
 if (TettaS < 0) TettaS = -1*TettaS;
 double EpsP = sqrt(pow(10,(RP/10.0))-1);
 double EpsS = sqrt(pow(10,(RS/10.0))-1);
 double R = log10(EpsS/EpsP)/log10(TettaS/TettaP);
 if (R < 0) R = -1*R;
 double B = floor(R);
 long Result;
  Result = 0;
 //Если надо, то округляю в большую сторону.
 if ((R-B) >= 0.1) Result = B+1;
  else Result = B;
 return Result;
}
Теперь числитель фильтра перед нормировкой считается:
C++
1
2
3
4
5
6
7
8
double Analog_Chisl_Butter_LPF(long Rp) //Расчет значения в числителе аналогового фильтра нижних частот Баттерворта.
{
 double Result;
  Result = 0.0;
 double EpsP = Round(sqrt(pow(10,(Rp/10.0))-1),0.0001);
 Result = Round(1/EpsP,0.0001);
 return Result;
}
Расчет ненормированного знаменателя фильтра:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
double *Analog_Znam_Butter(long N,long Rp) //Расчет значений знаменателя аналогового фильтра нижних частот Баттерворта.
{
 double EpsP = Round(sqrt(pow(10,(Rp/10.0))-1),0.0001);
 double Alfa = Round(1/pow(EpsP,(1/(float)N)),0.0001);
 //Массив Этта формирую для дальнейших вычислений.
 long L; L = 0;
 if (N%2 == 0) L = (N-1)/2.0;
  else  L = N/2.0;
 double *Etta =  (double*)malloc(sizeof(double)*L);
 for (long i = 1; i < L+1; i++)
  {
   Etta[i-1] = Round((((2*i)-1)/(float)(2*N))*M_PI,0.0001);
  }
 //Теперь при помощи линейной свертки надо коэффициенты полинома Баттерворта отискать.
 long R;
 if (N%2 != 0) R = 1;
  else R = 0;
 long Size; //Размер результирующего вектора данных.
 if (N > 1) Size = 2+L+R;
   else Size = 2;
 double *Result =  (double*)malloc(sizeof(double)*Size);
  if (Size == 2)
   {
    Result[0] = 0.0; Result[0] = 1.0; Result[1] = 0.0; Result[1] = Alfa;
   }
  else
   {
    //Сначала получаю значения полинома Баттерворта. Линейная свертка в помощь.
    if ((L == 1) && (R == 0)) //Полином второй степени, => считать нечего.
     {
      Result[0] = 0.0; Result[0] = 1.0; Result[1] = 0.0; Result[1] = 2*Alfa*sin(Etta[0]);
     }
    if ((L == 1) && (R == 1)) //полином третей степени.
     {
      double *A =  (double*)malloc(sizeof(double)*Size);
      double *B =  (double*)malloc(sizeof(double)*Size);
      B[0] = 0.0; B[0] = 1.0; B[1] = 0.0; B[1] = 2*Alfa*sin(Etta[0]); B[2] = 0.0; B[2] = pow(Alfa,2);
      A[0] = 0.0; A[0] = 1.0; A[1] = 0.0; A[1] = Alfa; A[2] = 0.0;
      Vector_Conv(Size,A,B,Result);
      free(A);
     }
    if (L > 1) //Остальные полиномы.
     {
      double *A =  (double*)malloc(sizeof(double)*Size);
      double *B =  (double*)malloc(sizeof(double)*Size);
      A[0] = 0.0; A[0] = 1.0; A[1] = 0.0; A[1] = 2*Alfa*sin(Etta[0]); A[2] = 0.0; A[2] = pow(Alfa,2);
      B[0] = 0.0; B[0] = 1.0; B[1] = 0.0; B[1] = 2*Alfa*sin(Etta[1]); B[2] = 0.0; B[2] = pow(Alfa,2);
      Vector_Conv(Size,A,B,Result);
      for (long i = 2; i < L; i++)
       {
        for (long j = 0; j < Size; j++)
         {
          A[j] = 0.0; A[j] = Result[j]; Result[j] = 0.0;
         }
        B[0] = 0.0; B[0] = 1.0; B[1] = 0.0; B[1] = 2*Alfa*sin(Etta[i]); B[2] = 0.0; B[2] = pow(Alfa,2);
        Vector_Conv(Size,A,B,Result);
       }
      if (R == 1)
       {
        for (long j = 0; j < Size; j++)
         {
          A[j] = 0.0; A[j] = Result[j]; Result[j] = 0.0;
          B[j] = 0.0;
         }
        B[0] = 0.0; B[0] = 1.0; B[1] = 0.0; B[1] = Alfa;
        Vector_Conv(Size,A,B,Result);
       }
      free(A);
      free(B);
     }
   }
 free(Etta);
 return Result;
}
Теперь ФНЧ-ФНЧ преобразование (заодно и нормировка фильтра):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void LPF_LPF_Transformation_Butter(long N,long SampleRate,long BP,double *Den, double Num)//ФНЧ_ФНЧ преобразование
{
 double BP1 = Round((2*M_PI*BP)/(float)SampleRate,0.00001);
 double TettaP = Round(tan((BP1*M_PI)/2.0),0.0001);
 long L; L = 0;
 if (N%2 == 0) L = (N-1)/2.0;
  else  L = N/2.0;
 long R;
 if (N%2 != 0) R = 1;
  else R = 0;
 //Размер массива Den.
 long Size;
 if (N > 1) Size = 2+L+R;
   else Size = 2;
 //Надо все индексы при S разделить на TettaP в степени равной порядковому номеру S.
 //Нулевое S не трогаю. + Попутно все вместе с нулевым S делю на Num. Тогда в числителе 1-ца останется.
 Den[Size-1] = Den[Size-1]/Num;
 for (long i = 0; i < Size-1; i++)
  {
   Den[i] = Den[i]/pow(TettaP,(Size-1-i));
   Den[i] = Den[i]/Num;
  }
}
Все......Теперь осталось Z-преобразование сделать, чтобы получить коэффициенты числителя и знаменателя передаточной функции фильтра.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void Z_Transform_Matlab(long N,double *Num,double *Denum) //Z-преобразование по методу Матлаба.
{
 //Создаем матрицу First. Первый элемент == 1, остальные == 0.
 long D = N+1; //Размерность матрицы == DxD.
 double *NUM = (double*)malloc(sizeof(double)*D*D);
 double *DEN = (double*)malloc(sizeof(double)*D*D);
 for (long i = 0; i < D; i++)
   {
    for (long j = 0; j < D; j++)
     {
      NUM[i+(j*D)] = 0.0;
      DEN[i+(j*D)] = 0.0;
     }
   }
 NUM[0+(0*D)] = 1.0;
 DEN[0+(0*D)] = 1.0;
 //Дополнительно два вектора создаю для билинейного преобразования.
 double *A = (double*)malloc(sizeof(double)*D); //[1,1]
 double *B = (double*)malloc(sizeof(double)*D); //[1,-1]
 for (long i = 0; i < D; i++)
  {
   A[i] = 0.0; B[i] = 0.0;
  }
 A[0] = 1.0; A[1] = 1.0;
 B[0] = 1.0; B[1] = -1.0;
 Matrix_Linear_Conv(D,NUM,A);
 Matrix_Linear_Conv(D,DEN,B);
 double *ND = Create_ND_Matrix(D,NUM,DEN);
 //Завершающая стадия. Построчно перемножаю матрицу ND на вектора коэффициентов
 //Num и Denum, параллельно складываю значения по столюцам и получаю интересующий коэффициент.
 double Nu,De;
 for (long i = 0; i < D; i++)
  {
   A[i] = 0.0; A[i] = Num[i];
   B[i] = 0.0; B[i] = Denum[i];
  }
 for (long i = 0; i < D; i++)
  {
   Nu = 0.0; De = 0.0;
   for (long j = 0; j < D; j++)
    {
     Nu += ND[j+(i*D)]*A[j];
     De += ND[j+(i*D)]*B[j];
    }
   Num[i] = 0.0; Num[i] = Nu;
   Denum[i] = 0.0; Denum[i] = De;
  }
 //В заключении надо отнормировать все получившиеся значения на значение при S^0
 //в знаменателе. У меня это Denum[0]
 for (long i = 1; i < D; i++)
  {
   Num[i] = Num[i]/Denum[0];
   Denum[i] = Denum[i]/Denum[0];
  }
 Num[0] = Num[0]/Denum[0];
 Denum[0] = Denum[0]/Denum[0];
free(A);
free(B);
free(ND);
free(NUM);
free(DEN);
}

Примерно так все. Порядок фильтра любой будет.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2014, 11:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

фильтр Баттерворта
Добрый вечер! Подскажите пожалуйста, с программой столкнулась в первые. у Меня есть текстовый...

Фильтр Баттерворта
Добрый день. Делаю курсовую, все рассчитала, надо проверить ФНЧ в MathCad. Не пойму где ошибка....

Расчет фильтра Баттерворта
Привет всем! Сколько не искал,не могу найти верный алгоритм расчета фильтра Баттерворта 4 порядка....

ЛАЧХ, АЧХ Фильтра Баттерворта
Что я делаю не так? Помогите,пожалуйста. Алгоритм использую вот этот

ППФ Баттерворта не могу разобраться
Ребята привет, проблемка такая: формирую сигнал ФМ-2, формирую фильтр ППФ Баттерворта, пропускаю...

Пишу курсовую по цифровым фильтрам (Баттерворта)
Пишу курсовую по цифровым фильтрам (Баттерворта). Может быть такой ФНЧ - Scope (показывает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.