реклама на сайте
подробности

 
 
> Переходные процессы в цифровых фильтрах, вопрос
Zelepuk
сообщение Mar 23 2011, 12:18
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Собираюсь реализвоать Цифровую фильтрацию на Си.
Смотрю в матлабе модель фильтра. Как и положено наблюдается нектороый переходный процесс.

Мой алгорит фильтрации бцдет работать так:

отсчёты из АЦП поступают в некий буфер, раз в 1 секунду возникает прерывание, в котором, выборки из буфера кидаются в друго буфер, и производится фильтрация.

Боюсь, что возникнет переходный процесс. Так как данные при таком подходе фильтруются не непрерывно.

Какими приёмами можно избежать переходных процессов?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bahurin
сообщение Mar 24 2011, 10:51
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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;
}


Вот пример фильтрации с буфером. Фильтрует куски без разрывов, принцип понять можно, хотя программа не оптимальна.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Mar 24 2011, 11:26
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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;
}


Вот пример фильтрации с буфером. Фильтрует куски без разрывов, принцип понять можно, хотя программа не оптимальна.


Благодарю за код.Как я понимаю здесь БИХ фильтр, так как присутствует рекурсивная часть?
Go to the top of the page
 
+Quote Post
bahurin
сообщение Mar 24 2011, 12:31
Сообщение #4


Местный
***

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



Цитата(Zelepuk @ Mar 24 2011, 14:26) *
Благодарю за код.Как я понимаю здесь БИХ фильтр, так как присутствует рекурсивная часть?

да если надо ких фильтр, то просто все коэффициенты "a" надо обнулить кроме одного
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 09:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016