Цифровые фильтры

Тема в разделе "WASM.ELECTRONICS", создана пользователем Aids, 26 дек 2007.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Думаю вот эта статья поможет http://forum.sources.ru/index.php?showtopic=217371 не самая лучшая.
     
  2. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    S_Alex у меня есть программа которая рассчитывает коэффициенты при заданной АЧХ. Если писать программу на компе то всё ок. А вот у микроконтроллера операций деления и умнажения нет. Только сдвиговые. При решении уравнения коэффициенты получаются в большём диапазоне. От едениц до 10^-6. При использовании языков высокого уровня у каторых реализованы операции ум. и деления. Рассчёт алгоритма занимает много времени. Тоже не катит. Вот на угад и подобрал для нужной мне АЧХ. А с преобразованием Фурье ещё сложнее, там sin и cos.
     
  3. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Aids
    Необходимо выполнить нормализацию (превести к фиксированной разрядной сетке) всех коэффициентов и отбросить несущественные.
    А вот умножение и деление нужно писать самому или исспользовать готорвые библиотеки.
    А может нужно посмотреть на МК в которых есть аппаратная поддержка умножения (и деления).
     
  4. probka

    probka New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    170
    Вот прога для AVR:
    Код (Text):
    1. #include <90s8535.h>
    2. #include <delay.h>
    3.  
    4. #define ADC_VREF_TYPE 0x00
    5.  
    6. interrupt [ADC_INT] void adc_isr(void) {
    7.  
    8. PORTB=(unsigned char) ~ADCW;
    9.  
    10. delay_ms(20);
    11.  
    12. ADCSR|=0x40;
    13.  
    14. }
    15.  
    16.  
    17. void main(void) {
    18.  
    19. PORTB=0xFF;
    20. DDRB=0xFF;
    21.  
    22. ADCSR=0x8E;
    23.  
    24. #asm("sei")
    25.  
    26. ADMUX=0;
    27.  
    28. ADCSR|=0x40;  
    29.  
    30. while (1);
    31. {
    32.  
    33. }
    Она взята из курса AVR-123. Там же описание. Скачай и пользуйся.
    Я пока не работал с АЦП. Но по курсу вроде все понятно.

    И еще, если тебе нужен цифровой фильтр, то тебе вначале нужно определить частоты, которые подходят к твоему АЦП. Их может быть много. Из этих частот выбрать ту, которая нужна. У частот может быть разный вольтаж.

    Слушай, сделай фильтр полосовой на дискретных элементах и не парься. Если можно, конечно.
     
  5. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Может у сигнала может быть разная частота и амплитуда?

    А вот амплитуду нужно нормализировать, т.е. привести к диапазону рабочих напряжений АЦП.
    Для AVR это от 0В до 5В. (допустимые значения)

    Если быть точнее то напряжение на входе должно быть от 0В до уровня опорного напряжения, но не больше напряжения питания.
     
  6. probka

    probka New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    170
    S_Alex, а разве амплитуда это не вольтаж? Величина полуволны?
    Переменное напряжение - от 0 до ВМТ (верхняя мертвая точка - образно) и обратно. Так ведь?
    Увеличивается сила тока в цепи. Я ошибаюсь? За счет увеличения колл. электронов.
     
  7. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Как мне кажется, можно собрать хардварный тюнер на определенный диапазон частот (или несколько на разные диапазоны), при "включении" пройтись по диапазону в поиске полезного сигнала, зафиксировать частоту, на которой был выявлен полезный сигнал, и далее работать уже с ней.
    На мой взгляд фильтр для аналогового сигнала должен быть хардварный - либо фильтр, либо тюнер, что в принципе одно и тоже.
     
  8. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Да с напряжением входного сигнала проблем нет. Если на АЦП подать сигнал больше чем опорное напряжение, то после оцифровки напряжение будет равно опорному. Синусойда как бы срезается на мак. и мин.
     
  9. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    У меня стоит задача реализация цифрового фильтра на PIC16F877 на частоту 200Гц.
     
  10. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    В принципе мне удалось создать такой фильтр. Я использовал разностное уровнение, но вот как уже говорил коэффициенты подбирал экспериментально. Добротность получилась где то 10. Я в нем могу перестраивать резонансную частоту путём изменения периода дискретизации. Но есть одна проблемка. При изменении резонансной частоты и (и ссответственно подоваемого сигнала) Амплитуда колеблется в небольшём пределе. И добротность хотелось бы по больше.
     
  11. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Обнаружил в своём алгоритме косяк (хотя фильтр и работает) после оцифровки биполярного сигнала(в PIC16F877 10bit АЦП и подаю опорные сигналы +5 -5V). значение нулевой амплитуды оцифровывается как 1FF. А для разностного уровнения надо чтобы амплитуда нулевого значения оцифровывалась как 0. Я попробовал сдвинуть её путём вычитания 1FF. но фильтр перестал работать. Видимо коэффициенты подобраны под такую начальную амплитуду.
     
  12. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Я писал на Pic Байсике. У него обнаружил ещё и косяк при сдвиговых операциях. Так что решил писать на Ассемблере.
     
  13. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Удалось сделать на АСМ КИХ: ФВЧ с коэф Y=X0-X1
    и ФНЧ Y=X0*0.5+X1*0.5.
    получил коэф для БИХ фильтра: Y=X0*0.25-0.25*Y1-1.25*Y2, но пока не удалось его создать наблюдаю переполнение переменных
     
  14. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Походу, у тебя полюсы передаточной функции "уехали" далеко за единичную окружность, и как результат: ты получил неустойчивую систему.
    Да, ещё, коэффициенты фильтра ни коим образом не связаны с амплитудой входного сигнала!
    Ты хоть бы книжку какую о фильтрах почитал, что-ли...

    Теперь по делу - синтез цифрового фильтра состоит из следующих этапов:
    1. Задание требований к частотным (АЧХ, ФЧХ) и/или временным (ИХ, ПХ) характеристикам;
    2. Определение структуры будущего фильтра (рекурсивный - нерекурсивный) и расчёт коэффициентов передаточной функции;
    3. Реализация полученного разностного уравнения на "твоём" железе. Иногда, приходится возвращаться к предыдущим пунктам...

    Подбор коэффициентов "на глазок" - сродни гаданию на кофейной гущи!
     
  15. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Переделал прогу на АСМ. И исправил ошибки. Всё заработало. Пробовал создавать КИХ: Y=X0-X1 ФВЧ;
    Y=X0/2+X1/2 ФНЧ;
    И БИХ: Y=0.125*X0+0.25*Y1-0.5*Y3-0.25*Y4 полосовой.
    Всё ОК
     
  16. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Разностное уравнение:
    Y(n)=+0.00775123X(n)+0.00775123X(n-1)-0.01550247X(n-2)-0.01550247X(n-3)+0.00775123X(n-4)+0.00775123X(n-5) +3.48919204Y(n-1)-4.54557977Y(n-2)+2.62032127Y(n-3)-0.56397433Y(n-4)

    Соответствует фильтру с АЧХ (см. рис.) частота выборки 22050 Гц.
     
  17. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Такое уравнение проблемотично вшить в микроконтроллер. Желательно чтобы коэффициенты были степени двойки.
     
  18. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    А кто сказал, что будет легко.

    ... мечта ... Если бы так было ...