|
|
 |
Ответов
(1 - 11)
|
Dec 30 2004, 11:17
|
Участник

Группа: Свой
Сообщений: 50
Регистрация: 24-06-04
Пользователь №: 166

|
Частота входного сигнала не меняется (если имеется ввиду это). Но я не совсем понял идею. От входного сигнала делаю FFT и тем самым нахожу частоту входного сигнала приблизетельно. Ошибка примерно 3-5 Гц, но это я знаю и могу учесть. Дальше меняются параметры двух полосовых фильтров в зависимости от частоты, которую получил от FFT. Прогоняю входной сигнал через эти два фильтра и получаю два сигнала, над которыми к примеру делаю сложение что бы получить разнизу фаз (или что то еще). " по разнице фаз отфильтрованных сигналов можем опрпделить отклонение частоты от эталона и по этим данным перестраиваем фильтры." это я не понял, какие фильтры? И в чем суть алгоритма?
Спасибо за ответ.
|
|
|
|
|
Dec 31 2004, 10:23
|
Administrator
  
Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1

|
eteP немного поразмыслив, придумал более простой и точный алгоритм.
Параметры (а точнее, частота настройки) двух полосовых фильтров подстраиваются в зависимости от разницы фаз гармонических колебаний, полученных на выходе этих фильтров в предыдущей итерации (полосовой фильтр сдвигает фазу гармонического сигнала на функцию, зависещую от отношения разницы частот фильтра и подаваемой на него частоты к полосе пропускания фильтра). Это даёт нам возможность по разности фаз этих полосовых фильтров определить отклонение частоты входного сигнала от средней частоты этих фильтров. Фильтры настраиваем на частоту сигнала, а полосы пропускания делаем различающимися в 2 раза. Соответственно, более узкий фильтр будет менять фазу в 2 раза больше широкого. По разнице показаний мгновенных значений фаз сигналов на выходе этих фильтров корректируем среднюю частоту фильтров.
Если на пальцах, то алгоритм такой: 1. Берем выборку для FFT такого размера, чтобы получить частоту с точностью 3 Гц и назовём её Фц. 2. Инициализируем параметры фильтров: полоса пропускания фильтров - 10 и 20 Гц. Оба фильтра настроены на частоту Фц. 3. Подаем входной сигнал на фильтры в течение 100 мсек. 4. Вычисляем мгновенное значение фазы сигнала на выходе первого и второго фильтра, вычисляем их разность (в градусах).
5. Перестраиваем фильтры на частоту, равную разности в градусах, умноженной на коэффициент, скажем, 0.001 6. Переходим на шаг 3
|
|
|
|
|
Jan 1 2005, 03:22
|
Участник

Группа: Новичок
Сообщений: 35
Регистрация: 13-12-04
Пользователь №: 1 472

|
А почему нельзя просто продифференцировать? Будет 90 градусов автоматом на любой частоте.
|
|
|
|
|
Jan 3 2005, 21:15
|
Участник

Группа: Свой
Сообщений: 50
Регистрация: 24-06-04
Пользователь №: 166

|
Спасибо за ответы и советы. Всех с новым годом!! To 3.14 Цитата Это, а тупоей буфер (фифо) почему нельзя, вернее Вам вмднее. Ну когда, весь период заведомо известной частоты дискретезируете с чрезмерной дискретизацией, а потом выдаете на нужную задержку (фазу). Можно сделать и так. И это была первая мысль. Но что делать с шумом? Ставить фильтр, вот вам и фаза поехала. Наверно так и придется делать. Ставить полосовой фильтр 5-100 Гц. Для этого выкинуть часть данный. А то порядок фильтра за 4000 зашкаливает (FIR). Зная фазываю характеристику уже самим корректировать длину фифо. Опять же без FFT ни куда. Или еще вариант, вместо FFT, попробывать создать всепропоскающий фильтр, но с хитрой фазовой характеристикой, (FIR -> AllPassFilter -> 90 градусов) ,что бы на выходе получился сдвиг на 90 градусов. Скоро у меня самого фаза съедит. To jeka Цитата Параметры (а точнее, частота настройки) двух полосовых фильтров подстраиваются в зависимости ...... Что то я не догоняю мысль. Это все для того что бы узнать точно частоту? Или за этим еще что-то скрывается? Я пробую реализовать этот алгоритм, самим интрестно посмотреть в живую как это выглядит, но вот это " Инициализируем параметры фильтров." и "Перестраиваем фильтры на частоту." это как? Как это можно сделать на лету и где про это почитать.
|
|
|
|
|
Jan 3 2005, 21:47
|
Administrator
  
Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1

|
eteP это всё чтоб подстраиваться под фазу сигнала во времени с наименьшими затратами ресурсов процессора
Как сделать цифровой полосовой фильтр, думаю много литературы есть. На нижеприведенном примере, думаю, понятно будет как реализовать программно полосовой фильтр
Допустим, x - энергия конденсатора, а y - энергия индуктивности. Упрощенная модель колебательного контура выглядит так:
x=0 - Инициализационная энергия кондёра y=100 - Инициализационная энергия индкутивности
n=4 - этим параметром задается частота настройки фильтра d=0.99 - этим параметром задается добротность (потери) фильтра
while true { x=(x+y/n)*d y=(y-x/n)*d }
Если этот алгоритм прокрутить, будет видно что x и y будут выглядеть как затухающие синусы.
Для ввода сигнала в контур, просто прибавляем, скажем, к x значение сигнала. Главное следить за переполнениями, особенно при высокой добротности фильтра.
Этого примера должно хватить для создания необходимого цифрового полосового фильтра.
|
|
|
|
|
Jan 5 2005, 14:47
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
to jeka Интересный подход! Я тут примерчик в MatLab для игр прикрутил. Жалко файлом прикрепить нельзя  clear; Wup=1000; t=1; %интервал определяющий Fпр=1/t по уровню 0.5 d=1.00; %потери в фильтре n=1; %коэф. частоты Fs=Wup*2;% частота дискретизации t=0:1/Fs:t;% временная ось %w=100; %ws=sin(2*pi*w*t); %wc=cos(2*pi*w*t); j=1; for wsm=1:1:Wup, x1=0; y1=1; x=sin(2*pi*wsm*t); xxc=cos(2*pi*wsm*t); xxs=x; for i=1:length(t), x1=x1+x(i); x1=(x1+y1/n)*d; y1=(y1-x1/n)*d; yf(i)=y1; end %xs=sum(x.*ws); %xc=sum(x.*wc); xs=sum(yf.*xxs); xc=sum(yf.*xxc); A(j)=sqrt(xs*xs + xc*xc); j=j+1; end maxA=max(A(  ); plot(20*log(A/maxA)) grid on;
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|