Цитата(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
остатки наприсую, но не сейчас, немного завал на работе, надеюсь, на выходных смогу.