参考一下这个程序
#include<stdio.h>#include<math.h>#define pi 3.14159265main(){ int i; double sinc t; for(i = -5000; i<= 5000; i++) //因为t=i/500.0,所以t的取值范围为[-1010],但严格的说t的取值范围为[-100)U(010] { if(i == 0) continue; t = i / 500.0; //一个单位内取500个样本点 sinc = sin(pi*t) / (pi*t); printf("%e\t%e\n" t sinc); }}
一个简单的实现是
double sinc(double i) { return i?sin(3.1415926535*i)/(3.1415926535*i):1; }
double sinc_interpolate(double x[]int sizedouble d) { int i; double sum=0; for(i=0;i<size;i++) sum+=x[i]*sinc(d-i); return sum; }
代码有
// sinc3 filter module sinc3 ( input DataIn input rst input clk output reg [24:0] DataOut ); parameter Dec = 9'd256; reg [24:0] sigma1; reg [24:0] sigma2; reg [24:0] sigma3; reg [24:0] delta1; reg [24:0] delta2; reg [24:0] sigma3_Dec; wire [24:0] sigma1_temp; wire [24:0] sigma2_temp; wire [24:0] sigma3_temp; wire [24:0] delta1_temp; wire [24:0] delta2_temp; wire [24:0] delta3_temp; reg [8:0] count; assign sigma1_temp=sigma1+DataIn; assign sigma2_temp=sigma2+sigma1_temp; assign sigma3_temp=sigma3+sigma2_temp; assign delta1_temp=sigma3_temp-sigma3_Dec; assign delta2_temp=delta1_temp-delta1; assign delta3_temp=delta2_temp-delta2; always@(posedge clk or negedge rst) begin if (rst==1'b0) begin sigma1<=0; sigma2<=0; sigma3<=0; delta1<=0; delta2<=0; sigma3_Dec<=0; count<=0; DataOut<=0; end else begin if (count==Dec-1) begin count<=0; sigma3_Dec<=sigma3_temp; delta1 <=delta1_temp; delta2 <=delta2_temp; DataOut <=delta3_temp; end else begin count<=count+1; end sigma1<=sigma1_temp; sigma2<=sigma2_temp; sigma3<=sigma3_temp; end end endmodule