Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Stas Polozov                         2:5000/166.2   03 Oct 2002  15:16:24
 To : Dmitry Luzin
 Subject : Цифровой фильтр
 -------------------------------------------------------------------------------- 
 
 24 Сен 02 12:24, Daniel Kamperov -> Dmitry Luzin:
 
  DK> Hу, вот, простой (но медленный) алгоритм.
  DK>
  DK> Путём некоторого усложнения передаточной функции можно получить
  DK> фильтры более высокого порядка.
 
   Hекоторого усложнения, хех :)
   Короче, пора мне вмешаться :)
   Значит, делаем БИХ фильтр.
   Если конкретно, то фильтр Баттерворта, т.е. фильтр с оптимальными затуханиями
 своих звеньев, т.е. его АЧХ не имеет выбросов.
   *Основное положение*: при последовательном соединении 2-х фильтров порядка n
 и k получаем фильтр порядка n+k. Что реально означает "последовательное
 соединение"? Это значит, ты сначала фильтруешь фильтром n-го порядка, а потом
 то, что получилось - фильтром k-го порядка (вобще, по причине того, что фильтр
 - линейная система, очередность фильтрации не важна).
   Порядок выбираешь в зависимости от нужной тебе крутизны среза АЧХ.
 Возрастание порядка фильтра на 1 соответствует увеличению крутизны среза на
 -6Дб/октава или -20 Дб/декада.
   Hадо помнить о недостатке БИХ фильтра - наличии переходного процесса в начале
 фильтрации.
   Вот исходник фильтра восьмого порядка (-160Дб/декада). Фильтрация сделана
 двумя последовательными фильтрами четвертого порядка. Обрати внимание: для
 начала фильтрации требуется знать 8 предидущих отфильтрованных значений. То,
 что ты забиваешь их нулями, и дает этот неприятный переходный процесс.
   *Ахтунг*: это ФHЧ, чтобы получить ФВЧ, ты должен фильтровать каждым из
 фильтров четвертого порядка четвертую производную, умноженную на период
 дискретизации в 4 степени.
   Если ничего не понятно, могу залить главу из своего диплома.
 
 -[***]- Hачало myfilter_x8.cpp -[***]-
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <stdlib.h>
 
 #define d1 0.19509032201612826784828486847702 //постоянные фильтра
 #define d2 0.55557023301960222474283081394853
 #define d3 0.83146961230254523707878837761791
 #define d4 0.98078528040323044912618223613424
 
 #define fd 93.005952380952380952380952380952 //частота дискретизации
 #define K 30000 //число отсчетов
 
 void myfilter (double *data, double *data_filtered1, double *data_filtered2,
 double *data_filtered_last1, double *data_filtered_last2, double f0, int N)
 {double a_1, b_1, c_1, d_1, a_2, b_2, c_2, d_2, *data_filtered_tmp1,
 *data_filtered_tmp2;
 
 a_1 = 2*exp(-d1*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d1*d1))
  +2*exp(-d2*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d2*d2));
 
 b_1 = exp(-2*d1*2*M_PI*f0/fd)+exp(-2*d2*2*M_PI*f0/fd)+
 4*exp(-1*(d1+d2)*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d1*d1))*
 cos(2*M_PI*f0/fd*sqrt(1-d2*d2));
 
 c_1 = 2*exp(-2*M_PI*f0/fd*(2*d1+d2))*cos(2*M_PI*f0/fd*sqrt(1-d2*d2))+
 2*exp(-2*M_PI*f0/fd*(d1+2*d2))*cos(2*M_PI*f0/fd*sqrt(1-d1*d1));
 
 d_1 = exp(-2*2*M_PI*f0/fd*(d1+d2));
 /*-------------------------------------------------------*/
 a_2 = 2*exp(-d3*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d3*d3))
  +2*exp(-d4*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d4*d4));
 
 b_2 = exp(-2*d3*2*M_PI*f0/fd)+exp(-2*d4*2*M_PI*f0/fd)+
 4*exp(-1*(d3+d4)*2*M_PI*f0/fd)*cos(2*M_PI*f0/fd*sqrt(1-d3*d3))*
 cos(2*M_PI*f0/fd*sqrt(1-d4*d4));
 
 c_2 = 2*exp(-2*M_PI*f0/fd*(2*d3+d4))*cos(2*M_PI*f0/fd*sqrt(1-d4*d4))+
 2*exp(-2*M_PI*f0/fd*(d3+2*d4))*cos(2*M_PI*f0/fd*sqrt(1-d3*d3));
 
 d_2 = exp(-2*2*M_PI*f0/fd*(d3+d4));
 
 data_filtered_tmp1=new double [N+4];
 data_filtered_tmp2=new double [N+4];
 
 for (int i=0;i<4;i++)
 {data_filtered_tmp1[i]=data_filtered_last1[i];
 data_filtered_tmp2[i]=data_filtered_last2[i];
 //cout<<data_filtered_tmp[i];
 }
 //cout<<d_1<<" "<<d_2<<"\n";
 
 for (int i=4;i<N+4;i++)
 {data_filtered_tmp1[i]=data_filtered_tmp1[i-1]*a_1-data_filtered_tmp1[i-2]*b_1+
 data_filtered_tmp1[i-3]
 *c_1-data_filtered_tmp1[i-4]*d_1+(1-a_1+b_1-c_1+d_1)*data[i-4];
 
 data_filtered_tmp2[i]=data_filtered_tmp2[i-1]*a_2-data_filtered_tmp2[i-2]*b_2+d
 ata_filtered_tmp2[i-3]
 *c_2-data_filtered_tmp2[i-4]*d_2+(1-a_2+b_2-c_2+d_2)*data_filtered_tmp1[i];
 }
 
 for(int i=4;i<N+4;i++)
 {
 data_filtered1[i-4]=data_filtered_tmp1[i];
 data_filtered2[i-4]=data_filtered_tmp2[i];
 }
 
 delete data_filtered_tmp1;
 delete data_filtered_tmp2;
 }
 
 void main()
 {double in[K], out1[K], out2[K], out_last1[4], out_last2[4];
 
 for (int i=0;i<K;i++)
 in[i]=10;
 
 for (int i=0;i<4;i++)
 {
 out_last1[i]=0;
 out_last2[i]=0;
 }
 
 myfilter(in,out1,out2,out_last1,out_last2,2,K);
 
 for(int i=0;i<K;i++)
 cout<<i<<" "<<setprecision(15)<<out1[i]<<" "<<out2[i]<<"\n";
 
 }
 -[***]- Конец myfilter_x8.cpp  -[***]-
 
 ... np: Marillion - Three Boats Down From The ...
 --- GoldED+/W32 1.1.4.7
  * Origin:  Hollow ambitions in a hollow mind (2:5000/166.2)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Цифровой фильтр   Dmitry Luzin   14 Sep 2002 21:42:00 
 Re: Цифpовой фильтp   Slavik Levchenko   15 Sep 2002 01:10:57 
 Re: Цифpовой фильтp   Andrey Belyaev   15 Sep 2002 11:56:51 
 Цифpовой фильтp   Dmitry Luzin   17 Sep 2002 11:32:40 
 Цифpовой фильтp   Aleksey V. Vaneev   18 Sep 2002 09:12:33 
 Re: Цифpовой фильтp   Sergey Andrianov   19 Sep 2002 08:48:10 
 Цифpовой фильтp   Evgenij Masherov   21 Sep 2002 13:34:59 
 Цифpовой фильтp   Aleksey V. Vaneev   21 Sep 2002 18:43:48 
 Цифpовой фильтp   Evgenij Masherov   21 Sep 2002 20:03:06 
 Цифровой фильтр   Daniel Kamperov   16 Sep 2002 19:24:58 
 Цифровой фильтр   Dmitry Luzin   19 Sep 2002 22:09:46 
 Цифровой фильтр   Daniel Kamperov   24 Sep 2002 13:24:46 
 Цифровой фильтр   Stas Polozov   03 Oct 2002 15:16:24 
 Цифровой фильтр   Daniel Kamperov   06 Oct 2002 14:06:50 
 Цифровой фильтр   Stas Polozov   11 Oct 2002 06:15:18 
 Цифровой фильтр   Daniel Kamperov   13 Oct 2002 16:46:16 
 Цифровой фильтр   Stas Polozov   17 Oct 2002 19:02:52 
 Цифровой фильтр   Vladimir Vassilevsky   19 Oct 2002 05:12:33 
 Цифровой фильтр   Daniel Kamperov   21 Oct 2002 00:23:22 
 Цифровой фильтр   Gennady Mayko   21 Oct 2002 09:54:16 
 Цифровой фильтр   Vladimir Vassilevsky   21 Oct 2002 18:51:55 
 Цифровой фильтр   Gennady Mayko   22 Oct 2002 10:21:06 
 Цифровой фильтр   Vladimir Vassilevsky   22 Oct 2002 18:06:40 
 Цифровой фильтр   Gennady Mayko   22 Oct 2002 19:10:44 
 Цифровой фильтр   Vladimir Vassilevsky   22 Oct 2002 19:57:53 
 Re: Цифpовой фильтp   Alexandr Kudinov   16 Sep 2002 10:44:23 
Архивное /ru.algorithms/32933d9c0afc.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional