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

 
 
> Как сдвинуть сигнал на 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
 
Start new topic
Ответов
jeka
сообщение Jan 3 2005, 21:47
Сообщение #2


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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:26
Рейтинг@Mail.ru


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