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

 
 
> Обман природы дробной децимации(+), децимация 3/4
des00
сообщение Nov 2 2011, 04:47
Сообщение #1


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Добрый день!

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

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

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

Спасибо!
Прикрепленные файлы
Прикрепленный файл  qpsk_mod_demod_8sps_R14.zip ( 26.25 килобайт ) Кол-во скачиваний: 28
 


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
iiv
сообщение Nov 2 2011, 12:40
Сообщение #2


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща.
Go to the top of the page
 
+Quote Post
des00
сообщение Nov 2 2011, 16:55
Сообщение #3


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(iiv @ Nov 2 2011, 06:40) *
Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща.

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


--------------------
Go to the top of the page
 
+Quote Post
iiv
сообщение Nov 2 2011, 21:04
Сообщение #4


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(des00 @ Nov 2 2011, 21:55) *
буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 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


остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу.
Go to the top of the page
 
+Quote Post
des00
сообщение Nov 3 2011, 14:41
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(iiv @ Nov 2 2011, 15:04) *
остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу.

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


--------------------
Go to the top of the page
 
+Quote Post
iiv
сообщение Nov 3 2011, 15:02
Сообщение #6


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(des00 @ Nov 3 2011, 19:41) *
спасибо большое

С радостью!

Цитата(des00 @ Nov 3 2011, 19:41) *
мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %)


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

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



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

 


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


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