计算方法
全精度输出宽度可以定义为输入数据宽度加上由滤波器系数导致的位增长数。
最坏情况下的位增长等于系数宽度加上所需非零乘法次数的以2为底的对数并四舍五入后的值。然而,这没有考虑实际系数值。计算公式如下。
B
=
C
W
+
ceil
[
log
2
N
]
B=C_{W}+\operatorname{ceil}\left[\log _{2} N\right]
B=CW+ceil[log2N]
其中,
B
B
B是计算出的位增长,
N
N
N是滤波器系数的数量,
C
W
C_W
CW是系数宽度。
考虑实际系数值后,固定系数滤波器的真正最大位增长,可由下式计算。
B
=
ceil
[
log
2
(
∑
n
=
0
(
N
−
1
)
∣
a
n
∣
)
]
B=\operatorname{ceil}\left[\log _{2}\left(\sum_{n=0}^{(N-1)}\left|a_{n}\right|\right)\right]
B=ceil
log2
n=0∑(N−1)∣an∣
其中,
N
N
N是滤波器系数的数量,
a
n
a_n
an是第
N
N
N个滤波器系数。
注意:FIR IP核可根据实际系数值自动计算位增长。对于可重载系数的滤波器,则使用最坏情况下的位增长计算方法。
如上所述,全精度输出宽度,根据下式计算。
A
W
=
D
W
+
B
A_W = D_W+B
AW=DW+B
其中,
B
B
B为计算出的位增长,
D
W
D_W
DW为数据宽度,
A
W
A_W
AW为全精度输出宽度。
滤波器系数(和输入数据)的小数宽度不影响输出宽度计算。核心决定输出宽度而不考虑小数位。
核心如前所述确定全精度输出,然后通过将数据和系数小数位宽相加来确定输出小数位宽,然后通过任何输出舍入来减少该值。则可由下式计算。
O
f
W
=
D
f
W
+
C
f
W
−
max
(
0
,
A
W
−
O
W
)
O_{fW}=D_{fW}+C_{fW}-\operatorname{max}\left( 0,A_W - O_W\right)
OfW=DfW+CfW−max(0,AW−OW)
其中,
O
W
O_W
OW为输出宽度,
O
f
W
O_{fW}
OfW为输出小数宽度,
D
f
W
D_{fW}
DfW为数据小数宽度,
C
f
W
C_{fW}
CfW为系数小数宽度,
A
W
A_W
AW全精度输出宽度。
Hilbert Transform
以希尔伯特变换的输出位宽计算为例。
理想的希尔伯特变换为正频率提供90度的相移,为负频率提供-90度的相移。该频域特性对应的脉冲响应是奇对称的,并且具有交错的零值。如下图所示。
希尔伯特变换器接受一个实值输入信号,并产生一个复数(I,Q)输出信号。输出信号的正交(Q)分量由FIR滤波器产生,其脉冲响应如上图所示。同相(I)分量是输入信号延迟适当周期后的信号,以补偿用于产生Q分量输出的滤波过程中的相位延迟。在下图中,
x
(
n
)
x(n)
x(n)为实值输入信号,
y
I
(
n
)
\text{y}_I(n)
yI(n)和
y
Q
(
n
)
\text{y}_Q(n)
yQ(n)分别为同相输出和正交输出。
利用交错零值和负对称特性,可将实现结构转换如下图所示结构。
注意到,输入输出的tdata总线中的数据都被符号拓展为8位边界,(在Config channel中的tdata总线中,则是填充零以到8位边界)。
coe系数文件如下:
radix=10;
coefdata=-1167,0,-342,0,-395,0,-451,0,-519,0,-595,0,-682,0,-784,0,-906,0,-1054,0,-1237,0,-1470,0,-1781,0,-2223,0,-2906,0,-4119,0,-6922,0,-20849,0,20849,0,6922,0,4119,0,2906,0,2223,0,1781,0,1470,0,1237,0,1054,0,906,0,784,0,682,0,595,0,519,0,451,0,395,0,342,0,1167;
FIR IP核Summary如下:
上图中的输入数据宽度
D
W
D_W
DW为16,系数个数
N
N
N为71,系数宽度
C
W
C_W
CW为16,根据前述计算公式计算出的位增长数
B
B
B为17,则全精度输出宽度
A
W
A_W
AW为16+17=33,符合IP核的计算结果。
m_axis_data_tdata的宽度等于:16(I路,只是延迟故位数不变) + 33(Q路,16+17=33) + 7(符合拓展至8位边界) = 56 。符合IP核计算结果。
参考资料:官方文档PG149-FIR-Compiler v7.2