S_Alex у меня есть программа которая рассчитывает коэффициенты при заданной АЧХ. Если писать программу на компе то всё ок. А вот у микроконтроллера операций деления и умнажения нет. Только сдвиговые. При решении уравнения коэффициенты получаются в большём диапазоне. От едениц до 10^-6. При использовании языков высокого уровня у каторых реализованы операции ум. и деления. Рассчёт алгоритма занимает много времени. Тоже не катит. Вот на угад и подобрал для нужной мне АЧХ. А с преобразованием Фурье ещё сложнее, там sin и cos.
Aids Необходимо выполнить нормализацию (превести к фиксированной разрядной сетке) всех коэффициентов и отбросить несущественные. А вот умножение и деление нужно писать самому или исспользовать готорвые библиотеки. А может нужно посмотреть на МК в которых есть аппаратная поддержка умножения (и деления).
Вот прога для AVR: Код (Text): #include <90s8535.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 interrupt [ADC_INT] void adc_isr(void) { PORTB=(unsigned char) ~ADCW; delay_ms(20); ADCSR|=0x40; } void main(void) { PORTB=0xFF; DDRB=0xFF; ADCSR=0x8E; #asm("sei") ADMUX=0; ADCSR|=0x40; while (1); { } Она взята из курса AVR-123. Там же описание. Скачай и пользуйся. Я пока не работал с АЦП. Но по курсу вроде все понятно. И еще, если тебе нужен цифровой фильтр, то тебе вначале нужно определить частоты, которые подходят к твоему АЦП. Их может быть много. Из этих частот выбрать ту, которая нужна. У частот может быть разный вольтаж. Слушай, сделай фильтр полосовой на дискретных элементах и не парься. Если можно, конечно.
Может у сигнала может быть разная частота и амплитуда? А вот амплитуду нужно нормализировать, т.е. привести к диапазону рабочих напряжений АЦП. Для AVR это от 0В до 5В. (допустимые значения) Если быть точнее то напряжение на входе должно быть от 0В до уровня опорного напряжения, но не больше напряжения питания.
S_Alex, а разве амплитуда это не вольтаж? Величина полуволны? Переменное напряжение - от 0 до ВМТ (верхняя мертвая точка - образно) и обратно. Так ведь? Увеличивается сила тока в цепи. Я ошибаюсь? За счет увеличения колл. электронов.
Как мне кажется, можно собрать хардварный тюнер на определенный диапазон частот (или несколько на разные диапазоны), при "включении" пройтись по диапазону в поиске полезного сигнала, зафиксировать частоту, на которой был выявлен полезный сигнал, и далее работать уже с ней. На мой взгляд фильтр для аналогового сигнала должен быть хардварный - либо фильтр, либо тюнер, что в принципе одно и тоже.
Да с напряжением входного сигнала проблем нет. Если на АЦП подать сигнал больше чем опорное напряжение, то после оцифровки напряжение будет равно опорному. Синусойда как бы срезается на мак. и мин.
В принципе мне удалось создать такой фильтр. Я использовал разностное уровнение, но вот как уже говорил коэффициенты подбирал экспериментально. Добротность получилась где то 10. Я в нем могу перестраивать резонансную частоту путём изменения периода дискретизации. Но есть одна проблемка. При изменении резонансной частоты и (и ссответственно подоваемого сигнала) Амплитуда колеблется в небольшём пределе. И добротность хотелось бы по больше.
Обнаружил в своём алгоритме косяк (хотя фильтр и работает) после оцифровки биполярного сигнала(в PIC16F877 10bit АЦП и подаю опорные сигналы +5 -5V). значение нулевой амплитуды оцифровывается как 1FF. А для разностного уровнения надо чтобы амплитуда нулевого значения оцифровывалась как 0. Я попробовал сдвинуть её путём вычитания 1FF. но фильтр перестал работать. Видимо коэффициенты подобраны под такую начальную амплитуду.
Я писал на Pic Байсике. У него обнаружил ещё и косяк при сдвиговых операциях. Так что решил писать на Ассемблере.
Удалось сделать на АСМ КИХ: ФВЧ с коэф Y=X0-X1 и ФНЧ Y=X0*0.5+X1*0.5. получил коэф для БИХ фильтра: Y=X0*0.25-0.25*Y1-1.25*Y2, но пока не удалось его создать наблюдаю переполнение переменных
Походу, у тебя полюсы передаточной функции "уехали" далеко за единичную окружность, и как результат: ты получил неустойчивую систему. Да, ещё, коэффициенты фильтра ни коим образом не связаны с амплитудой входного сигнала! Ты хоть бы книжку какую о фильтрах почитал, что-ли... Теперь по делу - синтез цифрового фильтра состоит из следующих этапов: 1. Задание требований к частотным (АЧХ, ФЧХ) и/или временным (ИХ, ПХ) характеристикам; 2. Определение структуры будущего фильтра (рекурсивный - нерекурсивный) и расчёт коэффициентов передаточной функции; 3. Реализация полученного разностного уравнения на "твоём" железе. Иногда, приходится возвращаться к предыдущим пунктам... Подбор коэффициентов "на глазок" - сродни гаданию на кофейной гущи!
Переделал прогу на АСМ. И исправил ошибки. Всё заработало. Пробовал создавать КИХ: Y=X0-X1 ФВЧ; Y=X0/2+X1/2 ФНЧ; И БИХ: Y=0.125*X0+0.25*Y1-0.5*Y3-0.25*Y4 полосовой. Всё ОК
Разностное уравнение: 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 Гц.
Такое уравнение проблемотично вшить в микроконтроллер. Желательно чтобы коэффициенты были степени двойки.