des00 25 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба Добрый день! Потребовалось мне, для демодулятора, сделать децимацию сигнала в 3/4 раза. В связи с высокими тактовыми частотами проекта сделать это классически (upsample 3 -> filter -> downsample 4) проблематично. Решил попробовать сделать так. Взять 4 точки сигнала исходной частоты дискретизации, выкинуть одну точку (без каких либо интерполяторов (FIR/лагранж/сплайн)), перенести на частоту 3/4 от исходной. Говоря проще, поставить как бы "неправильно" работающий интерполятор. Казалось бы так делать нельзя, но в приложении сравнительная модель демодуляторов (точнее только с петлями восстановления тактовой частоты) построенных по классической и по предложенной схеме. Работают одинаково. Уважаемые гуру ЦОС, можно ли так делать? Вроде как все работает %) И небольшой вопрос : какую полосу сигнала на исходной частоте нужно офильтровать, что бы избежать "заворота" наводок/помех в спектр полезного сигнала на частоте дискретизации 3/4 от исходной? Помоим расчетам получается что такая фильтрация в принципе не нужна, т.к. искомая полоса находится за частотой найквиста исходной частоты дискретизации. Спасибо! qpsk_mod_demod_8sps_R14.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба Добрый день! Потребовалось мне, для демодулятора, сделать децимацию сигнала в 3/4 раза. В связи с высокими тактовыми частотами проекта сделать это классически (upsample 3 -> filter -> downsample 4) проблематично. Решил попробовать сделать так. Взять 4 точки сигнала исходной частоты дискретизации, выкинуть одну точку (без каких либо интерполяторов (FIR/лагранж/сплайн)), перенести на частоту 3/4 от исходной. Говоря проще, поставить как бы "неправильно" работающий интерполятор. Казалось бы так делать нельзя, но в приложении сравнительная модель демодуляторов (точнее только с петлями восстановления тактовой частоты) построенных по классической и по предложенной схеме. Работают одинаково. Уважаемые гуру ЦОС, можно ли так делать? Вроде как все работает %) И небольшой вопрос : какую полосу сигнала на исходной частоте нужно офильтровать, что бы избежать "заворота" наводок/помех в спектр полезного сигнала на частоте дискретизации 3/4 от исходной? Помоим расчетам получается что такая фильтрация в принципе не нужна, т.к. искомая полоса находится за частотой найквиста исходной частоты дискретизации. Спасибо! По второму вопросу: необходимо отфильтровывать все, что больше 3*Fd/8, тогда при децимации до 3/4 наложения спектров не будет. Их не будет и если не делать никакой фильтрации, но при условии что в исходном сигнале спектр уже ограничен до Fd/4. По первой части вопроса: что будет при такой децимации хз, думать надо, сейчас нет времени к сожалению:). Но вообще, вовсе не обязательно физически повышать частоту в 3 раза, ключевые слова: Vaidyanathan, полифазные фильтры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба По второму вопросу: необходимо отфильтровывать все, что больше 3*Fd/8, тогда при децимации до 3/4 наложения спектров не будет. Их не будет и если не делать никакой фильтрации, но при условии что в исходном сигнале спектр уже ограничен до Fd/4. хмм, надо погонять в симуляторе, есть у меня подозрения, что при используемом методе, не все так просто %) Но вообще, вовсе не обязательно физически повышать частоту в 3 раза, ключевые слова: Vaidyanathan, полифазные фильтры. помимо тактовой (192МГц) я еще и по ресурсам очень сильно ограничен %( есть у меня подозрения, что при используемом методе, не все так просто %) проверил на другой модели, при использумом методе наложения возникают из-за переноса спектра с исходной частоты дискретизации, при этом "зеркала" повляются на центральной частоте Fd(1-3/4). Самурай вы абсолютно правы %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба Б-сплайном на сумматорах с очень хорошей точностью делается, если пайплайн на десяток шагов не критичен. Писал несколько раз такое, работало и ресурсов мало потребляло - умножители совсем не требуются, а надо десятка два регистров и столько же сумматоров, каждые - на длину бит Вашей точности сигнала. В общем случае для любого интерполятора варианта под рукой нет, но если надо, за разумное время из своих старых загашников вытащу, а Вы мой стиль кода уже много раз видели, докрутим сообща. буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 3-м точкам ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба буду рад ознакомится, если мне память не изменяет Б сплайны это кубические по 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 остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 ноября, 2011 Опубликовано 3 ноября, 2011 · Жалоба остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу. спасибо большое, мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 3 ноября, 2011 Опубликовано 3 ноября, 2011 · Жалоба спасибо большое С радостью! мне можно вместо кода дать доку с описанием как рассчитывать коэффициенты базовых сплайнов, остальное дело техники %) У меня где-то софт был, самопально написанный как эти коэффициенты считать, но, что-то я никак не могу найти, а старые таблицы этим софтом нагенеренные, для 3/4 не подойдут. Если не найду, напишу доку, только как раз там-то и надо трехдиагональную матрицу решать и с коэффициентами ничего не напутать, поэтому дока не тривиально пишется :( а в и-нете я как-то не видел простого и понятного описания. На учебник тыкать - не правильно, можно и месяц потратить при разборке что да как. У нас в свое время семестровый курс был по этой теме, сам Шикин читал (в тот момент он был самым большим спецом в СССР в задачах сплайн аппроксимаций). Кстати, удобство этого метода - можно нагенерить все эти коэффициенты однажды хоть для Б-сплайнов 3-ей степени, хоть для 5-ой, хоть для 25-ой, только меняя эту таблицу можно все пересичтать не меняя верилог модуль, который я привел выше. Правда из своего опыта, больше 5-ой степени реально не за чем. Даже между 3-ей и 5-ой разницу ну очень сложно увидеть, я обычно, только 3-ю использую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 6 ноября, 2011 Опубликовано 6 ноября, 2011 · Жалоба Программу генерации коэффициентов не нашел, заново писать было лениво, вывел аналитически их формулы для Б-сплайнов 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 со сдвигами возможно, где-то намудрил, если найдете баг, пишите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 ноября, 2011 Опубликовано 7 ноября, 2011 · Жалоба спасибо, как доберусь до работы покопаюсь что к чему %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 7 ноября, 2011 Опубликовано 7 ноября, 2011 · Жалоба спасибо, как доберусь до работы покопаюсь что к чему %) В догонку, чтобы было проще разобраться что к чему, формула Б кубического сплайна на единичной равномерной сетке такая: нулевой сегмент (там где функция в 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, хоть любую другую децимацию можно подставить. Заодно по этим формулам проверять проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться