реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как сдвинуть сигнал на 90 градусов?
eteP
сообщение Dec 29 2004, 16:08
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 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. ?????

Буду благодарен любому совету куда грести
Спасибо
Go to the top of the page
 
+Quote Post
jeka
сообщение Dec 29 2004, 22:17
Сообщение #2


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Уточни, как меняются параметры входного синуса во времени (какой характер и скорость изменения)
если сигнал изменяется медленно, то возможен такой варикнт: при инициализации определяем частоту сигнала (эталон), далее пропускаем сигнал через 2 полосовых фильтра, один настроен немного ниже эталона, другой немного выше. по разнице фаз отфильтрованных сигналов можем опрпделить отклонение частоты от эталона и по этим данным перестраиваем фильтры. преимущество в том что этот алгоритм требует вычислительной мощности только при захвате частоты.
Go to the top of the page
 
+Quote Post
eteP
сообщение Dec 30 2004, 11:17
Сообщение #3


Участник
*

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



Частота входного сигнала не меняется (если имеется ввиду это).
Но я не совсем понял идею.
От входного сигнала делаю FFT и тем самым нахожу частоту входного сигнала приблизетельно. Ошибка примерно 3-5 Гц, но это я знаю и могу учесть. Дальше меняются параметры двух полосовых фильтров в зависимости от частоты, которую получил от FFT. Прогоняю входной сигнал через эти два фильтра и получаю два сигнала, над которыми к примеру делаю сложение что бы получить разнизу фаз (или что то еще).
" по разнице фаз отфильтрованных сигналов можем опрпделить отклонение частоты от эталона и по этим данным перестраиваем фильтры." это я не понял, какие фильтры? И в чем суть алгоритма?

Спасибо за ответ.
Go to the top of the page
 
+Quote Post
3.14
сообщение Dec 30 2004, 23:03
Сообщение #4


Их либе дих ...
******

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



Это, а тупоей буфер (фифо) почему нельзя, вернее Вам вмднее.
Ну когда, весь период заведомо известной частоты дискретезируете с чрезмерной дискретизацией, а потом выдаете на нужную задержку (фазу).


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
jeka
сообщение Dec 31 2004, 10:23
Сообщение #5


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



eteP
немного поразмыслив, придумал более простой и точный алгоритм.

Параметры (а точнее, частота настройки) двух полосовых фильтров подстраиваются в зависимости от разницы фаз гармонических колебаний, полученных на выходе этих фильтров в предыдущей итерации (полосовой фильтр сдвигает фазу гармонического сигнала на функцию, зависещую от отношения разницы частот фильтра и подаваемой на него частоты к полосе пропускания фильтра). Это даёт нам возможность по разности фаз этих полосовых фильтров определить отклонение частоты входного сигнала от средней частоты этих фильтров. Фильтры настраиваем на частоту сигнала, а полосы пропускания делаем различающимися в 2 раза. Соответственно, более узкий фильтр будет менять фазу в 2 раза больше широкого. По разнице показаний мгновенных значений фаз сигналов на выходе этих фильтров корректируем среднюю частоту фильтров.

Если на пальцах, то алгоритм такой:
1. Берем выборку для FFT такого размера, чтобы получить частоту с точностью 3 Гц и назовём её Фц.
2. Инициализируем параметры фильтров: полоса пропускания фильтров - 10 и 20 Гц. Оба фильтра настроены на частоту Фц.
3. Подаем входной сигнал на фильтры в течение 100 мсек.
4. Вычисляем мгновенное значение фазы сигнала на выходе первого и второго фильтра, вычисляем их разность (в градусах).

5. Перестраиваем фильтры на частоту, равную разности в градусах, умноженной на коэффициент, скажем, 0.001
6. Переходим на шаг 3
Go to the top of the page
 
+Quote Post
lummox
сообщение Jan 1 2005, 03:22
Сообщение #6


Участник
*

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



А почему нельзя просто продифференцировать? Будет 90 градусов автоматом на любой частоте.
Go to the top of the page
 
+Quote Post
jeka
сообщение Jan 1 2005, 08:25
Сообщение #7


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



можно. но амплитуда будет изменяться пропорционально частоте
Go to the top of the page
 
+Quote Post
eteP
сообщение Jan 3 2005, 21:15
Сообщение #8


Участник
*

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



Спасибо за ответы и советы.
Всех с новым годом!!


To 3.14

Цитата
Это, а тупоей буфер (фифо) почему нельзя, вернее Вам вмднее.
Ну когда, весь период заведомо известной частоты дискретезируете с чрезмерной дискретизацией, а потом выдаете на нужную задержку (фазу).


Можно сделать и так. И это была первая мысль. Но что делать с шумом?
Ставить фильтр, вот вам и фаза поехала.

Наверно так и придется делать.
Ставить полосовой фильтр 5-100 Гц. Для этого выкинуть часть данный. А то порядок фильтра за 4000 зашкаливает (FIR). Зная фазываю характеристику уже самим корректировать длину фифо. Опять же без FFT ни куда. Или еще вариант, вместо FFT, попробывать создать всепропоскающий фильтр, но с хитрой фазовой характеристикой, (FIR -> AllPassFilter -> 90 градусов) ,что бы на выходе получился сдвиг на 90 градусов. Скоро у меня самого фаза съедит.

To jeka

Цитата
Параметры (а точнее, частота настройки) двух полосовых фильтров подстраиваются в зависимости ......


Что то я не догоняю мысль. Это все для того что бы узнать точно частоту? Или за этим еще что-то скрывается?

Я пробую реализовать этот алгоритм, самим интрестно посмотреть в живую как это выглядит, но вот это " Инициализируем параметры фильтров." и "Перестраиваем фильтры на частоту." это как? Как это можно сделать на лету и где про это почитать.
Go to the top of the page
 
+Quote Post
jeka
сообщение Jan 3 2005, 21:47
Сообщение #9


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 значение сигнала. Главное следить за переполнениями, особенно при высокой добротности фильтра.

Этого примера должно хватить для создания необходимого цифрового полосового фильтра.
Go to the top of the page
 
+Quote Post
3.14
сообщение Jan 5 2005, 14:47
Сообщение #10


Их либе дих ...
******

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



to jeka
Интересный подход!
Я тут примерчик в MatLab для игр прикрутил. Жалко файлом прикрепить нельзя sad.gif


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(smile.gif);
plot(20*log(A/maxA))
grid on;


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
monya
сообщение Mar 26 2005, 16:12
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 25-03-05
Из: Edinburgh,UK
Пользователь №: 3 683



Насколько я понял из объяснения то нужно сделать программно реализацию allpass filter (фаза изменяется, амплитуда постоянна) или иначе group-delay equaliser (коррекция группового времени запаздывания). Полюс переходной функции аннулируется нулём, (Реальные части равны, но противоположны по знаку). Ноль в правой части для соблюдения условий Гурвица в плане стабильности smile.gif Просто и со вкусом.
Go to the top of the page
 
+Quote Post
bve
сообщение Mar 26 2005, 16:24
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Насколько представляется, сдвиг на 90 градусов эквивалентен умножению
на +/- i в частотной области, что для спектра сигнала - просто обмен вещественной и мнимой частей ( с точностью до знака ). Фильтр также можно наложить в частотной области. Неплохо при этом не забыть о симметрии спектра вещественного сигнала.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th April 2024 - 03:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.02032 секунд с 7
ELECTRONIX ©2004-2016