Необходимо составить программу цифрового фильтра. Чтобы в последствии вшить в микроконтроллер. Фильтр должен выделять из сигнала определённую частоту. Всё что я нашёл в инете это разностное уравнение с помощю которого можно создать фильтр. Но как расчитать коэффициенты чтобы они соответствовали моему фильтру мне не понятно. И какой порядок уравнения брать?
Вот здесь есть немножко о цифровых фильтрах http://www.naf-st.ru/main/digit Может наталкнет на какие то идеи.
Aids Почитайте теорию. Есть достаточно книг. Фильтры бывают КИХ и БИХ... Есть много программ..Например тот же матлаб.Там есть специальный тулбокс для расчёта. Порядок определяется заданными вами условиями для АЧХ. Полоса, неравномерность в полосе частот, подавление за полосой пропускания...
Bat Книг по ЦФ накачал. Теорию рассчёта коэффициентов тяжело как то понимается. Скачал программу VisSim. Она в виде симулятора.Может рассчитывать коэффициенты. Задаю в ней полосу пропускания для фильтра и порядок уравнения и получаю коэффициенты. Потом подаю сигнал с генератора на фильтр и снимаю осцилограмму. Результат какой то странный получается. Не то что должно быть на самом деле.
Может не совсем по теме, но почему-бы не Systolix от analog device AD7725 ? Требует минимум познаний.
S_Alex теорема Котельникова гласит, что частота выборок (дискретизации) должна быть в 2 раза больше верхней частоты дскретизируемого сигнала
Есть один простой способ получения рекурентного уравнения для передаточной функции цифрового фильтра. Например: есть у нас передаточная фунция цифрового фильтра вида. D(z) = Y(z)/X(z) = (a1*z^^(-3)+a2*z^^(-2)+a3*z^^(-1)+a4)/(b1*z^^(-3)+b2*z^^(-2)+b3*z^^(-1)+b4) если перейти к отчетам [n], то получим Y[n-3]*b1+Y[n-2]*b2+Y[n-1]*b3+Y[n]*b4 = X[n-3]*b1+X[n-2]*b2+X[n-1]*b3+X[n]*b4 тогда для выходного сигнала на текущем такте запишем: Y[n] = (X[n-3]*b1+X[n-2]*b2+X[n-1]*b3+X[n]*b4 - (Y[n-3]*b1+Y[n-2]*b2+Y[n-1]*b3) )/b4 где Y[n],X[n] текущий выходной и входной сигнал Y[n-1],X[n-1] выходной и входной сигнал на предыдущем такте Y[n-2],X[n-2] выходной и входной сигнал на 2 такта назад и т.д. Остаеться подсчитать математику с плавающей точкой и всё пучком. Удачи!
Aids, мне бы твои проблемы. В МК активируй АЦП. Принимай все значения. Из принятых, бери то, которое тебе нужно. Для корректировки, осцилограф рулит.
probka ты предлагаешь замерять частоту входного сигнала, а потом в соответствии с этим пропускать сигнал или нет. Я правильно тебя понял?
Да. Смотри: 1. Беги по всем частотам постоянно. (МК возможности). 2. Как только принял цифру, то есть обнаружил рабочаю частоту, СТОП ЧАСТОТА. 3. Принимай и обрабатывай. Вроде так. Попробуй )
probka Я тут что-то не врубаюсь. Как это? Проще прошить в МК классическую (прямую) форму реализации цифрового фильтра и не ... http://elib.ispu.ru/library/lessons/faleev/index.html
probka Мне не совсем понятна фраза "Беги по всем частотам" это как? Как это можно реализовать. На сколько я знаю в MK можно только померять частоту путём подсчёта импульсов за определённое время. А как я буду сканировать? Можно конечно считать перепады с + на - после АЦП, после перепада определять время,а потом подсчитать частоту. И если сигнал соответствует данной частоте то пропускать его. Но тут не совсем понятно как такой фильтр будет себя вести при подаче на вход суммы сигналов? И какой результат выдаст в таком случае АЦП.
S_Alex использовал по твоему совету разностное уравнение. Собрал фильтр на МК PIC16F877. в принципе работает нормально. вот только коэффициенты подбирал на угад. Уравнение получилось 9го порядка.
Aids Зачем же наугад. Есть четкая зависимость. Смотри УРЛ. Больше можешь узнать из Теории Автоматического Управления (ТАУ) раздел импульсных или цифровых систем. Если у тебя есть асимптотическая АЧХ обычного фильтра, то можно получить разностное уравнение и выполнить его реализацию.
Aids Непонял частота известна или нет? И что значит выделять? Определить ее присутствие или еще что-то? Делаешь Быстрое Преобразование Фурье (БПФ/FFT) после преобразования отсчетов имеем частотный спектр. Собственно пробигаешь по массиву частот. Если частота известна то достаточно сделать Фурье разложение по заданной частоте. Выгледит это просто Код (Text): N- число отсчетов A - буффер отсчетов f - частота которую проверяем в Гц d - частота дискретизации Гц f:=50; d:=44100 w:=-2*pi*f; w:=w/d; s:=0; c:=0; for i:=0 to N-1 do begin Re:=Re+a[i]*cos(w*i); Im:=Im+a[i]*sin(w*i); end; Amp:=Sqrt(Re*Re+Im*Im); Дальше проверяешь Amp на некоторый порог.
Pavia Как я понял, то необходимо выделить сигнал (т.е. выполнить фильтрацию сигнала), а не обнаружить сигнал заданной частоты. Или я не так понял?
S_Alex Это у автора темы надо спрашивать, что он хочет получить. Собственно если нужно отфильтровать одну частоту, то это делается очень просто так как амлитуды частоты мы знаем начальная фаза тоже известна arctan(Im/Re) То простое вычетание гармоники отфильтрует заданную частоту. Правда это не лучший из фильтеров.