Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тактовая синхронизация (ресамплинг)
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
bigo
Здраствуйте. Помогите разобраться с проблемой. Хочу использовать ресамплер в демодуляторе для подстройке по тактам. Ресамплер хочу реализовать на базе модифицированного фильтра Фарроу 3-го порядка. В схеме ресамплер стоит после КП (комплексного перемножителя) и ФНЧ. Соответственно ФД в ФАПЧ вычисляет ошибку по ресемплированным отсчётам. Реализацию ресамплера взял с http://electronix.ru/forum/index.php?showt...=73192&st=0
Теперь сама проблема.
Есть:
K=700 000; количество отсчётов
Fs0 = 294600 Гц;
Fs1 = 292000 Гц;
Ресамплер работает с массивом y0[i], который заполняется отсчётами после прохождения КП и ФНЧ.
Теперь если, например, при перерасчёте индекса исходного сигнала (взято из вышеуказанного форума - " int j = int((double)i*Fs0/Fs1)-2;") скажем 100 000-го получается j= 100 000*294600/292000 =100 890. Теперь получается что при расчёте коефициентов а3,а1,а2 нужны отсчёты которые находятся в массиве за адресом "y1[i] = farrow3(y0+j, x); // фильтр Фарроу" y0+100 890, а там соответственно на 100 000 отсчёте ещё нули :-( .

Вышеуказанный код проверял отдельно при полностью заполненном массиве, всё работает. А как сделать в моём случае, по отсчётно не знаю, потому прошу Вашей помощи в решении этой проблемы. Заранее спасибо.
bahurin
что-то вы по-моему напутали. Давайте попробуем разобраться.

Fs0 = 294600 Гц; - исходная частота дискретизации
Fs1 = 292000 Гц; - частота дискретизации после ресамплинга

int j = int((double)i*Fs0/Fs1)-2 - индекс отсчета исходного сигнала, соотвествующий i-му отсчету сигнала после ресэмплинга

y1[i] = farrow3(y0+j, x) - это уже рассчитанный отсчет.

Теперь важно! несмотря на то что индекс отсчета исходного сигнала j = 100 890 для i = 100 000 -го отсчета после ресэмплинга, вроде бы больше, но частота дискретизации этого j - го отсчета выше чем частота дискретизации i -го отсчета, поэтому во времени 100 890-ый отсчет при Fs0 = 294600 будет чуть раньше чем 100 000 -й отсчет при частоте дискретизации Fs1 = 292000.

ЗЫ если я вас окончательно запутал, то идите к первоисточнику этого кода, а именно сюда

там вы можете задать все интересующие вопросы.
bigo
Буду очень благодарен Вам за помощь bahurin
Возможно проблема в не правильном переводе с С++ на Delphi rolleyes.gif '
Вот код:
begin
for n:=0 to K-1 do
begin
t1[n]:=n/Fs1;
j:=(Round(n*Fs0/Fs1))-2;
if j<0 then j:=0;
x:=(((t1[n]-t0[j])*Fs0-2));
a3:=(y0[j+3]-y0[j])/6.0 +(y0[j+1]-y0[j+2])/2.0;
a1:=(y0[j+3]-y0[j+1])/2.0-a3;
a2:=y0[j+3]-a3-a1-y0[j+2];

y1:=x*(x*(x*a3+a2)+a1)+y0[j+2];
form1.Series3.AddXY(n,y1, '', clGreen);
end;

Я просто в С++ полный 0 :-)
bigo
Подскажите почему у меня получается после ресампллинга при сигнале с модуляцией QPSK и новой частотой дискретизации равной символьной скорости получается 8 точек, и при частоте дискретизации равной удвоенной символьной скорости, при выводе на векторном анализаторе только вторых отсчётов также получается 8 точек но более размазанные, не могу понять. Ещё вопрос к чему нужно приплюсовывать значение ошибки. Я его приплюсовываю к рассчитанному значению "Х". x:=(((t1[n]-t0[j])*Fs0-2))+ ErrT;, где ErrT - это и есть ошибка по фазе тактов
svalery
Цитата(bigo @ Mar 19 2010, 23:15) *
Подскажите почему у меня получается после ресампллинга при сигнале с модуляцией QPSK и новой частотой дискретизации равной символьной скорости получается 8 точек


При взятии из сигнала выборок с символьной скоростью учитывается символьная синхронихация ?
bigo
Вот тут я и не уверен, так как толком не знаю к чему нужно приплюсовывать ошибку, но мне кажется что ТС не работает, так, как я что приплюсовываю что не приплюсовываю эту ошибку к "X", эффект нулевой
bigo
Всё разобрался с єтими точками, ошибка была в ГУН. Подскажите куда нужно прибавлять ошибку по времени в ресамплере
svalery
Цитата(bigo @ Mar 24 2010, 20:20) *
Всё разобрался с єтими точками, ошибка была в ГУН. Подскажите куда нужно прибавлять ошибку по времени в ресамплере

bigo
Это получает так - x:=(((t1[n]-t0[j])*Fs0-2))+ErrT;, где ErrT - это и есть временная ошибка, так будет правильно ?
svalery
Цитата(bigo @ Mar 25 2010, 21:30) *
Это получает так - x:=(((t1[n]-t0[j])*Fs0-2))+ErrT;, где ErrT - это и есть временная ошибка, так будет правильно ?


имхо не лучший способ разбираться с такими вещами начиная с кода, вот м-скрипт примерно того что у вас, если я правильно понял, что вам нужно
Код
clc;
clear;

N = 1; % кол-во периодов синуса
spp = 20; % кол-во семплов на период
ii = 1:spp*N;

y0 = sin((ii/spp)*2*pi);

plot(y0,'--*');

x = -0.3; % ошибка по времени, изменяется в пределах [-1...0]

for jj=1:length(ii)-3
    a3 = (y0(jj+3)-y0(jj))/6.0 +(y0(jj+1)-y0(jj+2))/2.0;
    a1 = (y0(jj+3)-y0(jj+1))/2.0-a3;
    a2 = y0(jj+3)-a3-a1-y0(jj+2);
    y1(jj) = x*(x*(x*a3+a2)+a1)+y0(jj+2);
end;

figure;
plot(y1,'--*');


При изменении x (на рисунке mu), на 2й картинке будет видно как выборка "плывёт" по синусу относительно выборок синуса 1й картинки
bigo
Спасибо, поиграюсь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.