|
Обман природы дробной децимации(+), децимация 3/4 |
|
|
|
Nov 2 2011, 04:47
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Добрый день! Потребовалось мне, для демодулятора, сделать децимацию сигнала в 3/4 раза. В связи с высокими тактовыми частотами проекта сделать это классически (upsample 3 -> filter -> downsample 4) проблематично. Решил попробовать сделать так. Взять 4 точки сигнала исходной частоты дискретизации, выкинуть одну точку (без каких либо интерполяторов (FIR/лагранж/сплайн)), перенести на частоту 3/4 от исходной. Говоря проще, поставить как бы "неправильно" работающий интерполятор. Казалось бы так делать нельзя, но в приложении сравнительная модель демодуляторов (точнее только с петлями восстановления тактовой частоты) построенных по классической и по предложенной схеме. Работают одинаково. Уважаемые гуру ЦОС, можно ли так делать? Вроде как все работает %) И небольшой вопрос : какую полосу сигнала на исходной частоте нужно офильтровать, что бы избежать "заворота" наводок/помех в спектр полезного сигнала на частоте дискретизации 3/4 от исходной? Помоим расчетам получается что такая фильтрация в принципе не нужна, т.к. искомая полоса находится за частотой найквиста исходной частоты дискретизации. Спасибо!
--------------------
|
|
|
|
|
 |
Ответов
|
Nov 2 2011, 16:55
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(iiv @ Nov 2 2011, 06:40)  Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща. буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 3-м точкам ?
--------------------
|
|
|
|
|
Nov 2 2011, 21:04
|
вопрошающий
    
Группа: Свой
Сообщений: 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 остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу.
|
|
|
|
|
Nov 3 2011, 15:02
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(des00 @ Nov 3 2011, 19:41)  спасибо большое С радостью! Цитата(des00 @ Nov 3 2011, 19:41)  мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %) У меня где-то софт был, самопально написанный как эти коэффициенты считать, но, что-то я никак не могу найти, а старые таблицы этим софтом нагенеренные, для 3/4 не подойдут. Если не найду, напишу доку, только как раз там-то и надо трехдиагональную матрицу решать и с коэффициентами ничего не напутать, поэтому дока не тривиально пишется  а в и-нете я как-то не видел простого и понятного описания. На учебник тыкать - не правильно, можно и месяц потратить при разборке что да как. У нас в свое время семестровый курс был по этой теме, сам Шикин читал (в тот момент он был самым большим спецом в СССР в задачах сплайн аппроксимаций). Кстати, удобство этого метода - можно нагенерить все эти коэффициенты однажды хоть для Б-сплайнов 3-ей степени, хоть для 5-ой, хоть для 25-ой, только меняя эту таблицу можно все пересичтать не меняя верилог модуль, который я привел выше. Правда из своего опыта, больше 5-ой степени реально не за чем. Даже между 3-ей и 5-ой разницу ну очень сложно увидеть, я обычно, только 3-ю использую.
|
|
|
|
Сообщений в этой теме
des00 Обман природы дробной децимации(+) Nov 2 2011, 04:47 Самурай Цитата(des00 @ Nov 2 2011, 07:47) Добрый ... Nov 2 2011, 05:33 des00 Цитата(Самурай @ Nov 1 2011, 23:33) По вт... Nov 2 2011, 06:12     iiv Программу генерации коэффициентов не нашел, заново... Nov 6 2011, 22:05 des00 спасибо, как доберусь до работы покопаюсь что к че... Nov 7 2011, 04:49 iiv Цитата(des00 @ Nov 7 2011, 10:49) спасибо... Nov 7 2011, 11:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|