我需要在软件中实现两个版本的算法,一个是浮点格式的算法,另一个是定点格式的算法。现在我认为,如果我只是使用浮点变量来实现函数,那么算法将使用浮点:
算法应该按照规范工作
在新样本x*k*到达之前,旧样本被转移到
然后每个样本在
计算结果y*k*,即所有标度样本的总和
float[] FIRfloats = {0,0,0,0,0};
void floatFIR(float newsample)
{
for(int i=0;i<5;i++)
{
FIRfloats[i+1]=FIRfloats[i]; /* shift the samples right */
}
FIRfloats[0]=newsample*0:0299;
FIRfloats[1]=FIRfloats[2]*0.4701;
FIRfloats[2]=FIRfloats[3]*0.4701;
FIRfloats[3]=FIRfloats[4]*0.0299;
}
然后我对样本求和得到浮点格式那么这是fir滤波器的软件实现吗?我该怎么做定点版本呢?
最佳答案
不,您不是将样本保存在firfloats中,而是将样本保存为乘以系数。只需将样本保存在数组中。用这些系数计算乘积并将其保存在临时变量中,然后求和得到滤波器的输出值。
将此转换为定点并做好它,超出了此处所包含内容的范围基本上,你需要把所有系数乘以某个比例因子,比如2^16(65536),然后四舍五入到最接近的整数。传入的样本还应乘以比例因子并转换为整数对样本和系数进行整数乘法运算,然后对乘积进行整数加法运算。结果将有一个比例因子,它是系数和输入样本的比例因子的乘积。如果不知道如何处理过滤器输出,很难说之后会发生什么。
但你在问题中提到了另一个问题。如果这是为了在一个fpga中实现,你不应该使用verilog或vhdl吗?