|
Переходные процессы в цифровых фильтрах, вопрос |
|
|
|
 |
Ответов
|
Mar 24 2011, 10:51
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347

|
Код #include < stdio.h > #include < stdlib.h > #include < windows.h > #define _USE_MATH_DEFINES #include < math.h >
// фильтрация с буфером (функция не оптимальна, но принцип работы правильный) double filter(double xn, double* b, double* a, double* B, int N){ B[0] = xn; for(int i = 1; i<N; i++) B[0]-=a[i]*B[i]; double y = 0.0; for(int i = 0; i<N; i++) y+=b[i]*B[i]; memmove(B+1,B,(N-1)*sizeof(double)); return y; }
int main(){ // к-ты нерекурсивной части double b[4] = { 1.495242110818999600e-002, 3.165778089032666300e-002, 3.165778089032666300e-002, 1.495242110818999600e-002}; // к-ты рекурсивной части double a[4] = { 1.000000000000000000e+000, -2.137206690461268100e+000, 1.770779554588140800e+000, -5.403524601298397300e-001};
double x[100]; // исходный сигнал double y[1000]; // фильтрованный сигнал double B[4]; // кольцевой буфер memset(B,0,4*sizeof(double)); // обнуляю при старте
for (int n = 0; n<10; n++){ for(int i = 0; i<100; i++){ x[i]=(double)(rand()%1000) / 1000.0; // заполняю очередной кусок y[i+n*100] = filter(x[i],b,a,B,4); //и фильтрую очредной кусок } } return 0; } Вот пример фильтрации с буфером. Фильтрует куски без разрывов, принцип понять можно, хотя программа не оптимальна.
|
|
|
|
|
Mar 24 2011, 11:26
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(bahurin @ Mar 24 2011, 13:51)  Код #include < stdio.h > #include < stdlib.h > #include < windows.h > #define _USE_MATH_DEFINES #include < math.h >
// фильтрация с буфером (функция не оптимальна, но принцип работы правильный) double filter(double xn, double* b, double* a, double* B, int N){ B[0] = xn; for(int i = 1; i<N; i++) B[0]-=a[i]*B[i]; double y = 0.0; for(int i = 0; i<N; i++) y+=b[i]*B[i]; memmove(B+1,B,(N-1)*sizeof(double)); return y; }
int main(){ // к-ты нерекурсивной части double b[4] = { 1.495242110818999600e-002, 3.165778089032666300e-002, 3.165778089032666300e-002, 1.495242110818999600e-002}; // к-ты рекурсивной части double a[4] = { 1.000000000000000000e+000, -2.137206690461268100e+000, 1.770779554588140800e+000, -5.403524601298397300e-001};
double x[100]; // исходный сигнал double y[1000]; // фильтрованный сигнал double B[4]; // кольцевой буфер memset(B,0,4*sizeof(double)); // обнуляю при старте
for (int n = 0; n<10; n++){ for(int i = 0; i<100; i++){ x[i]=(double)(rand()%1000) / 1000.0; // заполняю очередной кусок y[i+n*100] = filter(x[i],b,a,B,4); //и фильтрую очредной кусок } } return 0; } Вот пример фильтрации с буфером. Фильтрует куски без разрывов, принцип понять можно, хотя программа не оптимальна. Благодарю за код.Как я понимаю здесь БИХ фильтр, так как присутствует рекурсивная часть?
|
|
|
|
Сообщений в этой теме
Zelepuk Переходные процессы в цифровых фильтрах Mar 23 2011, 12:18 SSerge "некий буфер" должен быть кольцевым. Mar 23 2011, 12:29 Zelepuk Цитата(SSerge @ Mar 23 2011, 15:29) ... Mar 23 2011, 13:15 maugli Сохраняйте полное состояние фильтра в прмежутках ф... Mar 23 2011, 12:32 Мусатов Константин Вы будете использовать какой тип фильтра? КИХ, БИХ... Mar 23 2011, 13:36 V_G Переходные процессы - неотъемлемая часть любых фил... Mar 23 2011, 13:46 Zelepuk У меня данные от АЦП полступают всегда, прерывание... Mar 23 2011, 13:55 Мусатов Константин ЦитатаОбработку порциями можно реализовать не толь... Mar 23 2011, 15:04 bahurin любой фильтр КИХ или БИХ может работать бесконечно... Mar 23 2011, 15:38 Мусатов Константин Цитата(bahurin @ Mar 23 2011, 18:38) любо... Mar 23 2011, 20:40 Zelepuk Алгоритм обработки данных должен выглядеть как на ... Mar 23 2011, 15:39 Pavel_SSS Цитата(Zelepuk @ Mar 23 2011, 18:39) Алго... Mar 23 2011, 21:43 V_G Про "сшивку", суммирование с перекрытием... Mar 24 2011, 04:37 Zelepuk Спасибо всем за коментарии. Ситуация проясняется. ... Mar 24 2011, 06:29 Pavel_SSS Цитата(Zelepuk @ Mar 24 2011, 09:29) Спас... Mar 24 2011, 07:01 Zelepuk Но как найти глубину этих буферов? Есть критерии? Mar 24 2011, 07:26 Pavel_SSS Цитата(Zelepuk @ Mar 24 2011, 10:26) Но к... Mar 24 2011, 07:46 V_G Длина кольцевого буфера равна числу запоминаемых о... Mar 24 2011, 08:33 Zelepuk Цитата(V_G @ Mar 24 2011, 11:33) Длина ко... Mar 24 2011, 08:52  Pavel_SSS Цитата(Zelepuk @ Mar 24 2011, 11:52) а ка... Mar 24 2011, 09:21   Zelepuk Цитата(bahurin @ Mar 24 2011, 15:31) да е... Mar 24 2011, 21:13
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|