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

 
 
> Как сдвинуть сигнал на 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
Ответов
3.14
сообщение Jan 5 2005, 14:47
Сообщение #2


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

Группа: СуперМодераторы
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:28
Рейтинг@Mail.ru


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