Перейти к содержанию
    

Как сдвинуть сигнал на 90 градусов?

Всем привет.

 

Я недавно начал заниматься 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. ?????

 

Буду благодарен любому совету куда грести

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уточни, как меняются параметры входного синуса во времени (какой характер и скорость изменения)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота входного сигнала не меняется (если имеется ввиду это).

Но я не совсем понял идею.

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

" по разнице фаз отфильтрованных сигналов можем опрпделить отклонение частоты от эталона и по этим данным перестраиваем фильтры." это я не понял, какие фильтры? И в чем суть алгоритма?

 

Спасибо за ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это, а тупоей буфер (фифо) почему нельзя, вернее Вам вмднее.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

eteP

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

 

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

 

Если на пальцах, то алгоритм такой:

1. Берем выборку для FFT такого размера, чтобы получить частоту с точностью 3 Гц и назовём её Фц.

2. Инициализируем параметры фильтров: полоса пропускания фильтров - 10 и 20 Гц. Оба фильтра настроены на частоту Фц.

3. Подаем входной сигнал на фильтры в течение 100 мсек.

4. Вычисляем мгновенное значение фазы сигнала на выходе первого и второго фильтра, вычисляем их разность (в градусах).

 

5. Перестраиваем фильтры на частоту, равную разности в градусах, умноженной на коэффициент, скажем, 0.001

6. Переходим на шаг 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему нельзя просто продифференцировать? Будет 90 градусов автоматом на любой частоте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы и советы.

Всех с новым годом!!

 

 

To 3.14

 

Это, а тупоей буфер (фифо) почему нельзя, вернее Вам вмднее.

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

 

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

Ставить фильтр, вот вам и фаза поехала.

 

Наверно так и придется делать.

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

 

To jeka

 

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

 

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

 

Я пробую реализовать этот алгоритм, самим интрестно посмотреть в живую как это выглядит, но вот это " Инициализируем параметры фильтров." и "Перестраиваем фильтры на частоту." это как? Как это можно сделать на лету и где про это почитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Этого примера должно хватить для создания необходимого цифрового полосового фильтра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понял из объяснения то нужно сделать программно реализацию allpass filter (фаза изменяется, амплитуда постоянна) или иначе group-delay equaliser (коррекция группового времени запаздывания). Полюс переходной функции аннулируется нулём, (Реальные части равны, но противоположны по знаку). Ноль в правой части для соблюдения условий Гурвица в плане стабильности :) Просто и со вкусом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько представляется, сдвиг на 90 градусов эквивалентен умножению

на +/- i в частотной области, что для спектра сигнала - просто обмен вещественной и мнимой частей ( с точностью до знака ). Фильтр также можно наложить в частотной области. Неплохо при этом не забыть о симметрии спектра вещественного сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...