|
|
|
Как сдвинуть сигнал на 90 градусов? |
|
|
|
Dec 29 2004, 16:08
|
Участник
Группа: Свой
Сообщений: 50
Регистрация: 24-06-04
Пользователь №: 166
|
Всем привет.
Я недавно начал заниматься DSP и вот мне поставили задачу. Сделать систему которая сдвигает сигнал от 5 до 100 Гц на 90 градусов.
Дано: Частота самлинга ADC 47кГц. На входе известно что будет только одна частота (с шумом ессесно) от 5 до 100 Гц. Нужно сдвинуть эту частоту на 90 убрать шум и выдать в DAC. Таких каналов должно быть 220 штук. Алгоритм(ы) должен быть готов через два месяца, а реализация в железе к концу августа (прототип).
Как это сделать: 1. Использовать Хильберт преобразование. Но его можно реализовать или с хорошей амплитудной характеристикой либо с фазавой. Фазовая важней. Сделал up-sampling сигнала после ADC в 2 раза (потому как на 100 Гц сказывает групповая задержка). Но не добавлял 0, а дублирую значения. И прогоняю через фильтр. На выходе down-sampling в 2 раза. Из за up-sampling-а на выходе сигнал с высокочастотным шумом. Убирается довольно просто. Далее приходится корректировать аплитуду сигнала. Аплитуда линейно зависит от частоты. По этому делаю down-sampling в 20 раз выходного сигнала для FFT. FFT делается по 512 точкам. Нахожу частоту и получаю коэфициент на который нужно домножить выходной сигнал что бы уровнь равнялся входному. И еще приходится сдвигать выходной сигнал по уровню. На сколько дает первый коэффициент FFT. Все это написано на MatLab и вроде как работает. Что здесь не устраивает: требуется много памяти учитывая что 220 каналов.
2. Использовать интегратор. Ситуация в точности такая-же как и в первом случае. Или я что-то не так делаю. Но этот вопрос изучается.
3. Идеальным было бы генерировать самим синусоиду. Но тогда надо знать: частоту, амплитуду и фазу входного сигнала. Как это все узнать? FFT->частота. Найти фазу пока не получается (имеется ввиду простым способом). Можно конечно сделать как написал st256. Но реализация на первый взгляд кажется сложней чем в случае 1. Да и не получается почему-то. Иногда находит фазу правильно иногда нет. Или я не правильно реализовал алгоритм. Мне кажется проще прибавить cos(wt) к исходному сигналу и взять acos от результата. Это и даст фазу. Но я не волшебник я только учусь.
4. ?????
Буду благодарен любому совету куда грести Спасибо
|
|
|
|
|
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
|
|
|