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

Обман природы дробной децимации(+)

Добрый день!

 

Потребовалось мне, для демодулятора, сделать децимацию сигнала в 3/4 раза. В связи с высокими тактовыми частотами проекта сделать это классически (upsample 3 -> filter -> downsample 4) проблематично.

Решил попробовать сделать так. Взять 4 точки сигнала исходной частоты дискретизации, выкинуть одну точку (без каких либо интерполяторов (FIR/лагранж/сплайн)), перенести на частоту 3/4 от исходной. Говоря проще, поставить как бы "неправильно" работающий интерполятор. Казалось бы так делать нельзя, но в приложении сравнительная модель демодуляторов (точнее только с петлями восстановления тактовой частоты) построенных по классической и по предложенной схеме. Работают одинаково.

 

Уважаемые гуру ЦОС, можно ли так делать? Вроде как все работает %)

 

И небольшой вопрос : какую полосу сигнала на исходной частоте нужно офильтровать, что бы избежать "заворота" наводок/помех в спектр полезного сигнала на частоте дискретизации 3/4 от исходной? Помоим расчетам получается что такая фильтрация в принципе не нужна, т.к. искомая полоса находится за частотой найквиста исходной частоты дискретизации.

 

Спасибо!

qpsk_mod_demod_8sps_R14.zip

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


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

Добрый день!

 

Потребовалось мне, для демодулятора, сделать децимацию сигнала в 3/4 раза. В связи с высокими тактовыми частотами проекта сделать это классически (upsample 3 -> filter -> downsample 4) проблематично.

Решил попробовать сделать так. Взять 4 точки сигнала исходной частоты дискретизации, выкинуть одну точку (без каких либо интерполяторов (FIR/лагранж/сплайн)), перенести на частоту 3/4 от исходной. Говоря проще, поставить как бы "неправильно" работающий интерполятор. Казалось бы так делать нельзя, но в приложении сравнительная модель демодуляторов (точнее только с петлями восстановления тактовой частоты) построенных по классической и по предложенной схеме. Работают одинаково.

 

Уважаемые гуру ЦОС, можно ли так делать? Вроде как все работает %)

 

И небольшой вопрос : какую полосу сигнала на исходной частоте нужно офильтровать, что бы избежать "заворота" наводок/помех в спектр полезного сигнала на частоте дискретизации 3/4 от исходной? Помоим расчетам получается что такая фильтрация в принципе не нужна, т.к. искомая полоса находится за частотой найквиста исходной частоты дискретизации.

 

Спасибо!

 

По второму вопросу: необходимо отфильтровывать все, что больше 3*Fd/8, тогда при децимации до 3/4 наложения спектров не будет. Их не будет и если не делать никакой фильтрации, но при условии что в исходном сигнале спектр уже ограничен до Fd/4.

 

По первой части вопроса: что будет при такой децимации хз, думать надо, сейчас нет времени к сожалению:).

Но вообще, вовсе не обязательно физически повышать частоту в 3 раза, ключевые слова: Vaidyanathan, полифазные фильтры.

 

 

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


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

По второму вопросу: необходимо отфильтровывать все, что больше 3*Fd/8, тогда при децимации до 3/4 наложения спектров не будет. Их не будет и если не делать никакой фильтрации, но при условии что в исходном сигнале спектр уже ограничен до Fd/4.

хмм, надо погонять в симуляторе, есть у меня подозрения, что при используемом методе, не все так просто %)

Но вообще, вовсе не обязательно физически повышать частоту в 3 раза, ключевые слова: Vaidyanathan, полифазные фильтры.

помимо тактовой (192МГц) я еще и по ресурсам очень сильно ограничен %(

 

 

есть у меня подозрения, что при используемом методе, не все так просто %)

проверил на другой модели, при использумом методе наложения возникают из-за переноса спектра с исходной частоты дискретизации, при этом "зеркала" повляются на центральной частоте Fd(1-3/4).

 

Самурай вы абсолютно правы %)

 

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


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

Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща.

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


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

Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща.

буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 3-м точкам ?

 

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


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

буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 3-м точкам ?

Б-сплайны можно построить любого порядка, я брал кубические. Основная их идея в том, что если надо получить интерполяцию, не обязательно решать систему уравнений с трехдиагональной матрицей, а достаточно сложить насчитанные функции (так называемые Б-сплайны) со сдвигами. Каждая такая функция на регулярной сетке тождественно равна соседней со сдвигом шага сетки. Функция строится интерполяцией обычного сплайна через точки ...(-2t,0), (-t,0), (0,1), (t,0), (2t,0),... У этой функции есть очень хорошая особенность, она очень быстро убывает, поэтому уже 5-6 точек влево-вправо, и мы имеем около 20бит точности.

 

Пусть наш сигнал дан на сетке 0, t, 2t, 3t, ...

а для нашей 3/4 интерполяции нам необходимо посчитать этот сигнал в точках 0, 4t/3, 8t/3, 4t, ... то есть длостаточно учесть с каким весовым коэффициентом Б-сплайн от точки 0, входит в интерполяцию в точках 4t/3, 8t/3, (4+4/3)t, (4+8/3)t, (8+4/3)t, (8+8/3)t... дальше из-за точности думаю уже не надо смотреть, но, дополнительно, не забыть что эта точка также влияет на итерполяцию в точках -4t/3, -8t/3, -(4+4/3)t, -(4+8/3)t, -(8+4/3)t, -(8+8/3)t

 

При обработке сигнала в точках t, 2t и 3t сдвиги (и коэффициенты) будут другими, но их будет не больше. Итак нам надо нагенерить эти коэффициенты, сохнанить их в куда-то, и выдергивать набор из 12 таких коэффициентов каждый такт и умножать наше входное значение на 12 разных констант. Если формально это запрограммировать, Квартус попользует 12 умножителей. Но обратимся к значениям этих констант, они все меньше 1, их разумно представить как DATALEN бит, и проводить умножение, а результат тут же сдвигать на DATALEN. Так вот умножение одного числа на 10 таких констант можно расписать в виде пайплайна на sqrt(DATALEN) шагов так, что на каждом шаге мы используем деление на степень 2 и сложение и никаких умножений вообще. При хорошей тренировке Квартус многое сам додумывает и делает это за нас.

 

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

 

module BSplineInt4_3(Clk, In, Out, CoefP, CoefQ);
parameter COEFSIZE; // the lenght of CoefP/CoefQ arrays, should be odd, 10 is enough, usually it is about DATALEN/2
parameter DATALEN;  // accuracy of In, Out and CoefP/CoefQ
input                           Clk;
input  signed reg [DATALEN-1:0] CoefP[0:COEFSIZE-1][0:3]; // coefs at (i+1/3)*t
input  signed reg [DATALEN-1:0] CoefQ[0:COEFSIZE-1][0:3]; // coefs at (i+1/3)*t
input  signed reg [DATALEN-1:0] In;
output signed reg [DATALEN-1:0] Out[0:2]; // at each 1/4 clock it updates 3 entries that correspond to 3/4 interpolation
// Internal variables: 3*DATALEN*(COEFSIZE*3+2)/2+2
reg [1:0] Count;
signed reg [DATALEN-1:0] TP[0:COEFSIZE-1], RP[0:COEFSIZE-1];
signed reg [DATALEN-1:0] TQ[0:COEFSIZE-1], RQ[0:COEFSIZE-1];
signed reg [DATALEN-1:0] PL[0:COEFSIZE/2-1];
signed reg [DATALEN-1:0] PreOut[0:2]; // at each 1/4 clock it updates 3 entries that correspond to 3/4 interpolation

initial
begin
   Count<=0;
   for(int i=0; i<COEFSIZE; i++)
   begin
     RP[i]<=0;
     RQ[i]<=0;
     TP[i]<=0;
     TQ[i]<=0;
   end
   for(int i=0; i<COEFSIZE/2; i++)
     PL[i]<=0;
end


always @(posedge Clk)
begin
   for(int i=1; i<COEFSIZE; i++)
   begin
     TP[i]<=(CoefP[i][Count]*DataIn)>>>DATALEN;
     TQ[i]<=(CoefQ[i][Count]*DataIn)>>>DATALEN;
     if(Count==0)
     begin
       RP[i]<=RP[i-1]+TP[i-1];
       RQ[i]<=RQ[i-1]+TQ[i-1];
     end
     else
     begin
       RP[i]<=RP[i]+TP[i];
       RQ[i]<=RQ[i]+TQ[i];
     end
   end
   if(Count==0)
   begin
     PL[0]<=DataIn;
     for(int i=1; i<COEFSIZE/2; i++)
       PL[i]<=PL[i-1];
     DataOut<={PL[COEFSIZE/2-1], RP[COEFSIZE-1], RQ[COEFSIZE-1]};
   end
end
endmodule

 

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

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


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

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

спасибо большое, мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %)

 

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


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

спасибо большое

С радостью!

 

мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %)

 

У меня где-то софт был, самопально написанный как эти коэффициенты считать, но, что-то я никак не могу найти, а старые таблицы этим софтом нагенеренные, для 3/4 не подойдут. Если не найду, напишу доку, только как раз там-то и надо трехдиагональную матрицу решать и с коэффициентами ничего не напутать, поэтому дока не тривиально пишется :( а в и-нете я как-то не видел простого и понятного описания. На учебник тыкать - не правильно, можно и месяц потратить при разборке что да как. У нас в свое время семестровый курс был по этой теме, сам Шикин читал (в тот момент он был самым большим спецом в СССР в задачах сплайн аппроксимаций).

 

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

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


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

Программу генерации коэффициентов не нашел, заново писать было лениво, вывел аналитически их формулы для Б-сплайнов 3-ей степени.

 

CoefP[COEFSIZE/2+0][0]=2/27*(10+sqrt(3)),

CoefQ[COEFSIZE/2+0][0]=1/27*(7+4*sqrt(3)),

 

j=0,..3,

i=0,... не включая i=j=0

 

CoefP[COEFSIZE/2+i][j]=-2/27*(5+2*sqrt(3))*(2-sqrt(3))^(i*4+j),

CoefQ[COEFSIZE/2+i][j]=-2/27*(4+sqrt(3))*(2-sqrt(3))^(i*4+j),

 

Коэффициенты COEFSIZE/2-i-1 и COEFSIZE/2-i симметричны.

 

Всех их надо домножить на 2^DATALEN и взять целое.

 

Как видно из формул, i>1 нужны только если точность оцифровки не менее 16 бит, а i>0 нужны только если точность оцифровщика не меньше 8 бит.

 

Вывод формул не готов писать, на бумаге примерно листов 5 получилось только формул :( Ход доказательства - записываем обычный сплайн для Б-сплайна, получаем трехдиагональную матрицу с бесконечно большим размером, считаем для нее разложение Холецкого в пределе, подставляем правую часть, получаем рекурентные формулы для сплайна, подставляем 1/3 и 2/3, получаем коэффициенты.

 

PS со сдвигами возможно, где-то намудрил, если найдете баг, пишите

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


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

спасибо, как доберусь до работы покопаюсь что к чему %)

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


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

спасибо, как доберусь до работы покопаюсь что к чему %)

В догонку, чтобы было проще разобраться что к чему, формула Б кубического сплайна на единичной равномерной сетке такая:

 

нулевой сегмент (там где функция в f(0)=1, f(1)=0)

 

f_0(x)=x*x*((2-sqrt(3))*x+sqrt(3)-3)+1, 0<x<1,

 

все последующие, сдвинутые так, чтобы 0<x<1 и f(0)=f(1)=0

 

f_i(x)=x*(x-1)*((1-sqrt(3))*x+1)*(2-sqrt(3))^{i-1} где i - номер сегмента,

 

то есть в эти формулы хоть 4/3, хоть любую другую децимацию можно подставить. Заодно по этим формулам проверять проще.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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